紧张特性强大的IDLgRPC利用ProtoBuf来定义做事,ProtoBuf是由Google开拓的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛运用在数据存储、通信协议等方面。多措辞支持gRPC支持多种措辞,并能够基于措辞自动天生客户端和做事端功能库。目前已供应了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它措辞的版本正在积极开拓中,个中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等措辞,grpc-java已经支持Android开拓。HTTP2gRPC基于HTTP2标准设计,以是相对付其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩、多复用要求等。这些功能给移动设备带来重大益处,如节省带宽、降落TCP链接次数、节省CPU利用和延长电池寿命等。同时,gRPC还能够提高了云端做事和Web运用的性能。gRPC既能够在客户端运用,也能够在做事器端运用,从而以透明的办法实现客户端和做事器真个通信和简化通信系统的构建。2.代码工程
我们建议将您的项目分为2至3个不同的模块。
grpc-api 项目 包含原始 protobuf 文件并天生 java model 和 service 类。 你可能会在不同的项目中会共享这个部分。grpc-Server 项目 包含项目的业务实现,并利用上面的 Interface 项目作为依赖项。grpc-Client 项目(可选,可能很多) 任何利用预天生的 stub 来访问做事器的客户端项目。实验目的定义了一个Hello Service,客户端发送包含字符串名字的要求,做事端返回Hello。
grpc-apipom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>grpc</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>grpc-api</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <protobuf.version>3.23.4</protobuf.version> <protobuf-plugin.version>0.6.1</protobuf-plugin.version> <grpc.version>1.58.0</grpc.version> </properties> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <!-- Java 9+ compatibility - Do NOT update to 2.0.0 --> <groupId>jakarta.annotation</groupId> <artifactId>jakarta.annotation-api</artifactId> <version>1.3.5</version> <optional>true</optional> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.7.0</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>${protobuf-plugin.version}</version> <configuration> <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build></project>
proto
将您的 protobuf 定义/.proto文件放入src/main/proto。 有关编写 protobuf 文件的信息,请参阅官方的 protobuf 文档。 您的 .proto 文件跟如下的示例类似:
syntax = "proto3";package net.devh.boot.grpc.example;option java_multiple_files = true;option java_package = "com.et.grpc.api.protobuf.lib";option java_outer_classname = "HelloWorldProto";// The greeting service definition.service MyService { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) { }}// The request message containing the user's name.message HelloRequest { string name = 1;}// The response message containing the greetingsmessage HelloReply { string message = 1;}
天生文件,源码在target/generated-sources/protobuf
mvn protobuf:compilemvn protobuf:compile-custom
末了打包给server和client引用
grpc-serverprotoc-gen-grpc-java 插件为你的每个 grpc 做事天生一个类。 例如:MyServiceGrpc 的 MyService 是 proto 文件中的 grpc 做事名称。 这个类 包含您须要扩展的客户端 stub 和做事真个 ImplicBase。 在这之后,你还有四个步骤:
请确保您的 MyServiceImp 实现了 MyServiceGrpc.MyServiceImpBase将 @GrpcService 表明添加到您的 MyServiceImp 类上请确保 MyServiceImplic 已添加到您的运用程序高下文中。通过在您的 @Configuration 类中创建 @Bean或者将其放置在 spring 的自动检测到路径中(例如在您Main类的相同或子包中)实现 grpc 做事方法。pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>grpc</artifactId> <groupId>com.et</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>grpc-server</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>net.devh</groupId> <artifactId>grpc-server-spring-boot-starter</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>com.et</groupId> <artifactId>grpc-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
service
/ Copyright (c) 2016-2023 The gRPC-Spring Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. /package com.et.grpc.server;import com.et.grpc.api.protobuf.lib.HelloReply;import com.et.grpc.api.protobuf.lib.HelloRequest;import com.et.grpc.api.protobuf.lib.MyServiceGrpc;import io.grpc.stub.StreamObserver;import net.devh.boot.grpc.server.service.GrpcService;/ @author Michael (yidongnan@gmail.com) @since 2016/11/8 /@GrpcServicepublic class GrpcServerService extends MyServiceGrpc.MyServiceImplBase { @Override public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) { HelloReply reply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build(); responseObserver.onNext(reply); responseObserver.onCompleted(); }}
application.yaml
spring: application: name: local-grpc-servergrpc: server: port: 9898
grpc-client
以下列表包含您可能在客户端利用到的的所有功能。 如果您不想利用任何高等功能,那么前两个元素可能都是您须要利用的。
@GrpcClient: 在须要注入的客户真个字段或者 setter 方法上这个表明。 支持 Channel和各种类型的 Stub。 请不要将 @GrpcClient 与 @Autowireed 或 @Inject 一起利用。 目前,它不支持布局函数和 @Bean 方法参数。 这种情形请查看后面 @GrpcClientBean 的利用文档。 把稳: 同一运用程序供应的做事只能在 ` ApplicationStartedEvent 之后访问/调用。 连接到外部做事的 Stubs 可以提前利用;从 @PostConstruct / 初始化Bean#afterPropertiesSet()` 开始。@GrpcClientBean: 表明会把利用 @GrpcClient 表明的类型注册到 Spring Context 中,方便 @Autowired 和 @Qualifier 的利用。 这个表明可以重复添加到您的 @Configuration 类中。Channel: Channel 是单个地址的连接池。 目标做事器可能是多个 gRPC 做事。 该地址将利用 NameResolver 做解析,终极它可能会指向一批固天命量或动态数量的做事端。ManagedChannel: ManagedChannel 是 Channel 的一种分外变体,由于它许可对连接池进行管理操作,例如将其关闭。NameResolver、 NameResolver.Factory: 一个用于将地址解析为SocketAddress 列表的类 ,当与先前列出的做事端连表连接失落败或通道空闲时,地址将会重新做解析。 参阅 Configuration -> Choosing the Target。ClientInterceptor: 在每个 Channel 处理之前拦截它们。 可以用于日志、监测、元数据处理和要求/相应的重写。 grpc-spring-boot-starter 将自动吸收所有带有 @GrpcGlobalClientInterceptor 表明以及手动注册在GlobalClientInterceptorRegistry 上的客户拦截器。 参阅 Configuration -> ClientInterceptor。CallCredentials: 管理身份验证的组件。 它可以用于存储凭据和会话令牌。 它还可以用来身份验证,并且利用返回的令牌(例如 OAuth) 来授权实际要求。 除此之外,如果令牌过期并且重新发送要求,它可以续签令牌。 如果您的运用程序高下文中只存在一个 CallCredentials bean,那么 spring 将会自动将其附加到Stub( 非 Channel )。 CallCredentialsHelper工具类可以帮助您创建常用的 CallCredentials 类型和干系的StubTransformer。StubFactory: 一个用于从 Channel 创建特定 Stub 的工厂。 可以注册多个 StubFactory,以支持不同类型的 stub。 参阅 Configuration -> StubFactory。StubTransformer: 所有客户真个 Stub 的注入之前运用的转换器。 参阅 Configuration -> StubTransformer。pom.xml/ Copyright (c) 2016-2023 The gRPC-Spring Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. /package com.et.grpc.client;import com.et.grpc.api.protobuf.lib.HelloReply;import com.et.grpc.api.protobuf.lib.HelloRequest;import com.et.grpc.api.protobuf.lib.MyServiceGrpc;import org.springframework.stereotype.Service;import io.grpc.StatusRuntimeException;import net.devh.boot.grpc.client.inject.GrpcClient;/ @author Michael (yidongnan@gmail.com) @since 2016/11/8 /@Servicepublic class GrpcClientService { @GrpcClient("local-grpc-server") // @GrpcClient("cloud-grpc-server") private MyServiceGrpc.MyServiceBlockingStub myServiceStub; public String sendMessage(final String name) { try { final HelloReply response = this.myServiceStub.sayHello(HelloRequest.newBuilder().setName(name).build()); return response.getMessage(); } catch (final StatusRuntimeException e) { return "FAILED with " + e.getStatus().getCode().name(); } }}
controller
/ Copyright (c) 2016-2023 The gRPC-Spring Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. /package com.et.grpc.client;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/ @author Michael (yidongnan@gmail.com) @since 2016/12/4 /@RestControllerpublic class GrpcClientController { @Autowired private GrpcClientService grpcClientService; @RequestMapping("/") public String printMessage(@RequestParam(defaultValue = "Michael") String name) { return grpcClientService.sendMessage(name); }}
application.yaml
server: port: 8088spring: application: name: local-grpc-clientgrpc: client: local-grpc-server: address: 'static://127.0.0.1:9898' enableKeepAlive: true keepAliveWithoutCalls: true negotiationType: plaintext
以上只是一些关键代码,所有代码请拜会下面代码仓库
代码仓库https://github.com/Harries/springboot-demo3.测试启动做事端启动客户端调用做事http://127.0.0.1:8088/测试做事您可以通过运行 gRPCurl 命令来测试您的运用程序是否正常运行:
grpcurl --plaintext localhost:9898 listgrpcurl --plaintext localhost:9898 list net.devh.boot.grpc.example.MyService# Linux (Static content)grpcurl --plaintext -d '{"name": "test"}' localhost:9898 net.devh.boot.grpc.example.MyService/sayHello# Windows or Linux (dynamic content)grpcurl --plaintext -d "{\"name\": \"test\"}" localhost:9898 net.devh.boot.grpc.example.MyService/sayHello
gRPCurl 的示例命令输出以及其他信息请参考此 文档 。
4.引用https://yidongnan.github.io/grpc-spring-boot-starter/zh-CN/server/getting-started.html