springboot整合gprc 传输对象

别来无恙 提交于 2020-04-06 21:54:12

一,grpc简介:

GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。GRPC与thrift、avro-rpc等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新。

    对于开发者而言:

    1)需要使用protobuf定义接口,即.proto文件

    2)然后使用compile工具生成特定语言的执行代码,比如JAVA、C/C++、Python等。类似于thrift,为了解决跨语言问题。

    3)启动一个Server端,server端通过侦听指定的port,来等待Client链接请求,通常使用Netty来构建,GRPC内置了Netty的支持。

    4)启动一个或者多个Client端,Client也是基于Netty,Client通过与Server建立TCP常链接,并发送请求;Request与Response均被封装成HTTP2的stream Frame,通过Netty Channel进行交互。

二,proto3:

 

Protocol Buffers是一个跨语言、跨平台的具有可扩展机制的序列化数据工具。也就是说,我在ubuntu下用python语言序列化一个对象,并使用http协议传输到使用java语言的android客户端,java使用对用的代码工具进行反序列化,也可以得到对应的对象。听起来好像跟json没有多大区别。。。其实区别挺多的。

Google说protobuf是smaller,faster,simpler,我们使用google规定的proto协议定义语言,之后使用proto的工具对代码进行“编译”,生成对应的各个平台的源代码,我们可以使用这些源代码进行工作。

 Proto2与proto3:

Proto2和proto3有些区别,包括proto语言的规范,以及生成的代码,proto3更好用,更简便,所以我们直接存proto3开始。

 

三,Grpc Spring Boot Starter

grpc对于springboot封装的Starter,

Grpc Spring Boot Starter地址:https://github.com/yidongnan/grpc-spring-boot-starter

1,用法:

          a, 使用proto3生成java文件:

 

[java] view plain copy

  1. <properties>  
  2.        <jackson.version>2.8.3</jackson.version>  
  3.        <grpc.version>1.6.1</grpc.version>  
  4.        <os.plugin.version>1.5.0.Final</os.plugin.version>  
  5.        <protobuf.plugin.version>0.5.0</protobuf.plugin.version>  
  6.        <protoc.version>3.3.0</protoc.version>  
  7.        <grpc.netty.version>4.1.14.Final</grpc.netty.version>  
  8.  </properties>  
  9.   
  10.  <dependencies>  
  11.   
  12.      <dependency>  
  13.          <groupId>io.grpc</groupId>  
  14.          <artifactId>grpc-netty</artifactId>  
  15.          <version>${grpc.version}</version>  
  16.      </dependency>  
  17.      <dependency>  
  18.          <groupId>io.grpc</groupId>  
  19.          <artifactId>grpc-protobuf</artifactId>  
  20.          <version>${grpc.version}</version>  
  21.      </dependency>  
  22.      <dependency>  
  23.          <groupId>io.grpc</groupId>  
  24.          <artifactId>grpc-stub</artifactId>  
  25.          <version>${grpc.version}</version>  
  26.      </dependency>  
  27.      <dependency>  
  28.          <groupId>io.netty</groupId>  
  29.          <artifactId>netty-common</artifactId>  
  30.          <version>${grpc.netty.version}</version>  
  31.      </dependency>  
  32.   
  33.      <dependency>  
  34.         <groupId>com.fasterxml.jackson.core</groupId>  
  35.         <artifactId>jackson-annotations</artifactId>  
  36.         <version>${jackson.version}</version>  
  37.     </dependency>  
  38.   
  39.   
  40.   
  41.   
  42.      <dependency>  
  43.         <groupId>com.fasterxml.jackson.core</groupId>  
  44.         <artifactId>jackson-core</artifactId>  
  45.         <version>${jackson.version}</version>  
  46.     </dependency>  
  47.   
  48.      <dependency>  
  49.         <groupId>com.fasterxml.jackson.core</groupId>  
  50.         <artifactId>jackson-databind</artifactId>  
  51.         <version>${jackson.version}</version>  
  52.     </dependency>  
  53.  </dependencies>  
  54.   
  55.   
  56.    <build>  
  57.        <extensions>  
  58.            <extension>  
  59.                <groupId>kr.motd.maven</groupId>  
  60.                <artifactId>os-maven-plugin</artifactId>  
  61.                <version>${os.plugin.version}</version>  
  62.            </extension>  
  63.        </extensions>  
  64.        <plugins>  
  65.            <plugin>  
  66.                <groupId>org.xolstice.maven.plugins</groupId>  
  67.                <artifactId>protobuf-maven-plugin</artifactId>  
  68.                <version>${protobuf.plugin.version}</version>  
  69.                <configuration>  
  70.                    <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>  
  71.                    <pluginId>grpc-java</pluginId>  
  72.                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>  
  73.                </configuration>  
  74.                <executions>  
  75.                    <execution>  
  76.                        <goals>  
  77.                            <goal>compile</goal>  
  78.                            <goal>compile-custom</goal>  
  79.                        </goals>  
  80.                    </execution>  
  81.                </executions>  
  82.            </plugin>  
  83.        </plugins>  
  84.    </build>  

