来源:阿飞的博客


dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能。

直连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该特性,我们能够实现一些功能的灰度发布,实现步骤如下:

  1. 接口旧的实现定义version="1.0.0",接口新的实现version="2.0.0"

  2. Consumer端定义version="*"

这样定义Provider和Consumer后,新旧接口实现各承担50%的流量;

利用dubbo该特性,还能完成不兼容版本迁移:

  1. 在低压力时间段,先升级一半Provider为新版本;

  2. 再将所有消费者升级为新版本;

  3. 然后将剩下的一半提供者升级为新版本。

回声测试

回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
所有服务自动实现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");
  1. 客户端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调用所有服务实现。使用方式:

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>

调用源码:

/** * @author afei * @version 1.0.0 * @since 2017年11月22日 */public class Main {

    public static void main(String[] args) {        // 引⽤远程服务, 该实例⾥⾯封装了所有与注册中⼼及服务提供⽅连接,请缓存        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();        // 弱类型接⼝名        reference.setInterface("com.alibaba.dubbo.demo.DemoService");        reference.setVersion("1.0.0");        // 声明为泛化接⼝        reference.setGeneric(true);        // ⽤com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用⽤        GenericService genericService = reference.get();        // 基本类型以及Date,List,Map等不需要转换,直接调⽤        Object result = genericService.$invoke("sayYes", new String[] {"java.lang.String"}, new Object[] {"afei"});        System.out.println("result --> "+result);

        // ⽤Map表示POJO参数,如果返回值为POJO也将自动转成Map        Map<String, Object> teacher = new HashMap<String, Object>();        teacher.put("id", "1");        teacher.put("name", "admin");        teacher.put("age", "18");        teacher.put("level", "3");        teacher.put("remark", "测试");        // 如果返回POJO将自动转成Map        result = genericService.$invoke("justTest", new String[]                {"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher});        System.out.println("result --> "+result);    }}

访问日志

如果想记录每次请求信息,可开启访问日志,类似于Ngnix的访问日志。注意:此日志量比较大,请注意磁盘容量。使用方式(如果配置局部,全局访问日志就会失效):
配置全局:

<dubbo:provider accesslog="/app/dubbo-demo.log"/>

配置局部:

<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" accesslog="/app/demo.log"/>
<dubbo:service interface="com.alibaba.dubbo.demo.TestService" ref="testService" accesslog="/app/test.log"/>

日志格式样式:

[2017-11-22 10:23:20] 172.18.1.205:56144 -> 172.18.1.205:20886 - com.alibaba.dubbo.demo.DemoService:1.0.0 sayHello(java.lang.String) ["afei"]

延迟暴露

如果服务需要预热时间,比如初始化本地缓存,等待相关资源就位等,可以使用delay进行延迟暴露。使Dubbo在Spring容器初始化完后延迟多少毫秒再暴露服务,这个真的很有用。使用方式:

<dubbo:provider delay="5000"/>

或者:

<dubbo:service delay="5000" interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0"/>

号外:最近整理了之前编写的一系列内容做成了PDF,关注我并回复相应口令获取:

001 领取:《Spring Boot基础教程》

- 002 领取:《Spring Cloud基础教程》

更多内容陆续奉上,敬请期待 

- END -


我正在连载《Spring Cloud Alibaba基础教程》,关注我一起学习!当前已发布清单:

  • 使用Nacos实现服务注册与发现

  • 支持的几种服务消费方式

  • 使用Nacos作为配置中心

  • Nacos配置的加载规则详解

  • Nacos配置的多环境管理

  • Nacos配置的多文件加载与共享配置

  • Nacos的数据持久化

 近期热文:

  • 我为啥不看好ServiceMesh

  • 有赞搜索系统的架构演进

  • Spring Boot Actuator 的指标信息如何收集

  • 为什么分库分表后不建议跨分片查询

  • 别看不起分区表:我要为你点个赞

  • Spring Cloud Greenwich 正式发布

  • 在前后端分离的路上承受了多少痛?

  • 你真的会高效的在GitHub上搜索开源项目吗?

  • 中台是个什么鬼?

2019年,我在星球与大家聊聊

我们技术人的焦虑问题

分析原因、分享经验、参谋想法

如果您对这些感兴趣

就来一起讨论吧!

看完,赶紧点个“好看”鸭

点鸭点鸭

↓↓↓↓

dubbo:9个你不一定知道,但好用的功能相关推荐

  1. 源码分析Dubbo前置篇-寻找注册中心、服务提供者、服务消费者功能入口

    本节主要阐述如下两个问题:  1.Dubbo自定义标签实现.  2.dubbo通过Spring加载配置文件后,是如何触发注册中心.服务提供者.服务消费者按照Dubbo的设计执行相关的功能.  所谓的执 ...

  2. Dubbo+Flutter在线交友平台教程第三天 今日佳人功能实现

    课程说明 首页功能说明 系统架构说明 实现今日佳人功能 实现推荐用户的列表 接口增加缓存功能 整合前端联调测试 1.首页 在用户登录成功后,就会进入首页,首页中有今日佳人.推荐好友.探花.搜附近等功能 ...

  3. Dubbo+Flutter在线交友平台教程第十天 实现推荐功能

    课程说明 了解推荐系统 实现好友的推荐 圈子推荐功能说明 圈子推荐功能流程 圈子推荐功能的实现 小视频推荐功能的实现 1.了解推荐系统 1.1.什么是推荐系统? 为了解决信息过载和用户无明确需求的问题 ...

  4. Dubbo+Flutter在线交友平台教程第七天 完善消息功能以及个人主页

    课程说明 点赞消息列表 喜欢消息列表 评论消息列表 公告列表 个人主页 聊一下功能 谁看过我的功能 ​ 1.消息点赞.喜欢.评论列表 在消息模块中的点赞.喜欢.评论列表,是别人对自己发布的内容的操作, ...

  5. Dubbo 和 HSF 在阿里的实践:携手走向下一代云原生微服务

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者 |郭浩 审校 |钰莹 Dubbo 和 HSF 都是阿里巴巴目前在使用的微服务 RPC 框架.HSF 在阿里巴巴使用更多,承接了 ...

  6. JDK/Dubbo/Spring 三种 SPI 机制,谁更好?

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...

  7. dubbo 自定义过滤器,打印接口调用信息

    dubbo提供了web filter类似的com.alibaba.dubbo.rpc.Filter,这样,我们可以在dubbo提供的服务提供方和消费方都可以自定义过滤 器,从而可以获得方法调用的时间或 ...

  8. dubbo 即是服务提供者又是消费者_Dubbo详细介绍与安装使用过程

    1 Dubbo介绍 1.1 dubbox简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. ...

  9. Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kiri ...

  10. php dubbo 接口测试工具,dubbo服务自动化测试搭建

    java实现dubbo的消费者服务编写:ruby实现消费者服务的接口测试:通过消费者间接测试dubbo服务接口的逻辑 内容包括:dubbo服务本地调用环境搭建,dubbo服务启动,消费者部署,脚本编写 ...

最新文章

  1. linux主机释放cache和buffer
  2. Jquery的$命名冲突
  3. 1月12日,HTML学习笔记2
  4. 数据中心的未来:一体化无人值守
  5. mysql特性举例_MySQL事务的四大特性和隔离级别
  6. HDU 2159 FATE (DP 二维费用背包)
  7. 红旗linux 装xp,XP下硬盘安装红旗LINUX
  8. ubuntu16.04 离线安装docker ce
  9. 建立自动备份的维护计划
  10. centos上部署java环境
  11. 一个表格,一部分允许编辑,有公式的单元格不允许编辑
  12. 帮助小明翻译他的编程语言
  13. 如何用iMazing备份和恢复辐射避难所
  14. 10.可视化、可视分析、探索式数据分析
  15. 消息称微软Windows暂停接受华为新订单;2019 Q1 亚太区公有云IaaS、PaaS服务收入排名现已揭晓……...
  16. 地球轨道计算方法,开普勒三大定律的证明,补充-解析几何之椭圆
  17. MikroTik(RouteOS)有线路由器快速设置教程
  18. 【物联网】思科扔下数颗物联网重磅炸弹,中国IoT圈却选择集体视而不见!
  19. 苹果开发者账号注册第一步,Apple ID 的双重认证,为 Apple ID 设置双重认证
  20. 【二维码识别】基于matlab GUI灰度+二值化+校正二维码生成与识别【含Matlab源码 635期】

热门文章

  1. IntelliJ idea 缓存和索引 清理方法
  2. linux ubuntu ping命令安装
  3. EditPlus正则表达式
  4. 进程的用户栈和内核栈
  5. 实际用户ID,有效用户ID与保存设置用户ID
  6. kvm性能优化方案---cpu/内存/磁盘/网络
  7. 对频率论(Frequentist)方法和贝叶斯方法(Bayesian Methods)的一个总结
  8. linux 约等于符号,Mac OS X基础教程:特殊符号的快捷输入方式
  9. 访问外部扩展C语言编程,单片机C语言编程(系统扩展IC)8.ppt
  10. 算法 有两个相同大小数组均已按升序排列好 编程计算这两个数组的中位数 C