最近google发布了grpc1.0,数据交互使用了protocol buffer,相比之前使用的hession和json序列化方式性能应该提升不少,所有先搞一个grpc的hello world跑一下,项目使用maven搭建,并使用Eclipse开发。
一.使用Eclipse创建maven项目,添加pom配置
1.添加grpc1.0 maven依赖
UTF-8 1.4.0 io.grpc grpc-netty ${grpc.version} io.grpc grpc-protobuf ${grpc.version} io.grpc grpc-stub ${grpc.version} io.grpc grpc-testing ${grpc.version} test junit junit 4.11 test org.mockito mockito-core 1.9.5 test
2.配置protobuf maven插件
配置了protobuf 插件后,可以自动将.proto文件生成对应的java代码。
kr.motd.maven os-maven-plugin 1.4.1.Final org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} compile compile-custom
配置完,整个pom.xml文件内容如下:
4.0.0 com.bijian test-grpc 0.0.1-SNAPSHOT jar test-grpc http://maven.apache.org UTF-8 1.4.0 io.grpc grpc-netty ${grpc.version} io.grpc grpc-protobuf ${grpc.version} io.grpc grpc-stub ${grpc.version} io.grpc grpc-testing ${grpc.version} test junit junit 4.11 test org.mockito mockito-core 1.9.5 test kr.motd.maven os-maven-plugin 1.4.1.Final org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} compile compile-custom
二.编写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, StreamObserverresponseObserver) { 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