注意版本号,如果包版本不一致可能会有classnotFound的error

b,编写proto3文件,

[java] view plain copy

  1. syntax = "proto3";  
  2.   
  3. option java_multiple_files = true;  
  4. option java_package = "com.aiccms.device.grpc.lib";  
  5. option java_outer_classname = "DeviceFixProto";  
  6. option objc_class_prefix = "HLW";  
  7.   
  8. package device;  
  9.   
  10. // The device service definition.  
  11. service DeviceFixService {  
  12.     // Sends a message  
  13.     rpc insertDeviceFix (deviceFix) returns (booleanReply){}  
  14.     rpc updateDeviceFix (deviceFix) returns (booleanReply){}  
  15.     rpc searchDeviceFix (conditionsRequest) returns (deviceFix){}  
  16.     rpc deleteDeviceFix (conditionsRequest) returns (booleanReply){}  
  17. }  
  18.   
  19.   
  20. // The request message .  
  21. message conditionsRequest {  
  22.      string id = 1;  
  23. }  
  24. message deviceFix {  
  25.      string id=1;  
  26.      string serialNum=2;  
  27.      string userNum=3;  
  28.      int32  status=4;  
  29.      int32  type=5;  
  30.      string address=6;  
  31.      string createtime=7;  
  32.      string updatetime=8;  
  33. }  
  34.   
  35. // The response message  
  36. message booleanReply {  
  37.     bool reply = 1;  
  38. }  
  39.   
  40. // The response message  
  41. message objectReply {  
  42.     bool reply = 1;  
  43. }  

  编写proto3文件,开头syntax中要指定为proto3版本。其他语法这里不做详细介绍。

c,使用mvn命令 protobuf:compile 和protobuf:compile-custom命令编译生成java文件

生成之后的文件在target目录中 

注意:proto目录与java目录同级

d,以上这些都在一个公共的工程当中,因为这些类不管是客户端和服务端都要使用。

e,编写grpc服务端,首先添加maven依赖

[html] view plain copy

  1. <grpc.stater.version>1.3.0-RELEASE</grpc.stater.version>  
  2.   
  3.   
  4. <dependency>  
  5.    <groupId>net.devh</groupId>  
  6.    <artifactId>grpc-server-spring-boot-starter</artifactId>  
  7.    <version>${grpc.stater.version}</version>  
  8. </dependency>  
f,服务端代码

