1、启动时检查

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=”true”。

但是,有的时候,我们并不是都需要启动时就检查的,比如测试的时候,我们是需要更快速的启动,所以,这种场景的时候,我们是需要关闭这个功能的。
下面,我们看看如何使用这个功能。

在服务端注册的时候(客户端注册时同样适用);

  1. <dubbo:registry protocol="zookeeper"
  2. address="localhost:2181,localhost:2182,localhost:2183" check="false"/>

在客户端引用服务端服务的时候;

<dubbo:reference check="false" id="providerService"
    interface="com.yuanzi.dubbo.provider.service.ProviderService"/>

2、集群容错

dubbo 也是支持集群容错的,同时也有很多可选的方案,其中,默认的方案是 failover,也就是重试机制。
首先,我们先把所有的容错机制都整理一遍,然后再看看使用。

集群模式 说明 场景
Failover Cluster 失败自动切换,当出现失败,重试其它服务器。 通常用于读操作,但重试会带来更长延迟。可通过 retries=”2” 来设置重试次数(不含第一次)。
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。 通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。 通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=”2” 来设置最大并行数。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。 通常用于通知所有提供者更新缓存或日志等本地资源信息。

使用实例
在发布服务或者引用服务的时候设置

<!--服务发布的配置,需要暴露的服务接口-->
    <dubbo:service cluster="failover" retries="2"
            interface="com.yuanzi.dubbo.provider.service.ProviderService"
            ref="providerService"/>
<dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
         interface="com.yuanzi.dubbo.provider.service.ProviderService"/>

3、负载均衡

负载均衡想必是一个再熟悉不过的概念了,所以,dubbo 支持也是再正常不过了,
这里也总结一下 dubbo 支持的负载均衡的一些方案及使用方法。

负载均衡模式 说明 使用方法
Random LoadBalance 随机 按权重设置随机概率 xxx:负载均衡方法
RoundRobin LoadBalance 轮询 按公约后的权重设置轮询比率。
LeastActive LoadBalance 最少活跃调用数 相同活跃数的随机,活跃数指调用前后计数差。
ConsistentHash LoadBalance 一致性 Hash 相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

4、直连提供者

在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,
所以,这种情况下,我们只需要直接连接服务端的地即可,
其实,这种方法在前面的讲解已经使用到了,第一种讲解的方式就是这种方式,因为这种方式简单。
使用

<dubbo:reference id="providerService"                     
    interface="com.yuanzi.dubbo.provider.service.ProviderService"       
    url="dubbo://192.168.234.1:20880/com.yuanzi.dubbo.provider.service.ProviderService"/>

说明:可以看到,只要在消费端在 dubbo:reference 节点使用 url 给出服务端的方法即可。


5、只订阅

只订阅就是只能够订阅服务端的服务,而不能够注册。
引用官方的使用场景如下:

为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。
可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。

<dubbo:registry register="false" protocol="zookeeper" 
    address="localhost:2181,localhost:2182,localhost:2183" check="false"/>

① 使用只订阅方式
当在服务提供端使用 register=”false” 的时候,我们使用下面的方式获取服务端的服务;

<dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
      interface="com.yuanzi.dubbo.provider.service.ProviderService"/>

启动信息

消费端调用不了
image.png

② 不使用只订阅方式

<dubbo:registry protocol="zookeeper" 
    address="localhost:2181,localhost:2182,localhost:2183" check="false"/>

发现,这时候并不是向注册中心 zookeeper 注册,而只是做了发布服务和启动netty。


6、只注册

只注册正好跟前面的只订阅相反,这个时候可以向注册中心注册,但是,消费端却不能够读到服务。

应用场景

如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。

使用说明
<dubbo:registry subscribe="false" address="localhost:2181"></dubbo:registry>

在服务端的 dubbo:registry 节点下使用 subscribe=”false” 来声明这个服务是只注册的服务。
这个时候消费端调用的时候是不能调用的。
image.png


7、多协议机制

在前面我们使用的协议都是 dubbo 协议,但是 dubbo 除了支持这种协议外还支持其他的协议,
比如,rmi、hessian等,另外,而且还可以用多种协议同时暴露一种服务。

通信协议 说明
dubbo:// tcp长连接
rmi:// tcp短连接
hessian:// http短连接
webservice:// http段连接
thrift:// Thrift是FaceBook捐给Apache的一个RPC框架
grpc:// 谷歌的grpc, 支持HTTP/2通信
redis:// Redis是一个高效的KV存储服务器
memcahed:// memcahed是一个高效的KV存储服务器
rest:// JAX-RS 2.0实现的rest调用

