达博功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能,
直连提供者
在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连模式,将以服务接口为单位,忽略注册中心的提供者列表, 接口配置点对点,不影响B接口从注册中心获取列表(说明:官方只建议开发和测试环境使用该功能),用法如下,url指定的地址就是直连地址:
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用,用法如下:
利用达博该特性,我们能够实现一些功能的灰度发布,实现步骤如下:
接口旧的实现定义version=" 1.0.0 ",接口新的实现version=" 2.0.0 "
消费者端定义version=" * "
这样定义提供者和使用者后,新旧接口实现各承担50%的流量;
利用达博该特性,还能完成不兼容版本迁移:
在低压力时间段,先升级一半提供者为新版本;
再将所有消费者升级为新版本;
然后将剩下的一半提供者升级为新版本。
回声测试
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService 即可使用,使用方式(demoService是弹簧管理的bean)
EchoService EchoService=(EchoService) demoService;
System.out.println (EchoService。美元回波(“hello”)),
隐式参数
可以通过RpcContext的setAttachment()和getAttachment () 在消费者和提供者之间进行参数的隐式传递,例如控制器层拦截登录令牌,把根据令牌得到的memberId传给达博服务就能使用隐式参数传递的方式,setAttachment()设置的 KV对,在完成一次远程调用会被清空,即多次远程调用要多次设置。使用方式:
1。服务端设置:
RpcContext.getContext ()。setAttachment (“CRT_MEMBER_ID”、“13828886888”);
2。客户端得到:
RpcContext.getContext () .getAttachment (CRT_MEMBER_ID)
上下文
上下文中存放的是当前调用过程中所需的环境信息。所有配置信息都将转换为URL的参数
RpcContext是一个ThreadLocal的临时状态记录器,当接收到RPC请求,或发起RPC请求时,RpcContext 的状态
都会变化,例如:A调B, B再调C,则B机器上,在B调C之前,RpcContext记录的是A调的信息,在B调 C
之后,RpcContext记录的是B C调的信息。使用方式:
布尔isConsumerSide=RpcContext.getContext () .isConsumerSide ();
本地伪装
本地伪装通常用于服务降级,例如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过模拟数据
返回授权失败。使用方式如下,模拟指定的实现类在提供者抛出RpcException异常时执行(一定要抛出RpcException异常才执行),取代远程返回结果:
DemoServiceMock实现源码:
公共类DemoServiceMock实现DemoService {
公共字符串sayHello(字符串名称){
返回“mock-value”;
}
}
泛化调用
泛化接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有的POJO 均用映射表示,通常用于框架集成,例如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。使用方式:
调用源码:
/* *
* @author afei
* @version 1.0.0
* @since 2017年11月22日
*/
公共类主要{
公共静态void Main (String [] args) {
//引?远程服务,该实例封装了所有与注册中?及服务提供吗?连接,请缓存
ReferenceConfig参考=new ReferenceConfig ();
//弱类型接名
reference.setInterface (“com.alibaba.dubbo.demo.DemoService”);
reference.setVersion (“1.0.0);
//声明为泛化接口
reference.setGeneric(真正);
//com.alibaba.dubbo.rpc.service。GenericService可以替代所有接口引用
GenericService GenericService=reference.get ();
//基本类型以及日期列表,地图等不需要转换,直接调用
=GenericService对象的结果。调用美元(“sayYes”、新String [] {" . lang。字符串"},新对象[]{afei "});
system . out。println(“结果——比;“+结果);
//映射表示POJO参数,如果返回值为POJO也将自动转成地图
地图老师=new HashMap ();
老师。put (" id ", " 1 ");
老师。把(“名字”,“admin”);
老师。把(“年龄”、“18”);