暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot详细教程 | 第十五篇:Spring Boot整合gRPC

小东IT技术分享 2019-03-03
3409

一. 简介gRpc

1.gRpc简介

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

gRPC Server主要完成以下功能: 将proto中定义的service的真正实现注册到grpc的Server中。 管理Server的Socket以及在Socket上传输数据的过程。

具体的介绍请参考 gRpc中文文档

http://doc.oschina.net/grpc?t=58009

二. 项目结构

1.项目结构

(1) 创建maven项目主模块pop.xml

(2) grpc-server模块 RPC服务端

(3)lib-server模块 RPC接口 包含原始proto文件,并负责将其转换为java代码

(4) grpc-client模块 RPC客户端

2.模块关系

相互关系 根项目负责依赖版本管理,grpc-server和grpc-client都依赖grpc-lib的接口,其中,grpc-server提供了接口的具体实现,而grpc-client则调用了grpc-server的实现,他们通过grpc-lib来确定使用规范(接口即契约) 对应MVC关系 grpc-lib就是service(接口,为提供实现) grpc-server就相当于serviceImpl(service的实现类) grpc-client就是controller的角色. 框架依赖 grpc-lib需要将proto文件转换成java类,故需依赖于protobuf-maven-plugin插件,另外还需要io.grpc下的grpc-all,否则生成的java类会提示缺少依赖 grpc-server 负责提供rpc服务,不需要spring-web支持 grpc-client 调用rpc服务

三. 创建项目

按照多模块结构进行创建

  1. 创建主项目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>com.li</groupId>

  7. <artifactId>springboot-grpc</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.7.RELEASE</version>

  13. <relativePath/> <!-- lookup parent from repository -->

  14. </parent>


  15. <modules>

  16. <module>grpc-server</module>

  17. <module>lib-server</module>

  18. </modules>


  19. <properties>

  20. <java.version>1.8</java.version>

  21. <os.plugin.version>1.6.0</os.plugin.version>

  22. <grpc.version>1.15.1</grpc.version>

  23. <protoc.version>3.6.1</protoc.version>

  24. <protobuf.plugin.version>0.6.1</protobuf.plugin.version>

  25. <net-devh-grpc.version>2.0.1.RELEASE</net-devh-grpc.version>

  26. </properties>


  27. <packaging>pom</packaging>


  28. <dependencies>

  29. <!--公共grpc模块-->

  30. <dependency>

  31. <groupId>com.li</groupId>

  32. <artifactId>lib-server</artifactId>

  33. <version>0.0.1-SNAPSHOT</version>

  34. <scope>compile</scope>

  35. </dependency>

  36. <!--核心grpc-spring-boot依赖-->

  37. <dependency>

  38. <groupId>net.devh</groupId>

  39. <artifactId>grpc-client-spring-boot-starter</artifactId>

  40. <version>${net-devh-grpc.version}</version>

  41. </dependency>

  42. <dependency>

  43. <groupId>net.devh</groupId>

  44. <artifactId>grpc-server-spring-boot-starter</artifactId>

  45. <version>${net-devh-grpc.version}</version>

  46. </dependency>


  47. <dependency>

  48. <groupId>org.projectlombok</groupId>

  49. <artifactId>lombok</artifactId>

  50. </dependency>

  51. </dependencies>

  52. </project>

2.创建grpc-lib模块

(1) 创建之前要安装插件Protobuf Support

然后创建maven管理的java项目,pom文件如下 proto文件目录是${project.basedir}/src/main/proto 生成的java代码在${project.basedir}/src/main/java

文件夹自行创建

  1. 使用maven指令compile可完成代码生成,或直接在IDE里用proto插件运行compilecompile-custom


  2. <?xml version="1.0" encoding="UTF-8"?>

  3. <project xmlns="http://maven.apache.org/POM/4.0.0" 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. <parent>

  7. <groupId>com.li</groupId>

  8. <artifactId>springboot-grpc</artifactId>

  9. <version>1.0-SNAPSHOT</version>

  10. </parent>

  11. <artifactId>lib-server</artifactId>

  12. <version>0.0.1-SNAPSHOT</version>

  13. <name>lib-server</name>

  14. <description>Demo project for Spring Boot</description>

  15. <packaging>jar</packaging>


  16. <properties>

  17. <java.version>1.8</java.version>

  18. </properties>


  19. <dependencies>

  20. <dependency>

  21. <groupId>org.springframework.boot</groupId>

  22. <artifactId>spring-boot-starter</artifactId>

  23. </dependency>


  24. <dependency>

  25. <groupId>org.springframework.boot</groupId>

  26. <artifactId>spring-boot-starter-test</artifactId>

  27. <scope>test</scope>

  28. </dependency>


  29. <dependency>

  30. <groupId>io.grpc</groupId>

  31. <artifactId>grpc-all</artifactId>

  32. <version>${grpc.version}</version>

  33. </dependency>

  34. </dependencies>


  35. <build>

  36. <extensions>

  37. <extension>

  38. <groupId>kr.motd.maven</groupId>

  39. <artifactId>os-maven-plugin</artifactId>

  40. <version>${os.plugin.version}</version>

  41. </extension>

  42. </extensions>

  43. <plugins>

  44. <plugin>

  45. <groupId>org.xolstice.maven.plugins</groupId>

  46. <artifactId>protobuf-maven-plugin</artifactId>

  47. <version>${protobuf.plugin.version}</version>

  48. <extensions>true</extensions>

  49. <configuration>

  50. <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>

  51. <pluginId>grpc-java</pluginId>

  52. <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>

  53. <!--默认值-->

  54. <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>

  55. <!--默认值-->

  56. <!--<outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>-->

  57. <outputDirectory>${project.basedir}/src/main/java</outputDirectory>

  58. <!--设置是否在生成java文件之前清空outputDirectory的文件,默认值为true,设置为false时也会覆盖同名文件-->

  59. <clearOutputDirectory>false</clearOutputDirectory>

  60. <!--更多配置信息可以查看https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html-->

  61. </configuration>

  62. <executions>

  63. <execution>

  64. <!--在执行mvn compile的时候会执行以下操作-->

  65. <phase>compile</phase>

  66. <goals>

  67. <!--生成OuterClass类-->

  68. <goal>compile</goal>

  69. <!--生成Grpc类-->

  70. <goal>compile-custom</goal>

  71. </goals>

  72. </execution>

  73. </executions>

  74. </plugin>

  75. </plugins>

  76. </build>


  77. </project>