使用方法
① 一种接口使用一种协议
先声明多种协议

 <!--当前服务发布所依赖的协议;webserovice、Thrift、Hessain、http-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <dubbo:protocol name="rmi" port="1099" />

然后在发布接口的时候使用具体协议

<!--服务发布的配置,需要暴露的服务接口-->
    <dubbo:service cluster="failover" retries="2"
            interface="com.yuanzi.dubbo.provider.service.ProviderService"
            ref="providerService"/>
    <dubbo:service cluster="failover" retries="2"
                   interface="com.yuanzi.dubbo.provider.service.ProviderService"
                   ref="providerService" protocol="rmi"/>


在输出日志中,就可以找到rmi发布的接口。
rmi://192.168.234.1:1099/com.yuanzi.dubbo.provider.service.ProviderService?anyhost=true&application=provider&bean.name=com.sihai.dubbo.provider.service.ProviderService&cluster=failover&dubbo=2.0.2&generic=false&interface=com.sihai.dubbo.provider.service.ProviderService&methods=SayHello&owner=sihai&pid=796&retries=2&side=provider&timestamp=1564281053185, dubbo version: 2.6.6, current host: 192.168.234.1

② 一种接口使用多种协议
声明协议和上面的方式一样,在发布接口的时候有一点不一样。

<dubbo:service cluster="failover" retries="2"
                   interface="com.yuanzi.dubbo.provider.service.ProviderService"
                   ref="providerService" protocol="rmi,dubbo"/>

说明:protocol属性,可以用,隔开,使用多种协议。


8、多注册中心

Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,
甚至可以同时引用注册在不同注册中心上的同名服务。

服务端多注册中心发布服务

一个服务可以在不同的注册中心注册,当一个注册中心出现问题时,可以用其他的注册中心。

注册

<!--多注册中心-->
<dubbo:registry protocol="zookeeper" id="reg1" timeout="10000" address="localhost:2181"/>
<dubbo:registry protocol="zookeeper" id="reg2" timeout="10000" address="localhost:2182"/>
<dubbo:registry protocol="zookeeper" id="reg3" timeout="10000" address="localhost:2183"/>

发布服务

<!--服务发布的配置,需要暴露的服务接口-->
    <dubbo:service cluster="failover" retries="2"
            interface="com.yuanzi.dubbo.provider.service.ProviderService"
            ref="providerService" registry="reg1"/>
    <dubbo:service cluster="failover" retries="2"
                   interface="com.yuanzi.dubbo.provider.service.ProviderService"
                   ref="providerService" protocol="rmi" registry="reg2"/>


说明:使用registry=”reg2”指定该接口使用的注册中心,同时也可以使用多个,用,隔开,例如,registry=”reg1,,reg2”。

消费端多注册中心引用服务

首先,先向不同注册中心注册;

<!--多注册中心-->
<dubbo:registry protocol="zookeeper" id="reg1" timeout="10000" address="localhost:2181"/>
<dubbo:registry protocol="zookeeper" id="reg2" timeout="10000" address="localhost:2182"/>
<dubbo:registry protocol="zookeeper" id="reg3" timeout="10000" address="localhost:2183"/>


其次,不同的消费端服务引用使用不同的注册中心;

!--不同的服务使用不同的注册中心-->
    <dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
                     interface="com.yuanzi.dubbo.provider.service.ProviderService" registry="reg1"/>
    <dubbo:reference cluster="failover" retries="2" check="false" id="providerService2"
                     interface="com.yuanzi.dubbo.provider.service.ProviderService" registry="reg2"/>

说明:上面分别使用注册中心1和注册中心2。


9、多版本

不同的服务是有版本不同的,版本可以更新并且升级,同时,不同的版本之间是不可以调用的。

<!--服务发布的配置,需要暴露的服务接口-->
    <dubbo:service cluster="failover" retries="2"
            interface="com.yuanzi.dubbo.provider.service.ProviderService"
            ref="providerService" registry="reg1" version="1.0"/>
    <dubbo:service cluster="failover" retries="2"
                   interface="com.sihai.dubbo.provider.service.ProviderService"
                   ref="providerService"  registry="reg1" version="1.1"/>

加入了版本控制。


10、日志管理

dubbo 也可以将日志信息记录或者保存到文件中的。

① 使用accesslog输出到log4j

<dubbo:protocol accesslog="true" name="dubbo" port="20880"/>
    <dubbo:protocol accesslog="true" name="rmi" port="1099" />


② 输出到文件

<dubbo:protocol accesslog="http://localhost/log.txt" name="dubbo" port="20880"/>
    <dubbo:protocol accesslog="http://localhost/log2.txt" name="rmi" port="1099" />