热门标签 | 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


推荐阅读
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
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社区 版权所有