gRPC 实战之——客户端为 Request,服务端为 Response

x33g5p2x  于2022-06-06 转载在 其他  
字(10.8k)|赞(0)|评价(0)|浏览(491)

一 编写 proto 文件

  1. syntax = "proto3";
  2. package grpc.proto;
  3. option java_package = "grpc.proto";
  4. option java_outer_classname = "StudentData";
  5. option java_multiple_files = true ;
  6. // 定义接口
  7. service StudentService {
  8. // 请求一个 Requset 对象,响应一个 Response 对象
  9. rpc queryStudentNameById(MyRequestId) returns(MyResponseName) {}
  10. // 请求一个 Requset 对象,响应一个 Stream 对象
  11. rpc queryStudentsByCourseName(MyRequestCourseName) returns(stream MyResponseStudentsStream) {}
  12. // 请求一个 Stream 对象,响应一个 Response 对象
  13. rpc queryStudentsByCourseName2(stream MyRequestCourseName) returns(MyResponseStudents) {}
  14. // 请求一个 Stream,响应一个 Stream 对象
  15. rpc queryStudentNameById2(stream MyRequestId) returns(stream MyResponseName) {}
  16. }
  17. message MyRequestId
  18. {
  19. int32 id = 1 ;
  20. }
  21. message MyResponseName
  22. {
  23. string name = 1 ;
  24. }
  25. message MyStudent
  26. {
  27. int32 id = 1 ;
  28. string name = 2;
  29. string courseName = 3 ;
  30. }
  31. message MyResponseStudents
  32. {
  33. // 服务端的响应结果是集合类型,因此需要加上 repeated
  34. repeated MyStudent students = 1 ;
  35. }
  36. // 数据结构,定义请求的 Request 对象
  37. message MyRequestCourseName
  38. {
  39. string courseName = 1 ;
  40. }
  41. // 数据结构,定义响应的 Stream
  42. message MyResponseStudentsStream
  43. {
  44. int32 id = 1 ;
  45. string name = 2;
  46. string courseName = 3 ;
  47. }

二 编写接口实现类

  1. package grpc;
  2. import grpc.proto.*;
  3. import io.grpc.stub.StreamObserver;
  4. public class StudentServiceImpl extends StudentServiceGrpc.StudentServiceImplBase {
  5. @Override
  6. public void queryStudentNameById(MyRequestId request, StreamObserver<MyResponseName> responseObserver) {
  7. System.out.println("模拟查询此id的用户名:" + request.getId());
  8. // 假设此 id 的 name 是“zs”
  9. responseObserver.onNext(MyResponseName.newBuilder().setName("zs").build());
  10. responseObserver.onCompleted();
  11. }
  12. ]

三 编写服务端代码

  1. package grpc;
  2. import io.grpc.Server;
  3. import io.grpc.ServerBuilder;
  4. import java.io.IOException;
  5. public class MyGRPCServer {
  6. private Server server;
  7. // 启动服务
  8. private void start() throws IOException {
  9. int port = 8888;
  10. server = ServerBuilder.forPort(port)
  11. .addService(new StudentServiceImpl())
  12. .build()
  13. .start();
  14. Runtime.getRuntime().addShutdownHook(new Thread(() ->{
  15. System.err.println(Thread.currentThread().getName() + ",关闭JVM");
  16. // 当 JVM 关闭前,先关闭 MyGRPCServer服务
  17. MyGRPCServer.this.stop();
  18. }
  19. ));
  20. }
  21. // 关闭服务
  22. private void stop() {
  23. if (server != null) {
  24. server.shutdown();
  25. }
  26. }
  27. private void blockUntilShutdown() throws InterruptedException {
  28. if (server != null) {
  29. // 等待服务结束
  30. server.awaitTermination();
  31. }
  32. }
  33. public static void main(String[] args) throws IOException, InterruptedException {
  34. final MyGRPCServer server = new MyGRPCServer();
  35. server.start();
  36. server.blockUntilShutdown();
  37. }
  38. }

