热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot整合gprc传输对象

2019独角兽企业重金招聘Python工程师标准一,grpc简介:GRPC是google开源的一个高性能、跨语言的RPC框架,基于H

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

注意版本号,如果包版本不一致可能会有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. 1.3.0-RELEASE  
  2.   
  3.   
  4.   
  5.    net.devh  
  6.    grpc-server-spring-boot-starter  
  7.    ${grpc.stater.version}  
  8.   

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 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. 1.3.0-RELEASE

 

 

[html] view plain copy

  1.   
  2.    net.devh  
  3.    grpc-client-spring-boot-starter  
  4.    ${grpc.stater.version}  
  5.   

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中的一个接口,其他接口同理。


转载于:https://my.oschina.net/xiaominmin/blog/1801385


推荐阅读
  • 5分钟学会 gRPC
    5分钟学会gRPC-介绍我猜测大部分长期使用Java的开发者应该较少会接触gRPC,毕竟在Java圈子里大部分使用的还是DubboSpringClound这两类服务框架。我也是 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
author-avatar
249126059_a32331
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有