[html] view plain copy

  1. /**  
  2.  * User: hmemb  
  3.  * Email: 949530857@qq.com  
  4.  * Date: 2018/1/9  
  5.  */  
  6. @Slf4j  
  7. @GrpcService(DeviceFixServiceGrpc.class)  
  8. public class deviceGrpcService extends DeviceFixServiceGrpc.DeviceFixServiceImplBase{  
  9.   
  10.     @Autowired  
  11.     private IDevicesFixService deviceService;  
  12.       
  13.     @Override  
  14.     public void insertDeviceFix(deviceFix request, StreamObserver<booleanReply> responseObserver) {  
  15.          DevicesFix deviceFix = DevicesFix.builder().id(request.getId())  
  16.                                                     .serialNum(request.getSerialNum())  
  17.                                                     .address(request.getAddress())  
  18.                                                     .createtime(DateUtil.toDate(request.getCreatetime(), DatePattern.TIMESTAMP))  
  19.                                                     .updatetime(DateUtil.toDate(request.getUpdatetime(), DatePattern.TIMESTAMP))  
  20.                                                     .userNum(request.getUserNum())  
  21.                                                     .status(request.getStatus())  
  22.                                                     .type(request.getType())  
  23.                                                     .build();  
  24.          log.info(deviceFix.toString());  
  25.          boolean replyTag = deviceService.insert(deviceFix);  
  26.          booleanReply reply = booleanReply.newBuilder().setReply(replyTag).build();  
  27.          responseObserver.onNext(reply);  
  28.          responseObserver.onCompleted();  
  29.     }  

g,在配置文件中添加配置信息

 

[html] view plain copy

  1. #grpc server config  
  2. spring.application.name: device-grpc-server  
  3. grpc.server.port:7052  

 

h,编写客户端代码:引入maven依赖

 

[html] view plain copy

  1. <grpc.stater.version>1.3.0-RELEASE</grpc.stater.version  

 

 

[html] view plain copy

  1. <dependency>  
  2.    <groupId>net.devh</groupId>  
  3.    <artifactId>grpc-client-spring-boot-starter</artifactId>  
  4.    <version>${grpc.stater.version}</version>  
  5. </dependency>  
i,编写gprc接口实现,注解@grpcClient 填写grpc接口名称
 

[java] view plain copy

  1. /** 
  2.  * User: hmemb 
  3.  * Email: 949530857@qq.com 
  4.  * Date: 2018/01/19 
  5.  */  
  6. @Service  
  7. @Slf4j  
  8. public class DeviceGrpcService {  
  9.   
  10.     @GrpcClient("device-grpc-server")  
  11.     private Channel serverChannel;  
  12.   
  13.     public String insertDeviceFix( ){  
  14.         DeviceFixServiceGrpc.DeviceFixServiceBlockingStub stub = DeviceFixServiceGrpc.newBlockingStub(serverChannel);  
  15.         booleanReply response = stub.insertDeviceFix(  
  16.                 deviceFix.newBuilder()  
  17.                                 .setId("UUID-O1")  
  18.                                 .setSerialNum("AUCCMA-01")  
  19.                                 .setAddress("SHENZHEN")  
  20.                                 .setCreatetime(DateUtil.toString(new Date(), DatePattern.TIMESTAMP))  
  21.                                 .setUpdatetime(DateUtil.toString(new Date(), DatePattern.TIMESTAMP))  
  22.                                 .setStatus(1)  
  23.                                 .setType(1)  
  24.                 .build());  
  25.         log.info("grpc消费者收到:--》"+response.getReply());  
  26.         if(response.getReply()){  
  27.         return "success";  
  28.         }else{  
  29.         return "fail";  
  30.         }  
  31.     }  
  32. }  


j,配置文件中加入接口的服务端地址,grpc.client.[服务器规定的接口名称].post/host

 
 

[html] view plain copy

  1. grpc.client.device-grpc-server.host:127.0.0.1  
  2. grpc.client.device-grpc-server.port:7052  



k,封装成http rest接口测试

 

[java] view plain copy

  1. /** 
  2.  * @Author:Hmemb 
  3.  * @Description: 
  4.  * @Date:Created in 18:24 2018/1/18 
  5.  */  
  6. @RestController  
  7. @Api(value = "Testcontroller", description = "测试swagger")  
  8. public class Testcontroller {  
  9.   
  10.   
  11.     @Autowired  
  12.     private DeviceGrpcService deviceGrpcService;  
  13.   
  14.   
  15.     @RequestMapping("/testInsertDeviceFix")  
  16.     @ApiOperation(value = "test", httpMethod = "GET", notes = "测试grpc插入")  
  17.     public String printMessage3(@RequestParam(defaultValue = "Hmemb") String name) {  
  18.         return deviceGrpcService.insertDeviceFix();  
  19.     }  
  20.     @RequestMapping("/TEST1")  
  21.     @ApiOperation(value = "test", httpMethod = "GET", notes = "测试1")  
  22.     public String printMessage(@RequestParam(defaultValue = "Michael") String name) {  
  23.         return name;  
  24.     }  
  25. }  

 

l,接口测试结果

 

 

 

 
我只实现了proto中的一个接口,其他接口同理。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!