Dubbo |ˈdʌbəʊ| 是阿里下的一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案的开源框架。算法
1.1. RPC须要解决的问题spring
1.1.1. 通信问题api
主要是经过在客户端和服务器之间创建TCP链接,远程过程调用的全部交换的数据都在这个链接里传输。链接能够是按需链接,调用结束后就断掉,也能够是长链接,多个远程过程调用共享同一个链接。缓存
1.1.2. 寻址问题服务器
A服务器上的应用怎么告诉底层的RPC框架,如何链接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。好比基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。若是是RMI调用的话,还须要一个RMI Registry来注册服务的地址。网络
1.1.3. 序列化与反序列化架构
当A服务器上的应用发起远程过程调用时,方法的参数须要经过底层的网络协议如TCP传递到B服务器,因为网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),经过寻址和传输将序列化的二进制发送给B服务器。并发
同理,B服务器接收参数要将参数反序列化。B服务器应用调用本身的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要通过反序列化的过程。app
2.2. Dubbo注册中心负载均衡
Ø Multicast注册中心
Ø Zookeeper注册中心
Ø Redis注册中心
Ø Simple注册中心
2.3. 协议
Dubbo缺省协议采用单一长链接和NIO异步通信,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的状况。
<dubbo:protocol name="dubbo" port="20880" />
URL格式:
dubbo://username:password@host:port/path?key=value&key=value
Ø 透明化的远程方法调用,就像调用本地方法同样调用远程方法,只需简单配置,没有任何API侵入。
Ø 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,下降成本,减小单点。
Ø 服务自动注册与发现,再也不须要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,而且可以平滑添加或删除服务提供者。
Ø 服务接口监控与治理
Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不一样应用的不一样接口,能够进行 多版本,多协议,多注册中心管理。
4.1. 在Provider上尽可能多配置Consumer端属性
Ø timeout 方法调用超时
Ø retries 失败重试次数,缺省是2(表示加上第一次调用,会调用3次)
Ø loadbalance 负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。还能够有轮询(roundrobin)、最不活跃优先(leastactive,指从Consumer端并发调用最好的Provider,能够减小的反应慢的Provider的调用,由于反应更容易累积并发的调用)
Ø actives 消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。 在方法上配置(dubbo:method)则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。
4.2. Provider上配置合理的Provider端属性
Ø threads 服务线程池大小
Ø executes 一个服务提供者并行执行请求上限,即当Provider对一个服务的并发调用到上限后,新调用会Wait(Consumer可能到超时)。在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。
4.3. 配置上Dubbo缓存文件
提供者列表缓存文件
<dubbo:registry file=”${user.home}/output/dubbo.cache” />
4.4. 配置优先级
Ø 方法级优先,接口级次之,全局配置再次之。
Ø 若是级别同样,则消费方优先,提供方次之。
4.5. 推荐XML配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="ops-provider"/>
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 设置服务方统一参数 -->
<dubbo:provider timeout="60000" retries="0" accesslog="true"/>
<!-- 声明须要暴露的服务接口 -->
<dubbo:service interface="com.**.api.UserInfoService" ref="userInfoService"/>
</beans>
一、接口尽量大粒度,接口中的方法不要以业务流程来,这个流程尽可能在方法逻辑中调用,接口应表明一个完整的功能对外提供;
二、接口应以业务为单位,业务相近的进行抽象,避免接口数量爆炸
三、参数先作校验,在传入接口。
四、要作到在设计接口时,已经肯定这个接口职责、预测调用频率
一、启动检查
在启动某服务时,先检查该服务所依赖的服务是否可用,不可用则抛出异常,以便上线时,能及早发现问题,默认check=“true”;
二、负载均衡
针对某一方法在db管控台进行配置
负载算法:随机(Random LoadBalance)、轮循(RoundRobin)、最少活跃调用数(LeastActive ,越活跃接收请求的几率越大)、一致性hash(ConsistentHash )
三、线程模型:threadpool threads
最大线程数计算方式 ulimit -u命令计算服务器可执行最大线程数
四、只订阅
只订阅服务,本身不注册,例如该服务正在测试,先不能向zk中注册避免其余服务调用它报错
五、只注册
只注册服务,不订阅;应用在集群中该服务器上无该服务须要调用的服务,就让他只注册,指定调用其它服务器上的可用服务