grpc-spring 通信(选型,grpc-ecosystem/grpc-spring)

server/2024/11/14 15:19:11/

需求

需要一个在稳定网络环境里高性能且开发和部署成本较小,且多平台,且对视频传输和消息订阅和推送的支持比较好的, 一套环境

先说结论因为结论先得到的, 问AI了, 发现一个新东西gRPC ,看了下非常好。
再说过程,首先存在订阅和推送的场景所以传统的http/1.1就都不行,之前做过前台的长连接来实现页面实时k线图,百度的一个什么前台插件,忘了。一来讨厌前端二来gRPC基于的http/2.0 原生支持这些场景,甚至发视频的时候每个视频帧的通信都不需要客户端返回,貌似能节省最多一半的cpu和网络时间。

github上找了springboot + gRPC的项目

https://github.com/grpc-ecosystem/grpc-spring/

开始

Gradle用来替代maven,正如maven替代Ant,没用过。Srping 不太会用不喜欢
git clone https://github.com/grpc-ecosystem/grpc-spring.git

运行例子
文档里是
./gradlew :example:local-grpc-server:bootRun
老子找了半天example来自哪,找不到。试了下
./gradlew :examples:local-grpc-server:bootRun
深感震惊,居然可以
./gradlew :exa:local-grpc-server:bootRun
也可以,荒唐
AI说

在Gradle中,可以使用拼写不完整的单词进行任务或配置的原因是其基于Groovy的领域特定语言(DSL)具有高度灵活性和容错能力

易用性过高导致严谨性没有了, 我去搜exa是期望找到些东西的,但其实他可以代表examples。这是不可接受的
幂等原则的类似,不同的命令不应该有同样的输出,一一对应是最严谨的

约定大于配置是个非常的,过于提高易用性的东西,提高了学习成本,必然你得知道约定了什么,而配置就可以没有学习成本,遇到的东西都已经配置好了,全局搜索就可以明白所有东西。我讨厌约定
感觉到了之前玩nodejs的痛苦经历,为了照顾新手把东西都弄得看起来很简单,把东西都封起来张三李四王二麻子全都搞一个封装 规则 约定,github里完全找不到两个用同一套工具的项目,乱成一锅粥。好像最佳实践这样的东西不存在一样

我觉得优秀的工具或者框架,应该不看文档只看两个例子就可以完全上手整套流程,文档只需要一些枚举值
现在很多甚至主流的工具,来用我吧用我你就可以当白痴也能开发,还能比别人写的代码少就能完成一样的功能,
但是你原理都不明白成了某个工具使用者而不是开发。写个helloworld打包一个G,
这不好,开发是要解决所有问题的,任何一个环节的的问题,如何能这样呢,是你了解所有东西,一个G的helloworld你不可能了解,他有问题了你完全解决不了
触类旁通是一个可能最重要的能力,但工具使用者做不到。精通一个东西从内到外,才能解锁这个能力,浮于表面看不到本质是没有用的

spring开了这个头,万恶之首,追踪代码变成了很难的事,把一个准确的严肃的东西变成了卖弄雕虫小技


吐槽归吐槽,也不能因为不好用不喜欢就不用他,开始玩,不,折腾他

./gradlew tasks --all 可以看到所有命令,太多的话可以
./gradlew :ex:local-grpc-server:tasks 可以看到某个moudle下的命令

bootRun是 spring-boot-gradle-plugin 提供的
bootJar就可以生成 可以直接 java -jar xx.jar 运行的jar了。
生成目录:\local-grpc-server\build\libs

idea里gradle的配置
在这里插入图片描述
没看怎么配置镜像仓库,梯子直接连美国完事,
build完成后
在这里插入图片描述
这个窗口才会有内容,原来以为maven的这个优点居然没继承,看了下比maven的好

gRPC使用proto是为了通信的java input output对象的序列化 (google自家的)
如何编写.proto文件:

https://protobuf.dev/programming-guides/proto3/

编辑 .proto 之后执行 generateProto 得到一堆java文件

build命令报错

https://cloud.tencent.com/developer/article/1764107

代码里的空格报错方块问号。 改了之后空格报错为· ,之后把那段注释删掉,报错里还有那段注释。 (看吧,这就是不严谨的结果) (执行build有个提示Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.)
build不通过,直接bootRun ,跑起来了,bootRun会把以来的task都先跑了,没跑build 看来build已经不在生命周期里了,但idea的插件里tasks列表里还有这个命令。那就不管他

这是一个常识,写的简单易懂

https://blog.51cto.com/u_16099230/10254798
但是抄袭嫌疑
https://www.baeldung.com/java-grpc-streaming

至此

例子跑通了

是最简单的一问一答 , http/1.1完全可以做的
在这里插入图片描述

  1. 运行命令2,3
  2. 打开 client 用@RequestMapping(“/”) 暴露的http://localhost:8080/
  3. 通信成功

开始写steam的例子