四 编写客户端代码

  1. package grpc;
  2. import grpc.proto.MyRequestId;
  3. import grpc.proto.MyResponseName;
  4. import grpc.proto.StudentServiceGrpc;
  5. import io.grpc.ManagedChannel;
  6. import io.grpc.ManagedChannelBuilder;
  7. public class MyGRPCClient {
  8. public static void main(String[] args) throws Exception {
  9. // 创建一个客户端
  10. ManagedChannel client = ManagedChannelBuilder.forAddress("127.0.0.1", 8888)
  11. .usePlaintext().build();
  12. try {
  13. // 创建客户端的代理对象,用于代表客户端去访问服务端提供的方法
  14. StudentServiceGrpc.StudentServiceBlockingStub stub = StudentServiceGrpc
  15. .newBlockingStub(client);
  16. // 请求Request,响应Response
  17. // 调用服务端提供的方法,查询id为1的姓名
  18. MyResponseName responseName = stub.queryStudentNameById(MyRequestId.newBuilder()
  19. .setId(1).build());
  20. System.out.println(responseName.getName());
  21. } finally {
  22. client.shutdown();
  23. }
  24. }
  25. }

五 测试

1 启动服务端和客户端

2 服务端打印如下

模拟查询此id的用户名:1

3 客户端打印如下

zs

六 冲突解决

GRPC-Server报错服务端启动com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava异常解决方案_时间是一种解药的博客-CSDN博客

https://blog.csdn.net/cucgyfjklx/article/details/122681339

guava 版本冲突,保留最高版本的 guava 可解决问题。

