Dubbo 配置

Dubbo 概述:

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。

主要核心部件:
Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制.
RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能
Registry: 服务目录框架用于服务的注册和服务事件发布和订阅

Dubbo 特性:

连通性:

    注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
    监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
    服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
    服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
    注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
    注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
    注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
    注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健状性:
    监控中心宕掉不影响使用,只是丢失部分采样数据
    数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
    注册中心对等集群,任意一台宕掉后,将自动切换到另一台
    注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
    服务提供者无状态,任意一台宕掉后,不影响使用
    服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性:
    注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
    服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

工作原理:




Provider:暴露服务方称之为“服务提供者”。
Consumer:调用远程服务方称之为“服务消费者”。
Registry:服务注册与发现的中心目录服务称之为“服务注册中心”。
Monitor:统计服务的调用次调和调用时间的日志服务称之为“服务监控中心”。


配置继承:

    服务提供者比消费者更清楚一个方法的执行时间,是否允许重试等信息,所以增加允许服务提供者为消费者设置缺省值,并采用继承风格





<dubbo:service/>服务配置,用于暴露服务
<dubbo:reference/>引用配置,用于创建一个远程服务代理
<dubbo:protocol/>协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
<dubbo:application/>应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者
<dubbo:module/>模块配置,用于配置当前模块信息,可选
<dubbo:registry/>注册中心配置,用于配置连接注册中心相关信息
<dubbo:monitor/>监控中心配置,用于配置连接监控中心相关信息,可选
<dubbo:provider/>提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选
<dubbo:consumer/>消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选
<dubbo:method/>方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息
<dubbo:argument/>用于指定方法参数配置



Dubbo 服务分组:

当一个接口有多种实现时,可以用group区分

服务提供者:
<dubbo:service group="feedback" interface="com.xxx.IndexService" />
<dubbo:service group="member" interface="com.xxx.IndexService" />

服务消费者:
<dubbo:reference id=“fservice" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id=“mservice" group="member" interface="com.xxx.IndexService" /> 

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用

服务提供者:
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<dubbo:service interface="com.foo.BarService" version="2.0.0" />

服务消费者:
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />

Dubbo 多协议:

配置通讯协议:

<dubbo:protocol name="dubbo" port="20880" serializaiton="hessian2" threads="100"
register="true" charset="UTF-8" threadpool="fixed" accepts="1000" server="netty"
client="netty" codes="dubbo"/>

name:协议名称,默认dubbo,支持rmi,hessian2,http,ws,thrift,memcached,redis
port:暴露服务的端口号
serialization:支持dubbo,hessian2,java,json,默认hessian2
register:该协议的服务是否注册到注册中心,默认true
threads:服务线程池大小
server:协议的服务端实现类型
client:协议的客户端实现类型
........



不同服务不同协议:

比如:不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议。
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />

同一服务多协议暴露:

比如:需要与http客户端互操作
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="hessian" port="8080" />
<!-- 使用多个协议暴露服务 -->
<dubbo:reference id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />

Dubbo 多注册中心:

定义多个注册中心:
<dubbo:registry id=“chinaRegistry” address="172.29.63.18:9090" />
<dubbo:registry id=“intlRegistry” address="172.29.61.132:9090" />

不同服务使用不同注册中心:
<!-- 向中文站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
<!-- 向国际站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />

不同注册中心使用不同引用:
<dubbo:reference id=“chinaXxxService” interface="com.alibaba.xxx.XxxService" version="1.0.0“ registry=“chinaRegistry” />
<dubbo:reference id=“intlXxxService” interface="com.alibaba.xxx.XxxService" version="1.0.0“ registry=“intlRegistry” />


启动时检查:

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

如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上

关闭某个服务的启动时检查:(没有提供者时报错)
<dubbo:reference interface="com.foo.BarService" check="false"/>

关闭所有服务的启动时检查:(没有提供者时报错)
<dubbo:consumer check="false"/>

关闭注册中心启动时检查:(注册订阅失败时报错)
<dubbo:registry check="false"/>

集群容错配置:

在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试





Failover Cluster:

失败自动切换,当出现失败,重试其它服务器。(缺省)
通常用于读操作,但重试会带来更长延迟。
可通过retries="2"来设置重试次数(不含第一次)。

Failfast Cluster:

快速失败,只发起一次调用,失败立即报错。
通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster:

失败安全,出现异常时,直接忽略。
通常用于写入审计日志等操作。

Failback Cluster:

失败自动恢复,后台记录失败请求,定时重发。
通常用于消息通知操作。

Forking Cluster:

并行调用多个服务器,只要一个成功即返回。
通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
可通过forks="2"来设置最大并行数。

Broadcast Cluster:

广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
通常用于通知所有提供者更新缓存或日志等本地资源信息。

<dubbo:service cluster="failsafe"/>

<dubbo:reference cluster="failsafe"/>



重试次数配置:


<dubbo:service retries="2"/>

<dubbo:reference retries="2"/>

<dubbo:reference>
   <dubbo:method name="findFoo" retries="2"/>
</dubbo:reference>


负载均衡配置:

在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用

Random LoadBalance:

随机,按权重设置随机概率

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重

RoundRobin LoadBalance:

轮循,按公约后的权重设置轮循比率

存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上

LeastActive LoadBalance:

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance:

一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

<dubbo:service interface="..." loadbalance="roundrobin"/>

<dubbo:reference interface="..." loadbalance="roundrobin"/>

<dubbo:service interface="...">
   <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>

<dubbo:reference interface="...">
   <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>










猜你喜欢

转载自maosheng.iteye.com/blog/2320346