dubbo功能非常完善 , 很多时候我们不需要重复造轮子 , 下面列举一些你不一定知道 , 但是很好用的功能;
![Dubbo框架的一些很好用的点,80%程序员还不知道](http://img.jiangsulong.com/220410/0555005958-0.jpg)
文章插图
直连Provider在开发及测试环境下 , 可能需要绕过注册中心 , 只测试指定服务提供者 , 这时候可能需要点对点直连 , 点对点直连模式 , 将以服务接口为单位 , 忽略注册中心的提供者列表 , A 接口配置点对点 , 不影响 B 接口从注册中心获取列表(说明:官方只建议开发&测试环境使用该功能) , 用法如下 , url指定的地址就是直连地址:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" url="dubbo://172.18.1.205:20888/" />
多版本当一个接口实现 , 出现不兼容升级时 , 可以用版本号过渡 , 版本号不同的服务相互间不引用 , 用法如下:<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0" />
利用dubbo该特性 , 我们能够实现一些功能的灰度发布 , 实现步骤如下:- 接口旧的实现定义version="1.0.0" , 接口新的实现version="2.0.0"
- Consumer端定义version="*"
利用dubbo该特性 , 还能完成不兼容版本迁移:
- 在低压力时间段 , 先升级一半Provider为新版本;
- 再将所有消费者升级为新版本;
- 然后将剩下的一半提供者升级为新版本 。
所有服务自动实现EchoService接口 , 只需将任意服务引用强制转型为EchoService 即可使用 , 使用方式(demoService是spring管理的bean)
EchoService echoService = (EchoService) demoService;System.out.println(echoService.$echo("hello"));
隐式参数可以通过 RpcContext 的 setAttachment() 和 getAttachment() 在Consumer和Provider之间进行参数的隐式传递 , 例如Controller层拦截登录token , 把根据token得到的memberId传给dubbo服务就能使用隐式参数传递的方式 , setAttachment()设置的 KV 对 , 在完成一次远程调用会被清空 , 即多次远程调用要多次设置 。使用方式:1.服务端set:
RpcContext.getContext().setAttachment("CRT_MEMBER_ID", "13828886888");
2.客户端get:RpcContext.getContext().getAttachment("CRT_MEMBER_ID")
上下文上下文中存放的是当前调用过程中所需的环境信息 。所有配置信息都将转换为 URL 的参数RpcContext 是一个 ThreadLocal 的临时状态记录器 , 当接收到 RPC 请求 , 或发起 RPC 请求时 , RpcContext 的状态
都会变化 。例如:A 调 B , B 再调 C , 则 B 机器上 , 在 B 调 C 之前 , RpcContext 记录的是 A 调 B 的信息 , 在 B 调 C
之后 , RpcContext 记录的是 B 调 C 的信息 。使用方式:
boolean isConsumerSide = RpcContext.getContext().isConsumerSide();
本地伪装本地伪装通常用于服务降级 , 例如某验权服务 , 当服务提供方全部挂掉后 , 客户端不抛出异常 , 而是通过 Mock 数据返回授权失败 。使用方式如下 , mock指定的实现类在Provider抛出RpcException异常时执行(一定要抛出RpcException异常才执行) , 取代远程返回结果:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>
DemoServiceMock实现源码:public class DemoServiceMock implements DemoService {public String sayHello(String name) {return "mock-value";}}
泛化调用泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况 , 参数及返回值中的所有 POJO 均用Map表示 , 通常用于框架集成 , 例如:实现一个通用的服务测试框架 , 可通过GenericService调用所有服务实现 。使用方式:
推荐阅读
- WordPress建站的那些坑,别再踩了
- C 语言和 C++、C# 的区别在什么地方?
- 一些长时间GC停顿问题的排查及解决办法
- Google收录排名网页的四个过程
- 大学|大专生抢走名校高材生的机会,引来围观网友愤怒质疑:你配吗?
- 客厅挂灰色的窗帘好吗,客厅适合什么材质的窗帘
- 阳台花园装修设计技巧
- 电饭煲内胆的价格清单
- 探探暗恋短信是真的吗还知道名字 探探暗恋短信是真的吗?揭秘探探匿名暗恋表白是什么
- 展会搭建装修的小技巧