Dapr 运用之 Java gRPC 调用篇
JAVA GRPC 服务与调用
安装协议编译器
-
下载对应的版本编译器,并把路径加入到环境变量中,执行以下命令生成代码
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
-I
表示源码所在文件夹位置,--java_out
表示输出路径,空格后表示具体的 proto 文件位置,以下为示例命令protoc -I=C:\Users\JR\DaprDemos\java\examples\src\main\protos\examples --java_out=C:\Users\JR\DaprDemos\java\examples\src\main\java C:\Users\JR\DaprDemos\java\examples\src\main\protos\examples\helloworld.proto
-
启动 Dapr gRPC 服务端
dapr run --app-id hellogrpc --app-port 5000 --protocol grpc -- mvn exec:java -pl=examples -Dexec.mainClass=server.HelloWorldService -Dexec.args="-p 5000"
服务端主要实现说明
- 通过 Java SDK(实际此 SDK 可通过 protoc 自己生成,完成没有必要引用官方给的 SDK) 实现 dapr 对 gRPC 的通讯封装
- 服务端 proto 文件为 daprclient.proto ,鉴于语言之间的不同,名字看上去有点奇怪。(比如:以 client 为后缀,实际是服务端)
- 如果使用 Java SDK 则需要 Override
onInvoke()
函数,该函数为 Dapr gRPC 调用封装。该函数提供两个签名InvokeEnvelope
和StreamObserver<Any>
InvokeEnvelope
用于解析 gRPC 请求函数StreamObserver<Any>
用于疯转 gRPC 应答
- helloworld.proto
- 定义了一个 gRPC 函数
Say
- 定义了函数签名
SayRequest
- 定义了函数返回类型
SayResponse
- 根据步骤1提供的 cmd 命令生成代码以在
onInvoke
函数中调用
- 定义了一个 gRPC 函数
-
启动 Dapr gRPC 客户端
dapr run --protocol grpc --grpc-port 50001 -- mvn exec:java -pl=examples -Dexec.mainClass=client.HelloWorldClient -Dexec.args="-p 50001 'message one' 'message two'"
客户端主要实现说明
- 客户端 proto 文件为 dapr.proto
- 使用生成代码调用
InvokeServiceEnvelope()
函数- setId 设置该函数需要调用的服务 Id ,该 Id 指在使用 Dapr 启动实例时 --app-id 指定的名称(例如步骤2中的 hellogrpc)
- setData 设置调用函数的签名
- setMethod 设置调用函数名称
-
gRPC 服务端收到消息
输出为:
Server: message one Server: message two
至此, Java 客户端服务端通过 Dapr 完成 gRPC 通讯。
作者:Zhang-Xiang
出处:https://www.cnblogs.com/Zhang-Xiang/p/12058097.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构