(2) 在grpc-lib模块利用proto文件生成java代码syntax = "proto3";

  1. option java_package = "com.li.libserver";


  2. // The greeter service definition.

  3. service Greeter {

  4. // Sends a greeting

  5. rpc SayHello ( HelloRequest) returns ( HelloReply) {}


  6. }

  7. // The request message containing the user's name.

  8. message HelloRequest {

  9. string name = 1;

  10. }

  11. // The response message containing the greetings

  12. message HelloReply {

  13. string message = 1;

  14. }

(3) 生成代码 使用maven的complie即可



3.创建grpc-server模块实现接口

(1) 首先在application.yml文件指定应用名和grpc端口,如下

  1. spring.application.name= local-grpc-server

  2. grpc.server.port=9898

(2) 创建GreeterService服务类

  1. package com.li.grpcserver;


  2. import com.li.libserver.GreeterGrpc;

  3. import com.li.libserver.GreeterOuterClass;

  4. import io.grpc.stub.StreamObserver;

  5. import lombok.extern.slf4j.Slf4j;

  6. import net.devh.springboot.autoconfigure.grpc.server.GrpcService;


  7. @Slf4j

  8. @GrpcService(GreeterOuterClass.class)

  9. public class GreeterService extends GreeterGrpc.GreeterImplBase{


  10. @Override

  11. public void sayHello(GreeterOuterClass.HelloRequest request, StreamObserver<GreeterOuterClass.HelloReply> responseObserver) {

  12. String message = "Hello " + request.getName();

  13. final GreeterOuterClass.HelloReply.Builder replyBuilder = GreeterOuterClass.HelloReply.newBuilder().setMessage(message);

  14. responseObserver.onNext(replyBuilder.build());

  15. responseObserver.onCompleted();


  16. log.info("Returning " +message);

  17. }

  18. }

4.在grpc-client模块调用服务

(1) grpc需要开放接口,故需在application.yml指定端口,另外还需指定grpc-server地址和端口,这里将grpc-server的地址以环境变量的方式开放出来,默认在本地。yml文件如下

  1. server.port=8088

  2. spring.application.name= local-grpc-client

  3. grpc.client.local-grpc-server.host=${LOCAL-GRPC-HOST:127.0.0.1}

  4. grpc.client.local-grpc-server.port=9898

  5. grpc.client.local-grpc-server.enableKeepAlive= true

  6. grpc.client.local-grpc-server.keepAliveWithoutCalls=true

(2) 创建GrpcClientService服务类

  1. package com.li.grpcclient;


  2. import com.li.libserver.GreeterGrpc;

  3. import com.li.libserver.GreeterOuterClass;

  4. import io.grpc.Channel;

  5. import lombok.extern.slf4j.Slf4j;

  6. import net.devh.springboot.autoconfigure.grpc.client.GrpcClient;

  7. import org.springframework.stereotype.Service;


  8. @Service

  9. public class GrpcClientService {


  10. @GrpcClient("local-grpc-server")

  11. private Channel serverChannel;


  12. String sendMessage(String name) {

  13. GreeterGrpc.GreeterBlockingStub stub= GreeterGrpc.newBlockingStub(serverChannel);

  14. GreeterOuterClass.HelloReply response = stub.sayHello(GreeterOuterClass.HelloRequest.newBuilder().setName(name).build());

  15. return response.getMessage();


  16. }

  17. }

(3) 创建GrpcClientController类

  1. package com.li.grpcclient;


  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.web.bind.annotation.RequestMapping;

  4. import org.springframework.web.bind.annotation.RequestParam;

  5. import org.springframework.web.bind.annotation.RestController;


  6. @RestController

  7. public class GrpcClientController {


  8. @Autowired

  9. private GrpcClientService grpcClientService;


  10. @RequestMapping("/")

  11. public String printMessage(String name) {

  12. return grpcClientService.sendMessage(name);

  13. }

  14. }

四. 项目启动并测试 依次启动grpc-server和grpc-client,打开http://localhost:8088/?name=li即可看到结果

同时grpc-server项目日志输出如下

  1. 2019-03-03 20:39:19.297 INFO 5912 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'

  2. 2019-03-03 20:39:19.298 INFO 5912 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started

  3. 2019-03-03 20:39:19.321 INFO 5912 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 23 ms

  4. Returning Hello li

以上就是Spring Boot整合gRpc的简单项目,其他东西可以在官网进行学习

源码下载:https://github.com/LiHaodong888/SpringBootLearn

未经允许不得转载



文章转载自小东IT技术分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论