欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

dubbo新手学习之事件通知实践教程

程序员文章站 2022-03-25 23:18:33
前言今天主要给大家分享一下dubbo的事件通知机制。先看下dubbo中文官网的示例解释:。在调用之前、调用之后、出现异常时,会触发 oninvoke、onreturn、onthrow 三个事件,可以配...

前言

今天主要给大家分享一下dubbo的事件通知机制。

先看下dubbo中文官网的示例解释:。

在调用之前、调用之后、出现异常时,会触发 oninvoke、onreturn、onthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法.

实践

溪源目的是快速学习dubbo的相关机制,故定义的相同的接口和方法,采用分包的方式解耦合,便于后期维护。
先看服务接口

dubbo-demo-interface

目录如图

dubbo新手学习之事件通知实践教程**

usernotifyservice **

dubbo-demo-xml-provider

目录如下

dubbo新手学习之事件通知实践教程 

notify-provider.xml

定义一个新的配置文件,用于配置事件通知相关bean。

dubbo新手学习之事件通知实践教程

usernotifyserviceimpl

providerapplication

dubbo-demo-xml-consumer 目录如下

dubbo新手学习之事件通知实践教程 

consumernotifyservice

扩展点

1. oninvoke方法:
 必须具有与真实的被调用方法sayhello相同的入参列表:例如,oninvoke(string name)
2. onreturn方法:
 2.1 至少要有一个入参且第一个入参必须与getusername的返回类型相同,接收返回结果:例如,onreturnwithoutparam(string result);
 2.2 可以有多个参数,多个参数的情况下,第一个后边的所有参数都是用来接收getusername入参的:例如, onreturn(string result, string name)
3. onthrow方法:
 3.1 至少要有一个入参且第一个入参类型为throwable或其子类,接收返回结果;例如,onthrow(throwable ex);
 3.2 可以有多个参数,多个参数的情况下,第一个后边的所有参数都是用来接收getusername入参的:例如,onthrow(throwable ex, string name);
4. 如果是consumer在调用provider的过程中,出现异常时不会走onthrow方法的,onthrow方法只会在provider返回的rpcresult中含有exception对象时,才会执行。(dubbo中下层服务的exception会被放在响应rpcresult的exception对象中传递给上层服务)

对于上面的解释,大家可能会存在疑惑,部分方法要求第一个参数为服务接口的返回值类型???约定大于配置???揭开迷底的方法就是debug源码设计实现逻辑~

源代码:

consumernotifyserviceimpl

notify-consumer.xml

同理,消费者端也新建notify-consumer.xml文件,具体配置如图:

dubbo新手学习之事件通知实践教程

consumerapplication

运行

分别启动生产者和消费者,运行结果如图:

分别执行了oninvoke方法和onreturn方法

dubbo新手学习之事件通知实践教程

源码

关于dubbo的事件通知机制,源码实现基本上位于futurefilter类中,先给大家贴一下类方法目录:

dubbo新手学习之事件通知实践教程

上面溪源提到为什么部分方法要约定第一个参数与接口方法返回值类型保持一致呢?下面揭开迷底,我们进入firereturncallback方法

事件通知机制,底层实际上利用了反射机制实现类方法的调用。

溪源初次接触dubbo本地存根机制,如文中存在错误之处,希望大家及时指正!

源码传送门:https://github.com/stream-source/dubbo/tree/master/dubbo-demo

总结

到此这篇关于dubbo新手学习之事件通知实践教程的文章就介绍到这了,更多相关dubbo事件通知内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!