当前位置: 首页 > 后端技术 > Java

如何基于gRPC沟通微服务框架

时间:2023-04-02 10:02:52 Java

本文将讲解如何使用gRPC构建微服务。gRPC是一个开源框架,可用于构建可扩展和高性能的微服务并创建服务之间的通信。背景随着企业越来越多地转向微服务,对构建这些微服务的低延迟和可扩展框架的需求也在增加。为了满足这种需求,各种工具和框架提供商都在加紧满足微服务需求。在学习构建大型微服务应用程序的经验的同时,技术专业人员分享他们在可重用组件方面的知识,以便其他人可以构建具有相同规模和性能的架构。什么是gRPCgRPC是一个开源框架(由Google创建),是一个用于大规模构建高性能网络应用程序的通用RPC框架。实现有多种语言,支持跨平台通信。使用场景gRPC非常适合服务到服务的RPC通信。在这里,我们将使用Java来实现微服务和相关框架,使其功能更加完善。为了使其可供其他服务访问,我们将创建一个包装器REST服务,该服务将使用gRPC客户端与gRPC服务进行通信。开始之前我们需要设置一个基本环境来构建和运行示例。基本要求是安装Java和Maven。其他依赖项,例如gRPC工具和服务器运行时库,将在构建过程中自动下载。请参阅下面的代码,了解构建应用程序所需的核心依赖项。io.github.lognetgrpc-spring-boot-starter4.5.0org.springframework.bootspring-boot-starter-log4j2org.mapstructmapstruct${mapstruct.version}核心功能gRPC基本上是一个独立于平台和编码的协议。这意味着,您可以使用任何类型的编码,如二进制、JSON、XML等,但推荐的方法是使用“protobuf”,它使用专门的序列化/反序列化机制支持二进制编码。可插拔设计允许用户对其进行扩展以支持所需的平台和堆栈。protobuf的核心构造是protoIDL(接口定义语言),它定义了消息类型和服务定义。它还提供了为所需平台生成模型类和服务接口的工具。消息类型我们可以从在.proto文件中定义消息类型的原型定义开始。请参见下面的示例。消息AccountProto{int32accId=1;字符串accName=2;串accBalance=3;布尔状态=4;...}有关数据类型和关键字的完整参考,请参阅proto3文档。Protobuf提供了一种工具,可以根据平台/编程语言的消息定义为模型类生成代码。以下命令将根据给定的消息定义在Java中生成帐户类。$>protoc-I=proto-demo--java_out=proto-demoaccount.proto服务定义gRPC服务定义是一组需要对定义的消息类型执行的操作。这些操作可以采用四种通信形式之一:单通道RPC——这是最简单的通信形式。它本质上是同步的,允许用户以阻塞模式发送请求并等待响应直到服务器完成处理。流式RPC-在这种形式下,客户端一次发送所有数据,但服务器以流的形式返回响应。客户端流式RPC-与服务器流式不同,在这种形式下,客户端以流的形式发送请求的数据,服务器将数据作为一个整体返回。双向流式RPC-在这种形式下,服务器和客户端都支持流式传输数据以响应请求和响应。具有标准CRUD操作的消息类型的示例服务定义将采用以下输入:serviceAccountService{rpcGetAccount(google.protobuf.Int32Value)returns(AccountProto);rpcGetAllAccounts(google.protobuf.Empty)返回(streamAccountProto);rpcCreateAccount(AccountProto)返回(AccountProto);rpcUpdateAccount(AccountProto)返回(AccountProto);rpcDeleteAccount(google.protobuf.Int32Value)returns(google.protobuf.Empty);}gRPC-Java逻辑和serverstubs生成用户需要实现的服务接口,客户端会使用这些stubs来调用部署好的服务.$>protoc-I=grpc-demo\src\main\proto--java_out=grpc-demo\src\main\protoaccount.proto标准服务器和客户端gRPC-Java库提供了一个响应式服务器实现(基于Netty)来部署您的服务和阻塞/非阻塞客户端实现,以将您的服务与其他服务连接起来。您需要注册您的服务实现并以编程方式启动服务器。server=ServerBuilder.forPort(port),.addService(newGreeterImpl()).build().start();在此处查找GitHub参考。要连接到部署在基于Netty的gRPC服务器上的服务,您需要创建一个消息通道并将其与生成的服务器存根连接以进行调用。ManagedChannelchannel=ManagedChannelBuilder.forTarget(target).usePlaintext().build();blockingStub=GreeterGrpc.newBlockingStub(channel);HelloRequestrequest=HelloRequest.newBuilder().setName(name).build();HelloReplyresponse=blockingStub.说你好(请求);在此处查找GitHub参考。Web客户端还有一个gRPCWeb模块,允许Web客户端无缝访问您的gRPC服务。他们的早期版本支持通过反向代理连接Web客户端,但现在无需中间代理即可实现。另一种方法是使用REST/GraphQL协议将包装的服务层暴露给面向外部的世界,并通过gRPC客户端进行连接。数据映射和持久性我们可能需要在此之上添加另一层,以使用Hibernate等数据访问库创建功能齐全的域服务。与Hibernate或任何数据库一样,需要以某种方式修饰所需的实体,这对于protobuf模型生成的模型可能不可行。所以我们可能需要一些映射逻辑来将模型类转换为实体类。一个这样好的库是MapStruct,它根据bean约定进行自动映射。我们只需要提供映射接口:@MapperpublicinterfaceAccountProtoMapper{Accountmap(AccountProtoaccountProto);AccountProtomap(Accountaccount);}第三方支持为了进一步简化整个构建和运行环境,有一些流行的第三方Maven插件和库。帮助。1.运行与Build集成的ProtoToolprotocolbufferMaven插件(由Xolstice提供)以运行proto工具及其扩展,以及从.proto文件构建和生成源代码。它还将.proto文件附加为项目的资源。请参阅示例配置以生成Java代码。<配置>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}grpc-javaio.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}参考可以在这里找到。2.生成映射器类MapStruct库支持为消息类型生成映射器类,这些消息类型可以将消息与类的实体相互转换。它提供了一个注解处理器,通过在构建时分析指定的注解来生成映射器类。Maven编译插件参考下面的配置。<配置><路径>org.mapstructmapstruct-processor${mapstruct.version}3.自动启动gRPC服务器并注册服务实现默认情况下,gRPC服务器不会与web服务器(本例中为Netty)一起启动。此外,它要求在服务器启动之前注册所有gRPC服务。LogNet的gRPCSpringBoot自动扫描所有用@GRpcService注释的类,并向服务器构建器注册服务定义。构建服务器时,它会自动在Spring应用程序属性中配置的端口上启动gRPC服务器。除了注册服务和启动服务器外,它还支持自动配置的安全性、健康检查和服务发现。有关详细信息,请参见此处。GitHub上提供了上述方法的完整示例实现。差异化Google构建gRPC是出于从零开始构建大规模微服务的学习需求。大多数流行的微服务框架仍然缺乏性能和跨平台支持,因为无法在单一堆栈和单一代码中构建大规模系统。最受欢迎的是对HTTP/2的支持,这仍然是许多提供商的路线图。它提供了通过单个TCP连接使用多路复用非阻塞数据流的二进制有线传输的优势。进一步支持标头压缩,从而提供额外的性能优势。除了支持protobuf作为主要编码机制外,它还增加了对基于JSON的服务的支持,这些服务可以被低端客户端轻松使用。虽然protobuf是实现gRPC的推荐方式,但谷歌增加了对FlatBuffers的支持,并提高了内部和整个行业的采用率。初始版本支持通过反向代理(例如基于Envoy和Ngnix的系统)公开gRPC服务。gRPCWeb的最新发展弥合了这一差距,并通过在JavaScript库中采用HTTP/2添加了对向Web客户端公开gRCP服务的支持。正在进行进一步的开发以增加对Angular和React等流行Web框架的支持。凭借功能齐全的开发堆栈,它还提供单元测试助手,例如InProcessServer和InProcessChannelBuilder。采用Google在其内部工具和平台上使用它,例如Bigtable、Pub/Sub、Speech和TensorFlow。CoreOS是gRPC的早期采用者,并在其服务发现工具和容器引擎中增加了支持。微软是gRPC的先行采用者,并增加了对其WebAPI和构建工具的支持,使开发人员更容易无缝地构建服务。它现在被越来越多的跨行业项目使用,例如Docker、Square、Netflix和Cisco等开源开发人员。Alternatives除了构建gRPC,Google的应用程序还提供了文章中提到的工具/库和SpringBoot启动框架。一些专门的微服务框架为gRPC服务实现提供开箱即用的支持。QuarkusgRPCAsp.NETgRPCAkkagRPCSalesforcegRPC