概念:
dubbo是分布式服务框架
1、高性能和透明化的RPC远程服务调用方案
2、soa服务治理方案
能做些什么:
1、透明化的远程方法调用
2、软负载均衡及容错机制
3、服务自动注册与发现
原理:
dubbo注册中心,监控中心,服务端在启动的时候会向注册中心发送自己提供的服务。dubbo客户端在启动的时候会从注册中心订阅到自己所用的服务地址列表缓存到本地,出现变更的时候会推送服务地址列表。针对于客户端跟服务端,dubbo会有监控中心来监控系统运行。

dubbo-rpc基本功能
1、基本功能-配置继承
实际中服务端提供者比消费端更清楚一个方法的执行时间,是否允许重试等信息,所以增加允许服务提供者为消费者设置缺省值,并采用继承风 格:服务点->注册中心->客户端
2、可编程配置
就是在xml文件里配置暴露服务 客户端引用服务配置。不解释。
暴露服务配置:
<bean id="xxxService" class="com.*****seviceimpl"></bean> 服务实现
<dubbo:application name="morgan" /> 当前配置名称
<dubbo:registry address="" username="" password="" /> 注册中心配置
<dubbo:provider protocol="dubbo" port="1232" threads="200" /> 服务提供者协议
<dubbo:service interface="com.alibba.xx.xxService" version="1.0.0" ref="xxxService" /> 服务器提供者暴露服务配置
引用服务配置:
<dubbo:application name="kylin" /> 当前服务名称
<dubbo:registry address=“” username /> 注册中心配置
<dubbo:consumer timeout="5000" retries="2" />
<dubbo:reference id="xxService" interface="com.ablibaba.xx.xxService" version="10.0" />
3、服务分组
当一个接口有多种实现,用groups区分
服务提供者
<dubbo:service groups="feedback" interface="com.....server"/>
<dubbo:service groups="member" interface="com.....server"/>
服务消费者
<dubbo:reference id="fservcie" groups="feedback" interface="com.....server"/>
<dubbo:mference id="fservcie" groups="feedback" interface="com.....server"/>
4、指定调用
点对点直连/指定调用需求 (开发、测试环境)
4.1 spring配置
<dubbo:reference interface="com.xxxxservice" url="dubbo://localhsot:20890" />
4.2 java -d参数方式
java -Dcom.alibaba.xxxservcei=dubbo://localhost:21312
4.3 映射文件
java -Ddubbo.resolve.file=xxx.properties
com.alibb.xxxservere=dubbo://localhost:23324
4.4 路由方式(future)
参数匹配 host ,clssifier
4.5 修改version -不推荐
5、只订阅
公用注册中心,开发人员的机器上的服务提供者被误调用
<dubbo:registry register="false" />
6、集群容错
cluster 消费者可以设置多种连接方式,failover failfast failsafe failback forking
集群容错模式介绍:
failover cluster : 失败自动切换,当出现失败,重试其他服务器 (缺省) 通常用于读操作,重试会带来更长的延迟,通过retries=“2”来设置 重试次数。
failfast cluster : 快速失败,只发起一次调用,失败立即报错。通常用于非幂等性写操作,比如新增记录
failsafe cluster : 失败安全,出现异常时,直接忽略,通常写入审计日志操作。
failback cluster: 失败自动回复,后台记录失败请求,定时重发, 通常用于消息通知操作。
forking cluster : 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求高的读操作。但需要浪费更多的服务资源。可通过 forks=2来设置最大并行数。
broadcast cluster: 广播调用所有提供者,做个调用,任意一台报错则报错。 2.1.0开始支持,通常用于通知所有提供者更新缓存或日志等本地 资源信息。重试次数配置。
7、负载均衡
dubbo提供了多重均衡策略,缺省为random随机调用:
均衡策略:
random loadBalance : 随机,按权重设置随机概率,有利于动态调整提供者权重。
roundRobin loadBalance: 轮询,按公约后的权重设置轮询比率。存在慢的提供者累计请求的问题,比如:第二台机器很慢,但没挂,当请求 阻塞到第二台时,所有请求都卡在第二台。
LeastActive LoadBalance : 最少活跃调用数,相同活跃数的随机,活跃数指的是调用后的记数差。慢的提供者时间差越大,越少接受请求。
ConsistentHash LoadBalance: 一致性hash,相同参数的请求中式发送到同一个提供者。当提供者挂掉之后,基于虚拟节点,平摊到其他提 供者。
8、多协议
不同服务不同协议:大数据用短链接协议,小数据大并发用长链接协议。
dubbo协议:
默认协议,单一长链接和nio异步通讯,适合于小数据量大并发的服务调用,以及服务消费者数远大于服务提供者机器数的情况。
不适合传送大数据量的的服务,比如文件,视频等。dubbo缺省谢羽亿每个服务,提供者 消费者使用单一长连接,如果数据量较大,可以使用 多个链接:
<dubbo: protocol name="dubbo" connetions="2"/> 0表示使用JVM共享长连接,1独立一个长链接,2 独立两个长链接。
为防止被大量链接城主,刻在服务提供方限制最多接受的连接数。
<dubbo:protocol name = "dubbo" accepts = "1000" /> |
采用阻塞式短连接和JDK标准化序列化方式。
9、多注册中心引用
定义多个注册中心:
<dubbo:registry id="chinaRegistry" address="172..0.0.0:8080" />
<dubbo:registry id="intlRegistry" address="172..0.0.0:8080" />
不同的注册中心使用不同的引用:
<dubbo:reference id="xxService" interface="com.alibaba.xx.xservice" version="1.0.0" registry="chinaRegistry" />
10,泛化调用
什么情况下需要使用到泛化调用,服务端消费者并没有服务的接口,不知道方法的入参,返回类型的情况下,跨语言调用。使用泛化。
泛化基本上是在消费端进行配置的。
消费端配置:
<dubbo:reference id="easyCommonService" interface="org.bazinga.service.EasyCommonService" generic="true"/>
测试类:
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
- "spring-dubbo-consumer-generic.xml");
- context.start();
- GenericService easyCommonService = (GenericService) context.getBean("easyCommonService");
- Object result = easyCommonService.$invoke("helloService", new String[] { "java.lang.String" }, new Object[] { "hello" });
- System.out.println(result);
11,stub 本地存根
消费者进行一次远程调用之后把这一次生成的远程对象的proxy进行缓存,再次调用的时候使用这个缓存的proxy来调用。主要是在提供方配置。

