三分钟springboot整合dubbo3(二)(Triple协议与流式调用)

  • 1、Triple协议(粘贴官网)
  • 2、流式调用绍
  • 3、使用方式
    • 新增依赖
    • 配置文件
    • 代码演示
      • 3.1、ServerStream演示
      • 3.2、ClientStream演示
  • 4、总结

1、Triple协议(粘贴官网)

Triple 是 Dubbo3 提出的基于 HTTP2 的开放协议,旨在解决 Dubbo2 私有协议带来的互通性问题。大概意思就是上个版本主推的dubbo协议,有的系统不认识,但我用http协议,大家操作起来,你开心我开心,头不疼了吧,具体是啥我也不太清楚。

2、流式调用绍

我们正常接口调用都是一次调用,一次返回。而流式调用可以在一次调用中多次交互。

1、unary: 我们正常编写的接口,参数不含有StreamObserver类的那种,效果就是一次调用一次返回,即我发送请求 → 收到一次返回 → 接口调用结束

2、*ServerStream: 服务提供者可以分批次返回数据给消费者,消费者可以根据每次返回的数据单独处理。即:
消费者发送请求 → 提供者处理请求 → 提供者返回消息1 → 消费者处理消息1 → 提供者返回消息2 → 消费者处理消息2 → 提供者发送结束标记 → 消费者处理结束标记 → 消费者完成本次调用

3、*ClientStream: 消费者可以分批次发送数据,服务提供者分批次处理完数据。即:
消费者与提供者建立连接 → 消费者发送消息1 → 提供者处理消息1 → 消费者发送消息2 → 提供者处理消息2 → 消费者发送终止标记 → 提供者完成本次调用

4、BiStream: 就是ClientStream,叫法区别

3、使用方式

在上一篇文章搭建项目的基础上改进,主要多了两个位置
1、需要新引入的依赖支持
2、接口需要新的参数支持

新增依赖

<!-- 流式调用包 -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-common</artifactId><version>3.0.7</version>
</dependency>

配置文件

提供者与调用者就把端口和名字改了就好,协议填写的是tri,不是triple

server.port=8082
dubbo.application.name=02_consumer
dubbo.protocol.name=tri
dubbo.protocol.port=20880
dubbo.registry.address=zookeeper://localhost:2181

代码演示

3.1、ServerStream演示

重点是接口里需要传递的参数StreamObserver
生产者与消费者共用接口

public interface TestService {// SERVER_STAREAMdefault void say1(String name, StreamObserver<String> response){//不要在意,我就是个空方法}
}

生产者接口实现

@DubboService
public class TestServiceImpl implements TestService {@Overridepublic void say1(String name, StreamObserver<String> response) {// 第一次处理response.onNext("姓名检查中");System.out.println("姓名为" + name);// 可以处理多次if(null == name || "".equals(name.trim())){try {response.onError(new RuntimeException("用户不存在"));System.out.println("测试onError下面代码是否会继续执行");response.onError(new RuntimeException("用户真的不存在"));response.onNext("我喜欢王某");}catch (Exception e){System.out.println("但是我抛出了异常");}}else{response.onNext("欢迎您登录系统:" + name);}// 结束response.onCompleted();}
}

消费者调用接口

@RestController
public class TestController {@DubboReferenceprivate TestService testService ;@RequestMapping("/test")public String test(){userService.say1("", new StreamObserver<String>() {@Overridepublic void onNext(String data) {System.out.println("接收到" + data);}@Overridepublic void onError(Throwable throwable) {System.out.println("那边异常了");System.out.println(throwable.getMessage());}@Overridepublic void onCompleted() {System.out.println("那边结束了");}});System.out.println("测试这句话会不会输出");return "ok";}
}

当传递名称为空字符,提供者与调用者反馈得出结论(文字请对照上方代码)
say1()方法发送请求是异步的,因为文字→’测试这句话会不会输出’先于→’接收到姓名检查中’打印到控制台,代码可以断点自行测试。
onError()方法调用后,就无法向调用传递消息,再次调用onError()或onNext()会抛出异常,因为输出了→‘但是我抛出了异常’
调用者的onCompleted()不会执行,虽然提供者依然会调用onCompleted(),但是调用者的onCompleted()方法不会被触发

提供者输出:
姓名为
测试onError下面代码是否会继续执行
但是我抛出了异常
消费者输出:
测试这句话会不会输出
接收到姓名检查中
那边异常了
UNKNOWN : 用户不存在
java.lang.RuntimeException: 用户不存在
at com.xp.service.TestServiceImpl.say1(UserServiceImpl.java:29)

当传递名称为非空字符时,提供者与调用者反馈得出结论(文字请对照上方代码)
提供者未调用onError方法时,可以多次调用onNext() 向调用者传递消息,并且调用onCompleted() 会触发调用者的onCompleted()方法

提供者输出:
姓名为彼岸花
消费者输出:
测试这句话会不会输出
接收到姓名检查中
接收到欢迎您登录系统:彼岸花
那边结束了

3.2、ClientStream演示

重点是接口里需要传递的参数StreamObserver
生产者与消费者共用接口

public interface TestService {// CLIENT_STAREAMdefault StreamObserver<String> say2(StreamObserver<String> response){return response;}
}

生产者接口实现

@DubboService
public class TestServiceImpl implements TestService {@Overridepublic StreamObserver<String> say2(StreamObserver<String> response) {return new StreamObserver<String>() {@Overridepublic void onNext(String data) {System.out.println("收到信息:" + data);response.onNext("来自服务端的响应");}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted() {System.out.println("发送完成");response.onCompleted();}};}
}

消费者调用接口

@RestController
public class TestController {@DubboReferenceprivate TestService testService ;@RequestMapping("/test3")public String test3(){StreamObserver<String> so = userService.say2(new StreamObserver<String>() {@Overridepublic void onNext(String data) {System.out.println("调用者收到了来自服务端的信息->: " + data);}@Overridepublic void onError(Throwable throwable) {}@Overridepublic void onCompleted() {System.out.println("调用者..........->");}});so.onNext("zhangsan");so.onNext("lisi");so.onCompleted();return "ok";}
}

输出效果如下,消费者发送了三次消息,
第一次是"zhangsan",服务端收到了消息后,反馈了消息给客户端
第二次发送了“”“lisi”服务端收到了消息后,反馈了消息给客户端
第三次发送了终止标记,提供者触发了onCompleted()方法,并调用了对方的onCompleted()方法

服务提供者:
收到信息:zhangsan
收到信息:lisi
发送完成
服务消费者:
调用者收到了来自服务端的信息->: 来自服务端的响应
调用者收到了来自服务端的信息->: 来自服务端的响应
调用者…->

4、总结

ClientStream流: 调用服务端时传递了StreamObserver流过去,并收到了服务端返回的StreamObserver。双方可以通过该流互相给对方传递消息。就好比打电话一样,有来有往,你一句我一句。

ServerStream流:调用服务端时传递了StreamObserver流过去,服务端可以通过该流返回消息给调用者。就好比你把联系方式给了对方,对方通过联系方式可以向你发送消息,但是你没有对方联系方式,无法给对方反馈。

三分钟springboot整合dubbo3(二)(Triple协议流式调用)相关推荐

