springboot整合gprc 傳輸對象

一,grpc簡介:html

GRPC是google開源的一個高性能、跨語言的RPC框架,基於HTTP2協議,基於protobuf 3.x,基於Netty 4.x +。GRPC與thrift、avro-rpc等其實在整體原理上並無太大的區別,簡而言之GRPC並無太多突破性的創新。java

    對於開發者而言:python

    1)須要使用protobuf定義接口,即.proto文件android

    2)而後使用compile工具生成特定語言的執行代碼,好比JAVA、C/C++、Python等。相似於thrift,爲了解決跨語言問題。git

    3)啓動一個Server端,server端經過偵聽指定的port,來等待Client連接請求,一般使用Netty來構建,GRPC內置了Netty的支持。github

    4)啓動一個或者多個Client端,Client也是基於Netty,Client經過與Server創建TCP常連接,併發送請求;Request與Response均被封裝成HTTP2的stream Frame,經過Netty Channel進行交互。spring

二,proto3:json

 

Protocol Buffers是一個跨語言、跨平臺的具備可擴展機制的序列化數據工具。也就是說,我在ubuntu下用python語言序列化一個對象,並使用http協議傳輸到使用java語言的android客戶端,java使用對用的代碼工具進行反序列化,也能夠獲得對應的對象。聽起來好像跟json沒有多大區別。。。其實區別挺多的。ubuntu

Google說protobuf是smaller,faster,simpler,咱們使用google規定的proto協議定義語言,以後使用proto的工具對代碼進行「編譯」,生成對應的各個平臺的源代碼,咱們可使用這些源代碼進行工做。springboot

 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中的一個接口,其餘接口同理。
相關文章
相關標籤/搜索