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目前是越来越活,更详细的使用可以去进一步的研究官方网站,而由于有中文,所以,看起来就很节省一部分力气了。

原文地址:https://www.cnblogs.com/eric-fang/p/11316557.html