解决冲突后的 pom 文件如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>demo2022</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.0.5.RELEASE</version>
  13. </parent>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16. <grpc.version>1.15.0</grpc.version><!-- CURRENT_GRPC_VERSION -->
  17. <protobuf.version>3.5.1</protobuf.version>
  18. <protoc.version>3.5.1-1</protoc.version>
  19. <netty.tcnative.version>2.0.7.Final</netty.tcnative.version>
  20. </properties>
  21. <dependencies>
  22. <!--Spring 官方提供的热部署插件 -->
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-devtools</artifactId>
  26. <optional>true</optional>
  27. </dependency>
  28. <!-- easypoi-->
  29. <dependency>
  30. <groupId>cn.afterturn</groupId>
  31. <artifactId>easypoi-base</artifactId>
  32. <version>4.1.0</version>
  33. <exclusions>
  34. <exclusion>
  35. <artifactId>guava</artifactId>
  36. <groupId>com.google.guava</groupId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. <dependency>
  41. <groupId>cn.afterturn</groupId>
  42. <artifactId>easypoi-web</artifactId>
  43. <version>4.1.0</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>cn.afterturn</groupId>
  47. <artifactId>easypoi-annotation</artifactId>
  48. <version>4.1.0</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>io.netty</groupId>
  52. <artifactId>netty-all</artifactId>
  53. <version>4.1.29.Final</version>
  54. <scope>compile</scope>
  55. </dependency>
  56. <dependency>
  57. <groupId>com.google.protobuf</groupId>
  58. <artifactId>protobuf-java</artifactId>
  59. <version>3.5.1</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.apache.httpcomponents</groupId>
  63. <artifactId>httpclient</artifactId>
  64. <version>4.3</version>
  65. <exclusions>
  66. <exclusion>
  67. <artifactId>httpcore</artifactId>
  68. <groupId>org.apache.httpcomponents</groupId>
  69. </exclusion>
  70. </exclusions>
  71. </dependency>
  72. <dependency>
  73. <groupId>org.apache.httpcomponents</groupId>
  74. <artifactId>httpcore</artifactId>
  75. <version>4.4.4</version>
  76. </dependency>
  77. <dependency>
  78. <groupId>com.alibaba</groupId>
  79. <artifactId>fastjson</artifactId>
  80. <version>1.1.23</version>
  81. </dependency>
  82. <dependency>
  83. <groupId>org.apache.thrift</groupId>
  84. <artifactId>libthrift</artifactId>
  85. <version>0.11.0</version>
  86. <exclusions>
  87. <exclusion>
  88. <artifactId>httpcore</artifactId>
  89. <groupId>org.apache.httpcomponents</groupId>
  90. </exclusion>
  91. <exclusion>
  92. <artifactId>httpclient</artifactId>
  93. <groupId>org.apache.httpcomponents</groupId>
  94. </exclusion>
  95. </exclusions>
  96. </dependency>
  97. <dependency>
  98. <groupId>io.grpc</groupId>
  99. <artifactId>grpc-netty-shaded</artifactId>
  100. <version>${grpc.version}</version>
  101. </dependency>
  102. <dependency>
  103. <groupId>io.grpc</groupId>
  104. <artifactId>grpc-protobuf</artifactId>
  105. <version>${grpc.version}</version>
  106. <exclusions>
  107. <exclusion>
  108. <artifactId>guava</artifactId>
  109. <groupId>com.google.guava</groupId>
  110. </exclusion>
  111. </exclusions>
  112. </dependency>
  113. <dependency>
  114. <groupId>io.grpc</groupId>
  115. <artifactId>grpc-stub</artifactId>
  116. <version>${grpc.version}</version>
  117. </dependency>
  118. <dependency>
  119. <groupId>io.grpc</groupId>
  120. <artifactId>grpc-alts</artifactId>
  121. <version>${grpc.version}</version>
  122. <exclusions>
  123. <exclusion>
  124. <artifactId>httpclient</artifactId>
  125. <groupId>org.apache.httpcomponents</groupId>
  126. </exclusion>
  127. <exclusion>
  128. <artifactId>grpc-grpclb</artifactId>
  129. <groupId>io.grpc</groupId>
  130. </exclusion>
  131. </exclusions>
  132. </dependency>
  133. <dependency>
  134. <groupId>io.grpc</groupId>
  135. <artifactId>grpc-testing</artifactId>
  136. <version>${grpc.version}</version>
  137. <scope>test</scope>
  138. <exclusions>
  139. <exclusion>
  140. <artifactId>mockito-core</artifactId>
  141. <groupId>org.mockito</groupId>
  142. </exclusion>
  143. </exclusions>
  144. </dependency>
  145. <!-- Used in HelloWorldServerTls -->
  146. <dependency>
  147. <groupId>io.grpc</groupId>
  148. <artifactId>grpc-netty</artifactId>
  149. <version>${grpc.version}</version>
  150. </dependency>
  151. <dependency>
  152. <groupId>io.netty</groupId>
  153. <artifactId>netty-tcnative-boringssl-static</artifactId>
  154. <version>${netty.tcnative.version}</version>
  155. </dependency>
  156. <dependency>
  157. <groupId>com.google.api.grpc</groupId>
  158. <artifactId>proto-google-common-protos</artifactId>
  159. <version>1.0.0</version>
  160. </dependency>
  161. <dependency>
  162. <groupId>com.google.protobuf</groupId>
  163. <artifactId>protobuf-java-util</artifactId>
  164. <version>${protobuf.version}</version>
  165. <exclusions>
  166. <exclusion>
  167. <artifactId>guava</artifactId>
  168. <groupId>com.google.guava</groupId>
  169. </exclusion>
  170. </exclusions>
  171. </dependency>
  172. <dependency>
  173. <groupId>junit</groupId>
  174. <artifactId>junit</artifactId>
  175. <version>4.12</version>
  176. <scope>test</scope>
  177. </dependency>
  178. <dependency>
  179. <groupId>org.mockito</groupId>
  180. <artifactId>mockito-core</artifactId>
  181. <version>1.9.5</version>
  182. <scope>test</scope>
  183. </dependency>
  184. </dependencies>
  185. <build>
  186. <extensions>
  187. <extension>
  188. <groupId>kr.motd.maven</groupId>
  189. <artifactId>os-maven-plugin</artifactId>
  190. <version>1.5.0.Final</version>
  191. </extension>
  192. </extensions>
  193. <plugins>
  194. <plugin>
  195. <groupId>org.springframework.boot</groupId>
  196. <artifactId>spring-boot-maven-plugin</artifactId>
  197. <configuration>
  198. <fork>true</fork><!--必须添加这个配置-->
  199. </configuration>
  200. </plugin>
  201. <plugin>
  202. <groupId>org.xolstice.maven.plugins</groupId>
  203. <artifactId>protobuf-maven-plugin</artifactId>
  204. <version>0.5.1</version>
  205. <configuration>
  206. <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
  207. </protocArtifact>
  208. <pluginId>grpc-java</pluginId>
  209. <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
  210. </pluginArtifact>
  211. </configuration>
  212. <executions>
  213. <execution>
  214. <goals>
  215. <goal>compile</goal>
  216. <goal>compile-custom</goal>
  217. </goals>
  218. </execution>
  219. </executions>
  220. </plugin>
  221. </plugins>
  222. </build>
  223. </project>

相关文章