grpc java helloworld简单demo开发

阅读更多

  最近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代码,如下所示:

grpc java helloworld简单demo开发_第1张图片
  将生成的代码拷贝到src/main/java下,如下所示(有几处@java.lang.Override的编译错误,去掉即可):

grpc java helloworld简单demo开发_第2张图片
 

三.编写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 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);
        }
    } 
}

 

五.项目完整结构

grpc java helloworld简单demo开发_第3张图片
 

六.项目运行结果

        服务端

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 helloworld简单demo开发_第4张图片
  • 大小: 15 KB
  • grpc java helloworld简单demo开发_第5张图片
  • 大小: 11.6 KB
  • grpc java helloworld简单demo开发_第6张图片
  • 大小: 9.2 KB
  • 查看图片附件

你可能感兴趣的:(grpc)