配置文件:
- <!-- 暴露服务、开启存根 -->
- <dubbo:service interface="com.tyf.d_zk_provider.modelService"
- ref="modelService"
- stub="com.tyf.d_zk_provider.sub_modelServiceImpl"/>
- <bean id="modelService" class="com.tyf.d_zk_provider.modelServiceImpl" />
12、mock 本地伪装
通常用于服务降级。服务提供方暴露的接口可能在被消费者调用的时候因为一些网络或者其他因素而调用失败而抛出的rpcException异常,抛出的异常可能会引起后续调用,可以给暴露的接口在消费端开启mock。
分两种情况。
a.只想忽略异常,在引用服务的时候设置mock 为return null。既调用方发生异常时直接忽略异常调用结果 直接返回null值。
b.想忽略异常的同时返回数据,在引用服务的时候mock设置为一个bean,这个bean实现暴露的接口方法来返回一个容错数据。
消费者 配置文件:
- <dubbo:reference id="modelService"
- interface="com.tyf.d_zk_provider.modelService"
- mock="com.tyf.d_zk_provider.mock_modelService"
- check="false"
- />
消费者 调用
- // 获取远程服务代理
- modelService service = (modelService)context.getBean("modelService");
- // 远程调用
- service.serviceTest("data");
消费者 mock实现:
- public class mock_modelService implements modelService {
- //返回容错数据
- public person serviceTest(String data) {
- //System.out.println("提供者的本地伪装调用");
- return new person("容错数据", "容错数据");
- }
- }
一方面假如应用需要预加载缓存或者其他预热活动。另一个方面阻止spring死锁。
- 延迟到spring加载完毕之后暴露服务<dubbo:service deplay="-1">
- 延迟5秒暴露服务<dubbo:service deplay="5000">
14、隐试传参
检验权限扩展点需要携带一些用户凭证信息:
RpcContext.setAttachchment('password',"xxx");
RpcContent.getAttachchment('password');
15、流量控制
actives:Consument 并发数限制
executes: Provider并发数上限
connections: Consumer的连接数
accepts:Provider的连接上限 短链接是链接上限,长连接是启用的连接数。
LeastActive loadBalance,调用并发数最小的Provider.