  1. Springboot 整合 Current-Limiting 实现接口限流

    该篇文章内容: 1.实现标题中提到的接口限流 2.使用压测工具jmeter给大家展现验证效果 第一部分,代码的实现 首先是导入依赖包: <dependency><groupId> ...

  2. Dubbo3的Triple协议踩坑记录

    Triple协议踩坑记录 Triple协议 Triple 协议是 Dubbo3 提出的基于 HTTP2 + gRPC 的开放协议,完整兼容 gRPC over HTTP/2,旨在解决 Dubbo2 私 ...

  3. springboot整合https和wss协议

    一.首先得明白什么是wss协议: 可以看这篇文章:WSS.SSL 和 https 之间的关系 二.接下来就是配置wss协议了(注意:tomcat搭建https的低版本支持高版本不支持) (1)先拿到s ...

  4. ElasticSearch(三)springboot整合ES

    最基础的整合: 一.maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactI ...

  5. springboot 整合dubbo3开发rest应用

    一.前言 作为微服务治理生态体系内的重要框架 dubbo,从出身到现在历经了十多年的市场检验而依旧火热,除了其自身优秀的设计,高性能的RPC性能,以及依托于springcloud-alibaba的这个 ...

  6. springboot整合微信二维码支付

    微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/api.shtml 下图是微信支付的一个流程图: 我们需要做的是: 1.调用 ...

  7. JavaWeb学习之路——SpringBoot整合Mybatis(二)

    1)pom文件中添加相应的jar包: <!--Mybatis启动器--><dependency><groupId>org.mybatis.spring.boot&l ...

  8. SpringBoot整合activiti7二:模型列表(创建,删除,修改,查询),直接上代码,清清楚楚

    一.创建流程模型name:模型名称,key:模型标识,category:分类,description:流程描述actModelService.create(name, key, description ...

  9. 三分钟手写RPC调用 (三)

    三分钟springboot整合dubbo3(三)(手写RPC调用) 1.设计思路 2.代码编写 3.总结 1.设计思路 1.启动一个springboot项目,定义一个简单的HelloWord程序,能通 ...

最新文章

  1. vue-router 的重定向-redirect
  2. 数组——两个有序数组的合并
  3. 【全球AI人才排行榜】美国第一,中国仅排名第7
  4. C++总结笔记(七)—— 运算符重载
  5. 屠呦呦3年后再上热搜:女先生,世无双!
  6. C/C++ OpenCV之Sobel边缘检测
  7. GridView中的全选操作(转)
  8. 大数据之-Hadoop3.x_MapReduce_ReduceTask源码解析---大数据之hadoop3.x工作笔记0127
  9. Eclipse 工程配置与目录结构及各种文件夹(常用插件)
  10. Android starting 4---四大组件之一---Activity入门
  11. 用命令行查看mysql,利用命令行查看Mysql数据库
  12. Html 返回顶部代码及注释说明
  13. android多开技术,多开常见配置 - 技术交流 - 逍遥安卓论坛 - Powered by Discuz!
  14. 求大于200的最小质数
  15. syn重发_疑难杂症之被丢弃的SYN包
  16. GSM与GPRS的区别
  17. java 汉字拼音排序_[转]Java汉字按照拼音排序
  18. 【Unicode编码表】UniCode编码表+转化器
  19. Install failed. Installation failed a href='rerun'Rerun/a
  20. 微信html5 支付接口,黄聪:详解申请微信h5支付方法,开通微信h5网页支付接口(转)...

热门文章

  1. C: warning C275: expression with possibly no effect
  2. Java ElasticSearch:(五)ElasticSearch 中的 mapping 问题
  3. 超级实用的动态时钟。
  4. 理解 Linux 配置文件
  5. DDT+BeautifulReport测试报告中用例描述修改
  6. pyx、pyd、so
  7. 用for循环语句打印三角形
  8. 循环语句中continue和break的使用
  9. css样式中的属性区分大小写吗,css属性区分大小写吗?
  10. APP数据同步到电脑