dubbo参数回调的使用与思考

2,469 阅读2分钟

1 背景

在查看dubbo官方文档过程中,发现dubbo支持参数回调,可以允许服务端调用客户端,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理;

参数回调方式与调用本地 callback 或 listener 相同,只需要在 Spring 的配置文件中声明哪个参数是 callback 类型即可。Dubbo 将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑

2 意义

可以用回调函数通知客户端执行结果,或发送通知,在方法执行时间比较长时,有些类似异步调用,比如在审批工作流中回调客户端审批结果 那有人问:直接在服务端执行结束时主动调用客户端,不回调行不行? 回调接口时写在服务端的服务导出jar包中的,如果不依赖回调,需要服务端在依赖客户端的jar包,存在循环依赖的问题,而参数回调还有一个好处,就是可以由客户端决定服务端调用的回调函数,由服务端主导,变为客户端主导

3 实现例子

话不多说直接看代码 依赖环境

  • java 1.8
  • IntellJ IDEA
  • maven
  • optimus(souche) 2.0
  • springBoot 2.0.6
  • DUBBO 2.8.6

服务生产者

public interface CallbackService {
    void addListener(String key, CallbackListener listener);
}
public interface CallbackListener extends Serializable {
    void changed(String msg);
}

看实现类

这里踩了个小坑 在springBoot中使用dubbo,用注解@Servic是没办法配置下一级method,这里引入了个dubbo.xml

使用ImportResource在boot中引入xml配置

服务消费者

执行效果: 在服务消费者调用服务生产者的addListener后,在客户端打印出callback1:Date

4demo后的思考,使用场景

服务端先把回调接口配置好,回调逻辑代码写好,要出一份文档,文档包括回调逻辑,什么情况会执行回调,以及回调函数编写的注意点,文档地址一起打包进服务导出的jar中,后续多个服务消费者,根据文档,编写自己的回调函数;以免出现沟通问题导致生产故障