最近google发布了grpc1.0,数据交互使用了protocol buffer,相比之前使用的hession和json序列化方式性能应该提升不少,所有先搞一个grpc的hello world跑一下,项目使用maven搭建,并使用Eclipse开发。
一.使用Eclipse创建maven项目,添加pom配置
1.添加grpc1.0 maven依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <grpc.version>1.4.0</grpc.version><!-- CURRENT_GRPC_VERSION --> </properties> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-testing</artifactId> <version>${grpc.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> </dependencies>
2.配置protobuf maven插件
配置了protobuf 插件后,可以自动将.proto文件生成对应的java代码。
<build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.4.1.Final</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.0</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
配置完,整个pom.xml文件内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bijian</groupId> <artifactId>test-grpc</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>test-grpc</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <grpc.version>1.4.0</grpc.version><!-- CURRENT_GRPC_VERSION --> </properties> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-testing</artifactId> <version>${grpc.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.9.5</version> <scope>test</scope> </dependency> </dependencies> <build> <extensions> <extension> <groupId>kr.motd.maven</groupId> <artifactId>os-maven-plugin</artifactId> <version>1.4.1.Final</version> </extension> </extensions> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.0</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
二.编写proto文件helloworld.proto
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; option objc_class_prefix = "HLW"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
然后点击pom.xml右击->Run as->Maven install,将会在target/generatedo-sources下生成的对应的java代码,如下所示:
将生成的代码拷贝到src/main/java下,如下所示(有几处@java.lang.Override的编译错误,去掉即可):
三.编写grpc 服务端HelloWorldServer.java
package com.bijian.test_grpc; import io.grpc.Server; import io.grpc.ServerBuilder; import io.grpc.examples.helloworld.GreeterGrpc; import io.grpc.examples.helloworld.HelloReply; import io.grpc.examples.helloworld.HelloRequest; import io.grpc.stub.StreamObserver; import java.io.IOException; public class HelloWorldServer { private int port = 50051; private Server server; private void start() throws IOException { server = ServerBuilder.forPort(port) .addService(new GreeterImpl()) .build() .start(); System.out.println("service start..."); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { System.err.println("*** shutting down gRPC server since JVM is shutting down"); HelloWorldServer.this.stop(); System.err.println("*** server shut down"); } }); } private void stop() { if (server != null) { server.shutdown(); } } // block 一直到退出程序 private void blockUntilShutdown() throws InterruptedException { if (server != null) { server.awaitTermination(); } } public static void main(String[] args) throws IOException, InterruptedException { final HelloWorldServer server = new HelloWorldServer(); server.start(); server.blockUntilShutdown(); } // 实现 定义一个实现服务接口的类 private class GreeterImpl extends GreeterGrpc.GreeterImplBase { public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) { System.out.println("service:"+req.getName()); HelloReply reply = HelloReply.newBuilder().setMessage(("Hello: " + req.getName())).build(); responseObserver.onNext(reply); responseObserver.onCompleted(); } } }
四.编写grpc 客户端 HelloWorldClient.java
package com.bijian.test_grpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.examples.helloworld.GreeterGrpc; import io.grpc.examples.helloworld.HelloReply; import io.grpc.examples.helloworld.HelloRequest; import java.util.concurrent.TimeUnit; public class HelloWorldClient { private final ManagedChannel channel; private final GreeterGrpc.GreeterBlockingStub blockingStub; public HelloWorldClient(String host,int port){ channel = ManagedChannelBuilder.forAddress(host,port) .usePlaintext(true) .build(); blockingStub = GreeterGrpc.newBlockingStub(channel); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } public void greet(String name){ HelloRequest request = HelloRequest.newBuilder().setName(name).build(); HelloReply response = blockingStub.sayHello(request); System.out.println(response.getMessage()); } public static void main(String[] args) throws InterruptedException { HelloWorldClient client = new HelloWorldClient("127.0.0.1",50051); for(int i=0;i<5;i++){ client.greet("world:"+i); } } }
五.项目完整结构
六.项目运行结果
服务端
service start... service:world:0 service:world:1 service:world:2 service:world:3 service:world:4 三月 17, 2018 9:30:40 下午 io.grpc.netty.NettyServerTransport notifyTerminated
客户端
Hello: world:0 Hello: world:1 Hello: world:2 Hello: world:3 Hello: world:4
参考文章:http://blog.csdn.net/whzhaochao/article/details/52421867
相关推荐
在这个"grpc java版本demo"中,我们将探讨如何使用 Java 实现 GRPC 的客户端和服务器。 1. **Protocol Buffers (protobuf)**: protobuf 是一种轻量级的数据序列化协议,用于结构化数据的编码和解码。它支持多种编程...
在本文中,我们将详细介绍如何使用Maven来搭建一个gRPC Java项目,并提供一个简单的示例。gRPC是一个高性能、开源的通用RPC框架,它利用Protocol Buffers作为接口定义语言。Maven是Java项目管理和构建的工具,对于...
这个demo就是一个完整的vs项目,里面包含了所有依赖的grpc库,grpc库的编译方法以及grpc helloworld项目构建过程可以参考我的博文https://blog.csdn.net/weixin_28927079/article/details/97262243
标题 "grpc_grpc_protobuf_grpcdemo_" 暗示我们正在探讨的是一个使用gRPC、Protocol Buffers(protobuf)以及一个名为 "grpcdemo" 的示例项目。在这个项目中,我们将深入理解如何利用gRPC和protobuf进行高效、跨平台...
本资源是golang编写的grpc的使用例子。包含一个客户端、一个服务端。先启动服务端开启端口,再启动客户端。之后在客户端页面可以输入字符串,服务端会接收字符串,并进行处理,处理完之后发送到客户端接收端口。...
GRPC-Java 源码环境构建 GRPC-Java 源码环境构建是一个相对复杂的过程,需要具备一定的技术基础和经验。本文将详细介绍 GRPC-Java 源码环境构建的步骤和过程,旨在帮助读者快速搭建 GRPC-Java 源码环境。 一、...
在本文中,我们将深入探讨如何使用 C++ 实现一个简单的 gRPC 服务端 demo。首先,我们需要了解 gRPC 的核心概念和工作原理。 1. **gRPC 基本概念** - **RPC**:远程过程调用,允许一个程序调用另一个位于不同地址...
程序启动步骤1 启动服务端:运行 io/grpc/examples/helloworld/HelloWorldServer.java 的 main 方法2.启动客户端调用服务:运行:io/grpc/examples/helloworld/HelloWorldClient.java 的main 方法grpcThis guide ...
在"C#使用gRPC的Demo"中,我们将会看到一个完整的C#应用实例,它包括客户端(gRPCDemo.Client)、服务端(gRPCDemo.Server)以及项目解决方案文件(gRPCDemo.sln)。此外,run_gRPCTool.bat文件用于运行必要的gRPC...
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式...
protoc-gen-grpc-java-1.40.0-osx-aarch_64 mac arm芯片平台grpc生成java的支持。官网上面没有,这是基于源码编译生成的。 pom.xml:(protoc-gen-grpc-java-1.40.0.pom) <modelVersion>4.0.0 <groupId>io.grpc ...
总的来说,`protoc`和`protoc-gen-grpc-java`是gRPC Java开发中的关键工具,它们帮助开发者快速、高效地构建分布式系统,降低了跨语言通信的复杂性。通过使用这两者,你可以专注于业务逻辑,而不是底层网络通信的...
gRPC-java 1.9.0 已发布,gRPC-java 是谷歌 RPC 框架 gRPC 的 Java 实现。gRPC 是一个高性能、开源、通用的 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架。 gRPC 基于 ...
在这个“源码_GRPC_CPP_Demo.zip”压缩包中,我们找到了一个Windows下的GRPC C++示例程序,这对于理解和学习如何在Windows环境中使用GRPC和C++进行开发非常有帮助。 首先,让我们了解GRPC的基本概念。GRPC的核心是...
这个"grpc-java.rar"文件很可能包含了GRPC在Java平台上的示例和演示项目,帮助开发者理解如何在Java环境中使用GRPC进行服务间通信。 GRPC的核心概念包括: 1. **Protocol Buffers (protobuf)**:这是Google的一种...
2. 定义.proto文件:创建一个名为`helloworld.proto`的文件,定义一个简单的"Greeter"服务,包含一个SayHello方法,接受一个HelloRequest并返回一个HelloReply。 ```proto syntax = "proto3"; package helloworld; ...
标签“grpc”、“vs2015”和“demo”进一步强调了这个项目的关键特征:它是关于gRPC技术的,使用的是VS2015开发工具,而且是一个演示性质的客户端示例。 在“压缩包子文件的文件名称列表”中提到的“GrpcTest”可能...
《gRPC与云原生应用开发:以Go和Java为例》是卡山·因德拉西里和丹尼什·库鲁普合著的一本技术图书,深入探讨了gRPC这一高性能远程过程调用(RPC)框架在现代云原生应用开发中的应用。gRPC是一种跨语言、基于HTTP/2...
本篇文章将深入探讨这两个工具,并基于提供的“grpc、zmq通信效率测试demo”进行分析。 首先,`gRPC` 是由 Google 开源的一款高性能、开源和通用的 RPC (Remote Procedure Call) 框架,基于 HTTP/2 协议,支持多种...