Server streaming RPC

新增 .proto

syntax = "proto3";option java_multiple_files = true;
option java_package = "net.devh.boot.grpc.examples.lib";
option java_outer_classname = "SteamTransferProto";service SteamTransfer {//订阅某个传感器的观测值 监视rpc monitor (MonitorRequest) returns (stream MonitorReply) {}
}message MonitorRequest {int32 monitSomeThing = 1;
}message MonitorReply {int32 observedValue = 1;
}

服务端一秒返回一次,15次之后结束

java">@GrpcService
public class StreamTransferServerService extends SteamTransferGrpc.SteamTransferImplBase {@Overridepublic void monitor(MonitorRequest req, StreamObserver<MonitorReply> responseObserver) {int a = req.getMonitSomeThing();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i<15;i++ ) {if (null != responseObserver) {responseObserver.onNext(MonitorReply.newBuilder().setObservedValue(i +new Random().nextInt(10)).build());System.out.println("send to client");}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}responseObserver.onCompleted();}}).start();}
}

客户端

java">    @GrpcClient("local-grpc-server")private SteamTransferGrpc.SteamTransferStub steamTransferStub;public int steamTransfer(int one){steamTransferStub.monitor(MonitorRequest.newBuilder().setMonitSomeThing(one).build(), new StreamObserver<MonitorReply>() {@Overridepublic void onNext(MonitorReply value) {System.out.println(Thread.currentThread().getName() + " observer value: " + value.getObservedValue());}@Overridepublic void onError(Throwable t) {System.out.println("error:" + t.getLocalizedMessage());}@Overridepublic void onCompleted() {System.out.println("onCompleted:");}});return 1;}

Client streaming RPC

暂时用不着


http://www.ppmy.cn/server/109878.html

相关文章

【GPT】Coze使用开放平台接口-【2】创建工作流-语音伪造检测工作流

在Coze使用开放平台接口-【1】创建插件&#xff0c;我们已经成功创建了开放平台的插件&#xff0c;也创建了对应的工具。本文档就根据创建好的插件&#xff0c;来创建对应的工作流&#xff0c;来让接口能够用起来。 下面直接用现成的插件快商通AI开放平台&#xff0c;来创建语音…

MFC工控项目实例之七点击下拉菜单弹出对话框

承接专栏《MFC工控项目实例之六CFile添加菜单栏》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { ...afx_msg void OnTypeManage(); ... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BEGIN_MESSAGE_MAP(CSEAL_PRESSUREDlg, CDialog)//…

3127.构造相同颜色的正方形

1.题目描述 给你一个二维 3 x 3 的矩阵 grid &#xff0c;每个格子都是一个字符&#xff0c;要么是 B &#xff0c;要么是 W 。字符 W 表示白色&#xff0c;字符 B 表示黑色。 你的任务是改变 至多一个 格子的颜色&#xff0c;使得矩阵中存在一个 2 x 2 颜色完全相同的正方形。…

Linux开放防火墙端口

目录 一、使用 firewalld 开启端口二、使用 iptables 开启端口 在 Kylin Linux 上&#xff0c;开启防火墙端口的步骤与其他 Linux 发行版类似。如果 Kylin Linux 使用 firewalld&#xff08;这在许多基于 CentOS 或 RHEL 的发行版上是默认的&#xff09;&#xff0c;你可以按照…

Spring高手之路22——AOP切面类的封装与解析

文章目录 1. AOP是如何收集切面类并封装的&#xff1f;2. Advisor 是什么&#xff0c;它是怎么构建的&#xff1f;2.1 什么是 Advisor2.2 Advisor 的构建&#xff08;源码分析时序图说明&#xff09; 3. TargetSource 的构建和作用3.1 TargetSource 的作用3.2 TargetSource 的构…

分片结果转发: _process_prompt ;if shard.start_layer != 0: 说明不是处理prompt的

目录 分片结果转发: _process_prompt if shard.start_layer != 0: 说明不是处理prompt的 参数 方法体 注意事项 EXO是串行方式的算力共享架构 分片结果转发: _process_prompt 这段代码定义了一个名为 _process_prompt 的异步方法,它属于某个类(尽管类的定义在这段…

基于yolov8的篮球计数检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的篮球计数检测系统是一种高效、精准的目标检测技术&#xff0c;专为篮球比赛中的篮球计数而设计。该系统利用YOLOv8这一先进的深度学习算法&#xff0c;通过实时分析比赛视频或图像&#xff0c;能够迅速且准确地识别并计数篮球的数量。 YOLOv8作为YO…

pythonnet-C#调用python脚本-含matplotlib+biopython

本地环境&#xff1a; win10&#xff0c;.NET Core 6&#xff0c;Python 3.9.13&#xff0c;pythonnet 3.0.3 测试的包&#xff1a;biopython 1.82&#xff0c;matplotlib 3.5.2 参考&#xff1a; GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Py…