Dubbo 原理与部署
微服务架构在企业开发中应用越来越广泛,而 Alibaba Dubbo 代表国内微服务框架的最高成就,在国内有广泛的应用。本文讲述了 Dubbo 要解决的问题、现状和架构原理,注册中心/提供者/消费者的实现方法,以及服务治理控制台的部署与使用。
作者:王克锋
出处:https://kefeng.wang/2017/12/10/dubbo-deploy/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。
1.服务架构的演进
1.1 单应用架构
一站式单应用架构。
1.2 Nginx 架构
用户浏览器(相当于 Consumer) <==> Nginx <==> 服务后端(相当于 Provider)
- 用户浏览器: 以 HTTP 形式向 Nginx 发出请求;
- Nginx: 以域名方式提供给用户浏览器,把进来的 HTTP 请求,负载均衡地转发给服务后端,再把服务后端的响应回传给用户浏览器;
- 服务后端: 提供 HTTP 接口,并实现内部功能。
这种服务分散在各系统中,缺陷体现在:
- 不便观察各 provider/consumer 信息、状态、调用统计;
- 不便灵活地对 provider 进入管理、维护和扩展。
1.3 微服务架构
将单一应用程序拆分为多个功能独立的服务,各个服务以独立进程运行,服务之间互相调用(以RPC、REST API等方式),最终实现整个业务功能。各个微服务之间是松耦合,可独立选型和开发,可独立部署,可独立扩展。
- 服务注册中心: 替换了 Nginx 转发者的地位,用来登记了各个服务提供者的地址;
- 服务提供者: 提供服务调用接口,并向注册中心登记服务地址;
- 服务消费者: 向注册中心订阅服务,能实时获得最新的服务地址列表,再直接调用服务提供者;
- 监控系统: 查看各服务的提供者和消费者的信息和统计。
相关名词解释:服务的路由
:consumer 通过 serviceName,查找要调用的服务的地址的过程;服务的负载均衡
:从服务的地址列表中,按照一定的算法和规则,选取一个地址来用来调用;服务配置中心
:统一管理服务名称和对应地址列表信息的服务,提供的功能包括注册和查询;
1.3.1 Dubbo 概要
官网: dubbo.apache.org,用户文档
Dubbo[ˈdʌbəʊ] 读音近似于 Double[ˈdʌbl],是阿里巴巴基于Java的高性能RPC框架。
Dubbo 采用 Apache License 2.0 开源协议,它是一个商业友好的协议,可以免费用于非开源的商业软件中。也可以对它进行改造和二次发布,只要求保留阿里的著作权,并在再发布时保留原始许可声明。
微服务框架使用情况:国内公司大多使用 Dubbo,阿里内部除淘系以外的其它阿里子公司,都在使用Dubbo,包括中文主站、国际主站、AliExpress、阿里云、阿里金融、阿里学院、良无限、来往等,而外部公司有京东、当当、携程、去哪儿、搜狐、南方航空、中软国际、软通动力、吉利汽车、方正证劵、海尔、焦点科技、中润四方、华新水泥、海康威视、各大电信运营商、网易考拉等; 阿里淘系使用 HSF;国外更多是使用 Spring Could。
Dubbo 提供三个关键功能,包括基于接口的远程调用,容错和负载均衡,以及自动服务注册和发现。Dubbo 只实现了服务治理,只提供 RPC 调用,而Dubbox(当当基于Dubbo扩展,也停止维护)实现更高效的 RPC 和 REST API。该框架推荐以 ZooKeeper 作为注册中心。
Dubbo 流程图:
1.3.2 Dubbo 与 HSF 比较
两者都是阿里巴巴的 RPC 框架,Dubbo 是第一代,由B2B团队开发,是开源的(荣获 2016 年度中国开源软件 Top10);而 HSF(High Speed Framework,好舒服) 是新一代,由淘宝团队开发,没有开源,由于与阿里巴巴内部框架耦合较多,外部公司并不适用。
对比点 | Dubbo 优点 | HSF 缺点 |
---|---|---|
Dubbo部署方式更轻量 | Dubbo没有任何要求,可运行在任何Java环境中 | HSF要求使用指定的JBoss等容器,还需要在JBoss等容器中加入sar包扩展,对用户运行环境的侵入性大。如果你要运行在Weblogic或Websphere等其它容器上,需要自行扩展容器以兼容HSF的ClassLoader加载 |
Dubbo扩展性更好 | Dubbo 很方便二次开发,一个框架不可能覆盖所有需求,Dubbo始终保持平等对待第三方理念,即所有功能,都可以在不修改Dubbo原生代码的情况下,在外围扩展,包括Dubbo自己内置的功能,也和第三方一样,是通过扩展的方式实现的 | HSF如果你要加功能或替换某部分实现是很困难的,比如支付宝和淘宝用的就是不同的HSF分支,因为加功能时改了核心代码,不得不拷一个分支单独发展,HSF现阶段就算开源出来,也很难复用,除非对架构重写 |
HSF依赖较多内部系统 | Dubbo为每个系统的集成都留出了扩展点,并已梳理干清所有依赖,同时为开源社区提供了替代方案,用户可以直接使用 | HSF依赖较多内部系统,比如配置中心,通知中心,监控中心,单点登录等等,如果要开源还需要做很多剥离工作 |
Dubbo功能更多 | 除了ClassLoader隔离,Dubbo基本上是HSF的超集,Dubbo也支持更多协议,更多注册中心的集成,以适应更多的网站架构。 | - |
1.3.3 微服务架构的优劣
1.3.3.1 微服务的优势
- 独立开发:组件之间的开发互不依赖;
- 独立部署: 组件部署互不依赖,而且发布风险小;
- 可伸缩性: 可根据各个组件负荷,有灵活地为个别组件增加实例数或硬件资源;
- 可重用性: 组件功能独立,可供更多业务使用。
1.3.3.2 微服务的劣势
- 开发的复杂性增加: 所开发组件或业务,依赖于其他组件,需要连接其他服务器,业务逻辑比单机应用复杂;
- 运维的复杂性增加: 相比管理单应用,管理成千上百的服务,出问题的风险更大;
理论上服务可以单独部署,但服务之间的相互依赖关系,必须部署一系列微服务作为一个组服务,需要管理协同工作的各版本组件 - 通信失败重试逻辑复杂: 异步模式使系统状态更复杂;
- 版本控制可能很难: 特定版本的组件才能协作成功,一个组件的版本升级可能影响其他组件;
- 分布式事务: 跨组件的事务复杂。
1.3.3.3 选用微服务的依据
1.3.4 Dubbo 版本历史
参考: https://mvnrepository.com/artifact/com.alibaba/dubbo
- 2011年12月: 2.0.10(开源,开始频繁更新)
- 2012年10月: 2.5.3(之后五年未更新)
- 2017年 9月: 2.5.4(重新频繁更新)
- 2018年 1月: 2.6.0(当前最新版本)
1.3.5 Dubbo 参考资料
开源首页: Github 上 Dubbo 开源首页;
官方示例: Dubbo 官方提供的示例;
用户手册: 适用人群为借助 Dubbo 开发业务工程的开发者;
源码手册: 适用人群为 Dubbo 自身源码研究者或开发者;
管理手册: 适用人群为借助 Dubbo 开发业务工程的管理员;
用户总结: 国外用户对 Dubbo 的总结。
2.部署服务注册中心(Zookeeper)
详见文章 ZooKeeper 原理与集群部署
在配置文件 conf/zoo.cfg 中设置监控端口号(参数 clientPort)
启动服务:zookeeper-3.4.9\bin\zkServer{1,2,3}.cmd
服务启动后,监听地址为 localhost:{2181,2182,2183}
3.部署服务提供者和消费者
详见文章 Dubbo 提供者与消费者的实现
实现之后,同一服务提供者、同一服务消费者,都可以部署为多个节点。
4.Dubbo 管理控制台
参考 http://dubbo.apache.org/#!/docs/admin/ops/dubbo-ops.md?lang=zh-cn
由于所用注册中心为 ZooKeeper,没有界面,不便看到当前各个服务和它们的提供者、消费者,无法对它们进行管理,dubbo-admin 正是要解决这些问题。
不要使用网上别人编译出来的 war 文件(因为打包所用JDK版本很可能与你的环境JDK不兼容,导致无法启动),建议自己下载 Dubbo 源码编译(而且这并不复杂)。
4.1 下载源码
1 | wget https://github.com/alibaba/dubbo/archive/dubbo-2.6.0.zip |
4.2 编译源码
编译前,文件 ./dubbo-admin/pom.xml 中要明确指定 maven-war-plugin/2.6
否则会默认使用版本 maven-war-plugin/2.2 而报错:ClassNotFoundException: com.thoughtworks.xstream.io.HierarchicalStreamDriver
1
2
3
4
5
6
7
8
9<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
</plugin>
</plugins>
</build>
编译源码,并解压 war 包至 Tomcat 目录下:1
2
3
4cd dubbo-dubbo-2.6.0/dubbo-admin
mvn clean package -Dmaven.test.skip=true
unzip -q target/dubbo-admin-*.war -d $CATALINA_BASE/webapps/dubbo-admin/
# "C:\Program Files\WinRAR\WinRAR.exe" x target\dubbo-admin-*.war %CATALINA_HOME%\webapps\dubbo-admin\
4.3 修改配置
Linux环境: $CATALINA_BASE/webapps/dubbo-admin/WEB-INF/dubbo.properties
Windows环境: %CATALINA_HOME%\webapps\dubbo-admin\WEB-INF\dubbo.properties
指定注册中心地址(ZooKeeper),指定用户及其密码为:root/root123 或 guest/guest1231
2
3dubbo.registry.address=zookeeper://localhost:2181?backup=localhost:2182,localhost:2183
dubbo.admin.root.password=root123
dubbo.admin.guest.password=guest123
4.4 Dubbo 运维管理
参考 http://dubbo.apache.org/#!/docs/admin/ops/dubbo-ops.md?lang=zh-cn
重启 Tomcat,并打开 http://localhost:8080/dubbo-admin/
页面顶部可以修改界面语言为“简体中文”(默认为 English),功能包括:
- 搜索:根据服务名称/应用名称/机器IP
- 提供者:新增/复制、删除、编辑、启用/禁用、倍权/半权
- 消费者:编辑、允许/禁止(客户端将收到禁止访问的异常)、屏蔽(客户端直接返回空对象)、容错(客户端远程调用失败时返回空对象)
- 应用:包括提供者和消费者(可修改为屏蔽、容错)
- 路由规则:新增/复制(对于指定的服务和方法,当消费方满足指定过滤条件时,提供者的IP才会推送给消费方,以便接下来的远程调用)、删除、编辑、启用/禁用
- 动态配置:对于特定服务和消费者应用名称,只推送给指定的消费者地址;
- 访问控制:对于特定服务,允许或禁止某些地址的消费者使用;
- 权重调节:对于特定服务和提供者,指定其权重;
- 负载均衡:对于特定服务和方法,指定负载均衡策略(随机、轮询、最少并发);
- 负责人:对于特定服务,指定其负责人(dubbo-admin登录用户)。
- 查看系统环境:CPU、内存、操作系统、语言、JDK版本、注册中心(ZooKeeper)地址和版本
- 查看系统日志:dubbo-admin 的日志,对应于日志文件
$CATALINA_HOME/bin/dubbo-governance.log