`
zk_chs
  • 浏览: 215647 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Grpc应用,基本实现

阅读更多

使用grpc可以用来进行不同系统之间的信息交互,而且grpc不限于java,使用同一个proto文件可以在不同的编程语言之间交互。


上面这张图介绍了proto文件的语法,对应proto3.0,具体更多的内容请参考文档:

http://www.grpc.io/docs/#generating-grpc-code

 

 

下面我们先讲一下如何在java中通过proto文件生成java代码,然后再讲如何使用。

添加如下依赖与插件:

Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>io.grpc</groupId>  
  3.     <artifactId>grpc-all</artifactId>  
  4.     <version>0.14.0</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>com.google.protobuf</groupId>  
  8.     <artifactId>protobuf-java</artifactId>  
  9.     <version>3.0.0-beta-2</version>  
  10. </dependency>  
  11.   
  12.   
  13.     <build>  
  14.         <extensions>  
  15.             <extension>  
  16.                 <groupId>kr.motd.maven</groupId>  
  17.                 <artifactId>os-maven-plugin</artifactId>  
  18.                 <version>1.4.1.Final</version>  
  19.             </extension>  
  20.         </extensions>  
  21.         <plugins>  
  22.   
  23.             <!-- protobuf -->  
  24.             <plugin>  
  25.                 <groupId>org.xolstice.maven.plugins</groupId>  
  26.                 <artifactId>protobuf-maven-plugin</artifactId>  
  27.                 <version>0.5.0</version>  
  28.                 <configuration>  
  29.                     <protocArtifact>com.google.protobuf:protoc:3.0.0-beta-2:exe:${os.detected.classifier}</protocArtifact>  
  30.                     <pluginId>grpc-java</pluginId>  
  31.                     <pluginArtifact>io.grpc:protoc-gen-grpc-java:0.14.0:exe:${os.detected.classifier}</pluginArtifact>  
  32.                     <protoSourceRoot>src/main/resources/proto</protoSourceRoot>  
  33.                 </configuration>  
  34.                 <executions>  
  35.                     <execution>  
  36.                         <goals>  
  37.                             <goal>compile</goal>  
  38.                             <goal>compile-custom</goal>  
  39.                         </goals>  
  40.                     </execution>  
  41.                 </executions>  
  42.             </plugin>  
  43.   
  44.         </plugins>  
  45.     </build>  

这样一来,在进行mvn compile时,会自动去src/main/resources/proto目录下查找proto文件,并在target目录里生成对应的.java、.class文件。

 

 

下面我们写一个服务端、一个客户端的helloworld程序,proto文件如下:

Java代码  收藏代码
  1. syntax = "proto3";  
  2.   
  3. package grpc;  
  4.   
  5. option java_package = "com.zk_chs.grpc";  
  6. option java_outer_classname = "HelloWorldServiceProto";  
  7. option java_multiple_files = true;  
  8.   
  9. service HelloWorldService {  
  10.   rpc SayHello (HelloWorldRequest) returns (HelloWorldResponse) {}  
  11. }  
  12.   
  13. message HelloWorldRequest {  
  14.   string request = 1;  
  15. }  
  16.   
  17. message HelloWorldResponse {  
  18.   string response = 1;  
  19. }  

当有option java_package存在时,会覆盖package属性,生成的文件如下:

 

 

 

接下来,需要先实现我们定义的HelloWorldService服务接口,该接口只需在服务端实现,客户端不用实现:

Java代码  收藏代码
  1. public class HelloWorldRpcServiceImpl implements HelloWorldRpcServiceGrpc.HelloWorldRpcService {  
  2.   
  3.     @Override  
  4.     public void sayHello(HelloWorldRequest request, StreamObserver<HelloWorldResponse> responseObserver) {  
  5.         String req = request.getRequest();  
  6.         HelloWorldResponse resp = HelloWorldResponse.newBuilder()  
  7.                 .setResponse("hello " + req)  
  8.                 .build();  
  9.         responseObserver.onNext(resp);  
  10.         responseObserver.onCompleted();  
  11.     }  
  12.   
  13. }  

 

服务端实现:

Java代码  收藏代码
  1. public class GrpcServer {  
  2.   
  3.     private final int port = 38628;  
  4.   
  5.     private Server server;  
  6.   
  7.     private void start() throws IOException {  
  8.         server = ServerBuilder.forPort(port)  
  9.                 .addService(HelloWorldRpcServiceGrpc.bindService(new HelloWorldRpcServiceImpl())) // 能继续使用.addService添加多个服务  
  10.                 .build()  
  11.                 .start();  
  12.         Runtime.getRuntime().addShutdownHook(new Thread() {  
  13.             @Override  
  14.             public void run() {  
  15.                 GrpcServer.this.stop();  
  16.             }  
  17.         });  
  18.     }  
  19.   
  20.     private void stop() {  
  21.         if (server != null) {  
  22.             server.shutdown();  
  23.         }  
  24.     }  
  25.   
  26.     private void blockUntilShutdown() throws InterruptedException {  
  27.         if (server != null) {  
  28.             server.awaitTermination();  
  29.         }  
  30.     }  
  31.   
  32.     public static void main(String[] args) throws IOException, InterruptedException {  
  33.         final GrpcServer server = new GrpcServer();  
  34.         server.start();  
  35.         server.blockUntilShutdown();  
  36.     }  
  37.       
  38. }  

 

客户端实现:

Java代码  收藏代码
  1. public class GrpcClient {  
  2.   
  3.     private final ManagedChannel channel;  
  4.     private final HelloWorldRpcServiceGrpc.HelloWorldRpcServiceBlockingStub blockingStub;  
  5.   
  6.     public GrpcClient(String host, int port) {  
  7.         channel = ManagedChannelBuilder.forAddress(host, port)  
  8.                 .usePlaintext(true)  
  9.                 .build();  
  10.         blockingStub = HelloWorldRpcServiceGrpc.newBlockingStub(channel);  
  11.     }  
  12.   
  13.     public void shutdown() throws InterruptedException {  
  14.         channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);  
  15.     }  
  16.   
  17.     public String request(String req) {  
  18.         HelloWorldRequest request = HelloWorldRequest.newBuilder()  
  19.                 .setRequest(req)  
  20.                 .build();  
  21.         return blockingStub.sayHello(request).getResponse();  
  22.     }  
  23.   
  24.     public static void main(String[] args) throws Exception {  
  25.         GrpcClient client = new GrpcClient("localhost"38628);  
  26.         String req = "world!";  
  27.         String response = client.request(req);  
  28.         System.out.println(response);  
  29.     }  
  30.   
  31. }  

 

 

然后进行测试,首先启动GrpcServer,再运行GrpcClient,在client的控制台能看到如下信息:

 

 

一个简易的grpc服务就完成了,当然,还有很多的不足:

1、例如异常信息处理(grpc有内置的异常信息)

2、连接每次都会断开,没有重复利用,效率低

 

下次的博客大概会介绍一下解决方法,比如采用commons-pool2连接池

 

Grpc应用,基本实现,http://zk-chs.iteye.com/blog/2308422

Grpc应用,搭配commons-pool2连接池实现连接复用,http://zk-chs.iteye.com/blog/2308730

1
4
分享到:
评论
2 楼 chenglinjava 2016-10-27  
grpc client 不是与server 端建立长连接了吗 怎麼还存在每次都要重连  另外 使用连接池之后连接复用   性能会提高 有测试过吗
1 楼 7454103 2016-07-01  

相关推荐

    基于c++实现的GRPC服务端demo

    1. **gRPC 基本概念** - **RPC**:远程过程调用,允许一个程序调用另一个位于不同地址空间(通常在不同机器上)的程序。 - **Protocol Buffers**:Google 提出的一种数据序列化协议,可以将结构化的数据序列化,可...

    gRPC与云原生应用开发:以Go和Java为例(图灵图书) by 卡山·因德拉西里 丹尼什·库鲁普 (z-lib.org)1

    此外,还讨论了如何利用拦截器、截止时间、取消、错误处理、多路复用和元数据等功能来增强gRPC应用的功能和性能。 安全是gRPC的重要方面,书中详细介绍了如何通过TLS进行通道认证,以及启用单向和双向安全连接。...

    GRPC简单应用(Java+Python)

    在本文中,我们将深入探讨如何在Java和Python中实现GRPC的基本应用。 一、GRPC简介 GRPC的核心理念是定义服务接口,这些接口可以在不同的语言中实现,客户端和服务端通过这些接口进行通信。接口定义文件通常使用....

    c++grpc实现代码c++grpc实现代码

    **C++ gRPC 实现详解** ...综上所述,C++ gRPC 实现涉及了服务定义、编译、服务端和客户端的代码生成与实现,以及 gRPC 的特性和应用场景。通过熟练掌握这些知识,开发者能够构建出高性能、可扩展的分布式系统。

    Go-grpchealthprobe检查gRPC应用程序运行状况的命令行工具

    `grpc_health_probe` 是一个用于检查gRPC服务健康状态的命令行工具,它由Go语言编写,专门设计来探测gRPC应用程序的运行状况。在分布式系统中,监控和确保服务的健康运行至关重要,`grpc_health_probe` 提供了一个...

    grpc 实现oauth ssl

    在实际项目中,文件"GrpcService"可能包含了实现这些功能的具体代码,例如定义gRPC服务接口、设置SSL/TLS配置、实现OAuth2拦截器等。理解并实现这些概念和机制,对于构建安全、可靠的分布式系统至关重要。 总结来说...

    C#使用gRPC的Demo

    在"C#使用gRPC的Demo"中,我们将会看到一个完整的C#应用实例,它包括客户端(gRPCDemo.Client)、服务端(gRPCDemo.Server)以及项目解决方案文件(gRPCDemo.sln)。此外,run_gRPCTool.bat文件用于运行必要的gRPC...

    c#:grpc初体验,实例代码

    【标题】:“C#:gRPC初体验,实例代码”是指使用C#语言进行gRPC框架的初步尝试,通过实际的编码示例来理解和学习gRPC的基本用法。gRPC是一个高性能、开源和通用的RPC(远程过程调用)框架,它基于HTTP/2协议设计,...

    深入浅出gRPC-李林峰.zip

    10. **最佳实践与案例分析**:提供实际项目中的gRPC应用示例,分享如何设计和优化gRPC服务的实战经验。 通过阅读《深入浅出gRPC》,读者不仅可以学习到gRPC的基础知识,还能掌握如何在实际项目中有效利用gRPC提升...

    开源项目-grpc-grpc-go.zip

    5. **test**: 测试代码和示例,帮助开发者理解和验证gRPC Go库的功能,同时提供了编写gRPC应用的基本模板。 6. **examples**: 包含了各种gRPC服务和客户端的示例,涵盖了基本的单服务示例到更复杂的用例,如负载...

    最新grpc库和头文件

    总之,这个压缩包提供的GRPC库和头文件为VS2015用户节省了编译时间,使他们能够更快地开始GRPC应用的开发。只需按照GRPC的工作流程,结合protobuf定义,即可轻松构建高性能、安全的分布式系统。

    grpc库库VS2015-win32_x64release与debug(包含命令),头文件.zip

    在这个“grpc库库VS2015-win32_x64release与debug(包含命令)”的压缩包中,包含了在Windows平台上使用Visual Studio 2015开发GRPC应用所需的关键组件。 首先,GRPC的核心是Protocol Buffers(protobuf),这是一种...

    GRPCdemo.zip

    GRPC是一种高性能、开源、通用的RPC框架,它基于...总之,“GRPCdemo.zip”提供的示例可以帮助开发者快速理解并实践GRPC在iOS项目中的集成,通过学习和实践,可以掌握GRPC的基本用法,提高iOS应用的通信效率和功能。

    gRPC: Up and Running

    这本书深入浅出地介绍了gRPC的基础知识,通过真实的案例帮助读者理解这个高性能的进程间通信协议在微服务架构中的应用。gRPC不仅能够连接多语言服务,还提供了一个丰富的框架来定义服务合同和数据类型。书中包含用Go...

    Java使用grpc需要使用的jar包

    在开发过程中,除了这些基本的依赖,还可能需要其他的库,比如gRPC的客户端和服务端实现、gRPC-stub(用于生成客户端代码)以及gRPC的protobuf编译器protoc等。在遇到问题时,查阅gRPC官方文档和社区资源通常能获得...

    grpc-calculator.zip

    【grpc-calculator.zip】是一个基于Golang实现的gRPC入门示例,主要包含了一个简单的计算器应用。gRPC是一个高性能、...通过学习这个示例,开发者可以理解gRPC的基本工作原理,并能够将其应用到自己的分布式系统中。

    grpc-vs2017-x64-release.7z

    在使用时,开发者需要理解gRPC的基本概念,如服务定义、protobuf消息类型、客户端和服务端的创建等,才能有效地利用这个库。同时,还需要熟悉C++编程和Visual Studio 2017的项目设置,以便将gRPC集成到自己的应用...

    gRPC源码下载,可直接编译

    gRPC 是一个高性能、开源和通用的 RPC (远程过程调用) 框架,它由 Google 创建并维护,旨在连接微服务并构建分布式应用程序。gRPC 基于 HTTP/2 协议,支持多种编程语言,包括 C++, Java, Go, Python, Ruby 等,提供...

    利用grpc实现的c\s通信例子,官网helloworld实例代码

    8. **扩展应用**:虽然这个例子非常基础,但它展示了 GRPC 的基本工作原理和使用方式。实际项目中,你可以根据需要定义更复杂的服务和消息类型,以满足各种分布式系统的需求。 理解并实践这个示例,对于学习 GRPC ...

    gRPC源码(2023.06.30左右下载)

    gRPC 是一个高性能、开源和通用的 RPC (远程过程调用) 框架,它由 Google 创建并广泛应用于微服务架构中。2023年6月30日左右下载的gRPC源码提供了深入了解这个框架内部工作原理的机会。 1. **gRPC基本概念** gRPC...

Global site tag (gtag.js) - Google Analytics