Dubbo一文入门
一、简介
系统的架构,已从最早的单体式架构(一个war包完事)逐渐发展到目前的微服务式架构。微服务,将一个大型的复杂的应用系统,拆分成若干独立的松耦合的小的服务工程,每个服务工程可独立部署,每个服务只需要关注一类任务即可。微服务式架构目前比较代表性的技术有:Dubbo、SpringCloud等。
Dubbo 最初由阿里巴巴开发使用,后捐献给Apache基金会。Dubbo基于Spring容器运行,提供了面向接口的远程方法调用。官方网站:http://dubbo.apache.org/zh-cn/
Dubbo的框架结构如下:
1、Registry
注册中心,是用于发布和订阅服务的一个平台。官方推荐注册中心 ZooKeeper。注册中心ZooKeeper集群搭建详见:https://www.cnblogs.com/eric-fang/p/9283904.html
(1)发布:服务端开发完毕,将服务的相关信息公开出去。公开的信息包括:服务端所在机器地址、接口名、方法、方法参数、返回、超时时间等。
(2)订阅:客户端从注册中心去获取公开的服务信息
2、consumer
服务的消费者,也即客户端程序。
3、Provider
服务提供者,也即服务端程序
4、Container
服务端运行容器。Dubbo默认依赖Spring容器启动
5、Monitor
监控中心。Dubbo提供的一个jar工程。主要功能是监控统计服务端和客户端的相关使用数据的,比如:服务端多少接口、多少方法,调用次数等。客户端调用哪些服务接口、次数等
6、管理控制台admin
Dubbo提供一个war工程,用于实现Dubbo 服务端和客户端的管理,比如:集群负载、均衡策略。服务端可用性等。
二、Dubbo的服务发布与订阅
Dubbo的开发中,接口推荐的是单独建立个工程,这样便于服务实现的对外透明化,消费端直接依赖接口工程即可。
详细示例代码详见 github:https://github.com/qiuhan00/dubbo
其中,服务提供者注册后,zookeeper中显示如下:
消费者注册信息:
三、服务打包发布
通常,推荐的服务启动方式为Dubbo框架默认提供的 Main 类启动,其中考虑了Dubbo的高级特性以及异常处理,并且实现优雅关机。但是注意的是,Main类启动扫描的Spring配置文件的路径为:/META-INF/spring/*.xml。
1、使用assembly打包服务
将代码打成 jar 包,并提供相应的启动文件,比如 start.sh等。执行启动脚本,自动加载执行Main类中的main方法。
此种方式的打包,需要修改maven配置,新增打包插件,并且install功能也会修改。
2、assembly打包服务步骤(下述中相关配置文件,详见 github:https://github.com/qiuhan00/dubbo)
(i)新建assembly文件夹,在assembly文件夹中,提供assembly.xml配置文件
(ii)修改maven配置文件:提供指定打包配置
(iii)执行 maven clean install。将会在target目录中生成tar.gz的压缩文件,解压后,执行bin目录中相应的启动文件即可:windows中start.bat,linux中start.sh
四、Dubbo admin管理控制台服务
老版本的Dubbo发布包中,有个DubboAdmin管理控制台项目,可打包成war,放到tomcat中运行。最新的Dubbo,已经抽出该控制台项目,发布正式版0.1,前后端分离技术,前端采用Vue,后端采用SpringBoot,发布可以使用 jar 运行启动,也可以前后端单独部署运行。相比较而言,新版本的控制台对于开发人员特别是后端程序员不是太友好,工具这东西,还是简单快捷点比较好。
下面基于老版本的war包部署管理控制台应用,将war包复制到tomcat中webapps目录下,修改工程中的WEB-INF/dubbo.properties配置文件:
# 注册中心位置. 配置格式为: 协议://IP:port访问. 可以传递参数. dubbo.registry.address=zookeeper://111.231.51.200:2181?backup=1111.231.51.200:2182,111.231.51.200:2183 # 设定监控中心访问用户. # dubbo.admin.用户名.password=密码 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
注意,tomcat在每次启动的时候,都会去解压webapps目录中的war包文件,所以,第一次修改启动完成后,必须删除相应的war包。
tomcat启动完成后,使用 http://localhost:8080/dubboadmin/ 访问,输入上面配置的用户名密码即可,出现下面画面即为启动成功
可以很清晰的看出,目前应用数、提供者、消费者统计数信息。具体使用,在服务治理中有很多具体的子项目,可以自己尝试使用。
五、Dubbo Monitor监控中心
用于监控在dubbo开发的接口暴露,注册情况,也可以看接口的调用明细,调用时间等。监控中心挂掉并不会影响生成者和消费者。
六、集群与负载均衡
Dubbo本身支持服务的集群部署,无需其他特殊处理。只需要相同的服务接口注册多份,即实现集群。每个服务应用必须唯一性协议访问标识,即 ip + port的唯一性。
集群即是为了避免单点故障导致的系统不可用,那么集群必然的需要提供集群的容错性配置。Dubbo提供了多种容错性配置,默认是failover失败转移。
1、节点信息
Invoker : 是provider的一个可调用的service抽象,封装了provider的地址信息和接口信息
Directory:是Invoker的集合,根据注册中心推送的注册信息动态变更
Cluster:封装层,将集群的多个Invoker伪装成一个Invoker,对外层透明(外部看起来就是一个服务提供方,无需关注具体调用哪个环境的)。集群的容错逻辑机在此进行
Router:从多个Invoker按照路由规则选出子集
LoadBalance:负责从多个Invoker中选出一个用于本次的调用处理,此过程包含了负载均衡算法。
2、集群配置
2.1、集群配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,所以一般不推荐使用。
2.2、配置cluster标签属性:
cluster标签属性可选值:failover、failfast、failsafe、failback、forking。默认值为failover。
(i)failover :失败转移。当调用过程失败后,自动转移调用其他的服务。通常用于读操作。重试会影响调用的效率。重试可通过属性retries来进行配置。retries的默认值为2,即最多重试2次(不包含首次调用,即最多会发生3次调用)
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="2" loadbalance="roundrobin"></dubbo:service>
或者可以再具体到方法:
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover"> <dubbo:method name="sayHello" retries="2" loadbalance="roundrobin"></dubbo:method> </dubbo:service>
(ii)failfast:快速失败。只调用一次,失败即报错。通常,用于非幂等性操作,比如用户新增。配置方法及修改 cluster="failfast"
(iii)failsafe:失败安全。调用过程,出现异常,直接忽略。
(iiii)failback:失败回复。调用过程失败的话,后台自动记录失败请求并定时重发。
forking:并行调用多个服务,只要一个返回即认为调用成功。可通过forks="2"来设置并行请求数
3、负载均衡配置
3.1、负载均衡配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,一般不推荐使用。
3.2、配置loadbalance标签属性:
loadbalance标签属性可选值:random、roundrobin、leastactive、consistenthash。默认值为random。
(i)random:随机,按权重设置随机几率。权重可以通过管理控制台即时调整或者通过标签weight属性来进行设置
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="2" loadbalance="random"></dubbo:service>
或者可以再具体到方法:
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover"> <dubbo:method name="sayHello" retries="2" loadbalance="random"></dubbo:method> </dubbo:service>
(ii)RoundRobin:轮询,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求第二台时就卡在那,久而久之,所有请求都卡在调到第二台上
(iii)LeastActive:最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
(iiii)ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
七、高级特性
1、服务启动时检查(消费者配置)
Dubbo默认在启动的时候会检查依赖的服务是否可用,不可用时会抛出 java.lang.IllegalStateException :No provider available的异常,以便生产上线时候,能及早的发现问题。默认check="true"。
可通过check="false"关闭检查,开发测试的时候,如果依赖的部分服务不可用时,可关闭检查保证应用的正常启动。如果应用中Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,必须关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false"
,总是会返回引用,当服务恢复时,能自动连上。
推荐配置方式:
<dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false"/>
2、直连提供者
开发测试过程中,可能需要绕过注册中心,直接测试指定的服务提供者,这时候,可配置点对点直连调用,忽略注册中心中的服务提供者列表。
配置方式:
<dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false" url="dubbo://172.31.31.2:20881"/>
3、服务只订阅只注册
3.1、只订阅
通常一个应用可以即是服务的提供方也是服务的订阅者,当正在测试调试某服务接口的时候,如果注册到了注册中心中去,可能会导致服务消费的不正常。所以,此时,可以设置只订阅服务而不进行注册发布服务,配合直连测试正在开发的服务。
配置方式为:
<dubbo:registry address="111.231.51.200:2181,111.231.51.200:2182,111.231.51.200:2183" protocol="zookeeper" register="false"></dubbo:registry>
3.2、只注册
说太多不如一张图来的直接明了:
推荐配置方式为:
<dubbo:registry id="Registry1" address="111.231.51.200:2181" /> <dubbo:registry id="Registry2" address="111.231.51.200:2185" subscribe="false" />
八、配置文件高级属性定义
1、version版本
定义服务的版本。推荐使用三个位数来表示,如1.0.0、1.0.1等。通常在服务的不断升级过程中,用于多版本服务的兼容。消费者配置中的version必须与服务提供方保持一致,否则会报错 may be version or group mismatch。推荐配置如下:
<!-- 服务提供者 --> <dubbo:service interface="IA" ref="a" version="1.0.0" /> <!-- 服务消费 --> <dubbo:reference interface="IA" id="consumer" version="1.0.0" />
2、group服务分组
当一个服务接口有多个服务接口实现类的时候,可以使用服务接口分组来定义。比如接口 IA 有实现A1和A2
那么服务提供者配置如下:
<dubbo:service interface="IA" ref="com.xxx.xxx.A1" group="g1" /> <dubbo:service interface="IA" ref="com.xxx.xxx.A2" group="g2" />
服务消费者配置:
<dubbo:reference interface="IA" group="g1" id="consumer1" /> <dubbo:reference interface="IA" group="g2" id="consumer2" />
3、retries调用重试
dubbo,调用服务可以自动重试多次,默认的重试次数为 2(加上初始调用,也就是最多3次)。推荐配置见上面的集群配置failover中。一般,重试用于幂等的查询操作中,而在增删改中建议将重试次数retreis设置为0。
九、总结
简单的介绍了Dubbo的使用配置过程,Dubbo目前是越来越活,更详细的使用可以去进一步的研究官方网站,而由于有中文,所以,看起来就很节省一部分力气了。