SpringBoot整合Grpc实现跨语言RPC通讯

本文介绍了如何使用SpringBoot整合gRPC进行跨语言RPC通信。内容涵盖gRPC的基本概念、服务定义、数据序列化和反序列化,以及如何创建服务器和客户端。文章提供了具体的代码示例,包括protobuf文件的编写、Maven设置和Spring Boot应用程序的配置。通过示例展示了如何定义服务、创建服务端和客户端,同时提到了gRPC的异步特性和安全连接机制。最后,文章给出了测试用例和总结,建议读者先运行示例再深入学习。
摘要由CSDN通过智能技术生成

什么是gRPC

gRPC谷歌开源基于go语言的一个现代的开源高性能RPC框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查和身份验证。它还适用于分布式计算的最后一英里,用于将设备,移动应用程序和浏览器连接到后端服务。

简单的服务定义:使用Protocol Buffers定义您的服务,这是一个功能强大的二进制序列化工具集和语言.

跨语言和平台工作:自动为各种语言和平台的服务生成惯用的客户端和服务器存根,当然单纯的java语言之间也是可以的。

一般主要是Java和Go,PHP,Python之间通讯。

快速启动并扩展:使用单行安装运行时和开发环境,并使用框架每秒扩展到数百万个RPC

双向流媒体和集成的身份验证:基于http/2的传输的双向流和完全集成的可插拔身份验证

官网地址:https://www.grpc.io/

这是一个可以运行的例子,本文基于此增加了一些代码:
https://codenotfound.com/grpc-java-example.html

这个例子使用的jar是grpc-spring-boot-starter@io.github.lognet

这个例子也可以参考:
https://github.com/yidongnan/grpc-spring-boot-starter

不过这个例子使用的是另一个jar是grpc-spring-boot-starter@net.devh

说明:Thrift也可以实现跨语言的通讯,有人对此做了对比参考:开源RPC(gRPC/Thrift)框架性能评测

服务定义

与许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。默认情况下,gRPC使用Protocol Buffers作为接口定义语言(IDL)来描述服务接口和有效负载消息的结构。如果需要,可以使用其他替代方案。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。

它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

数据序列化和反序列化

序列化:将数据结构或对象转换成二进制串的过程。

反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

这里有人翻译了官方文档:Protocol Buffers官方文档(开发指南)

也可以看IBM的文档:Google Protocol Buffer 的使用和原理

https://github.com/protocolbuffers/protobuf

https://developers.google.com/protocol-buffers/docs/javatutorial

参考官网指南:

如您所见,语法类似于C ++或Java。让我们浏览文件的每个部分,看看它的作用。

该.proto文件以包声明开头,这有助于防止不同项目之间的命名冲突。在Java中,包名称用作Java包,除非您已经明确指定了ajava_package,就像我们在这里一样。即使您提供了ajava_package,您仍应定义一个法线package,以避免在Protocol Buffers名称空间和非Java语言中发生名称冲突。

在包声明之后,您可以看到两个特定于Java的选项: java_package和java_outer_classname。 java_package指定生成的类应该以什么Java包名称存在。如果没有明确指定它,它只是匹配package声明给出的包名,但这些名称通常不是合适的Java包名(因为它们通常不以域名开头)。该java_outer_classname选项定义应包含此文件中所有类的类名。如果你没有java_outer_classname明确地给出,它将通过将文件名转换为camel case来生成。例如,默认情况下,“my_proto.proto”将使用“MyProto”作为外部类名。

接下来,您有消息定义。消息只是包含一组类型字段的聚合。许多标准的简单数据类型都可以作为字段类型,

包括bool,int32,float,double,和string。您还可以使用其他消息类型作为字段类型在消息中添加更多结构 - 在上面的示例中,Person消息包含PhoneNumber消息,而AddressBook消息包含Person消息。您甚至可以定义嵌套在其他消息中的消息类型 - 如您所见,PhoneNumber类型在内部定义Person。enum如果您希望其中一个字段具有预定义的值列表之一,您也可以定义类型 - 在此您要指定电话号码可以是其中之一MOBILE,HOME或者WORK。

每个元素上的“= 1”,“= 2”标记标识该字段在二进制编码中使用的唯一“标记”。标签号1-15需要少于一个字节来编码而不是更高的数字,因此作为优化,您可以决定将这些标签用于常用或重复的元素,将标签16和更高版本留给不太常用的可选元素。重复字段中的每个元素都需要重新编码标记号,因此重复字段特别适合此优化。

必须使用以下修饰符之一注释每个字段:

  • required:必须提供该字段的值,否则该消息将被视为“未初始化”。尝试构建一个未初始化的消息将抛出一个RuntimeException。解析未初始化的消息将抛出一个IOException。除此之外,必填字段的行为与可选字段完全相同。
  • optional:该字段可能已设置,也可能未设置。如果未设置可选字段值,则使用默认值。对于简单类型,您可以指定自己的默认值,就像我们type在示例中为电话号码所做的那样。否则,使用系统默认值:数字类型为0,字符串为空字符串,bools为false。对于嵌入式消息,默认值始终是消息的“默认实例”或“原型”,其中没有设置其字段。调用访问器以获取尚未显式设置的可选(或必需)字段的值始终返回该字段的默认值。
  • repeated:该字段可以重复任意次数(包括零)。重复值的顺序将保留在协议缓冲区中。将重复字段视为动态大小的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值