netty学习十:google grpc框架环境搭建以及第一个demo

概述


本文将会介绍两部分内容:
1、window 7 上搭建grpc环境;
2、构建关于grpc的java小demo.


下载grpc java依赖包


为了能生成针对java的grpc客户端和服务端代码(官方叫stub),需要下载一些java包和grpc编译器以及一些gradle 插件

java依赖包

compile ‘io.grpc:grpc-netty:1.4.0’
compile ‘io.grpc:grpc-protobuf:1.4.0’
compile ‘io.grpc:grpc-stub:1.4.0’

gradle构建脚本

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.1'
  }
}

protobuf {
  protoc {
    artifact = "com.google.protobuf:protoc:3.2.0"
  }
  plugins {
    grpc {
      artifact = 'io.grpc:protoc-gen-grpc-java:1.4.0'
    }
  }
  generateProtoTasks {
    all()*.plugins {
      grpc {}
    }
  }
}

使用gradle命令

gradle clean build

由于要下载很多依赖包,时间会比较长.

备注

最好使用gradle 3来构建,gradle 2太旧了


编写proto文件


src/main/proto/grpc/firstdemo/Student.proto

syntax = "proto3";
package firstdemo;
option optimize_for=SPEED;
option java_package="firstdemo";
option java_outer_classname="StudentProto";
option java_multiple_files=true;

service StudentService {
    rpc getRealname(RequestInfo) returns (ResponseInfo) {}
}

message RequestInfo {
    string username = 1;
}

message ResponseInfo {
    string realname = 1;
}

注意这里需要使用proto3

syntax = “proto3”;


生成gprc java stub类


先执行

gradle clean build

再执行

gradle generateProto

执行成功后,会生成如下目录

grpc
java

将两个目录下的java文件拷贝到

src/main/proto/grpc/firstdemo/generated

拷贝完后src/main/proto/grpc/firstdemo/generated目录下会有如下文件

RequestInfo.java
ResponseInfo.java
ResponseInfoOrBuilder.java
StudentProto.java
StudentServiceGrpc.java

备注

集成grpc后,不能再使用之前的proto2的protoc编译命令了,这个命令只是会生成用于传递的消息对象,并不会生成客户端好服务端的stub类


编写业务实现类


package grpc.firstdemo.server;

import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceImplBase;
import io.grpc.stub.StreamObserver;

public class StudentBizService extends StudentServiceImplBase{

    @Override
    public void getRealname(RequestInfo request, StreamObserver responseObserver) {
        System.out.println("接收到客户端的信息:"+request.getUsername());
        ResponseInfo responseInfo = ResponseInfo.newBuilder().setRealname("Sam").build();
        responseObserver.onNext(responseInfo);
        responseObserver.onCompleted();
    }
}

需要继承StudentServiceImplBase类,覆盖getRealname方法.


服务端代码


package grpc.firstdemo.server;

import java.io.IOException;

import io.grpc.Server;
import io.grpc.ServerBuilder;

public class GrpcServer {
   private Server server;

   private void start() throws IOException {
       this.server = ServerBuilder.forPort(8899)
                     .addService(new StudentBizService())
                     .build().start();
       System.out.println("server started");

       Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {
            GrpcServer.this.stop();
        }
    }));
   }

   private void stop() {
       if (this.server != null) {
           this.server.shutdown();
       }
   }

   private void awaitTermination() throws InterruptedException {
       if (this.server != null) {
           this.server.awaitTermination();
       }
   }

   public static void main(String[] args) throws IOException, InterruptedException {
    GrpcServer grpcServer = new GrpcServer();
    grpcServer.start();
    //让grpc server启动后,处于等待状态,监听客户端请求
    grpcServer.awaitTermination();
}
}

客户端代码


package grpc.firstdemo.client;

import grpc.firstdemo.generated.RequestInfo;
import grpc.firstdemo.generated.ResponseInfo;
import grpc.firstdemo.generated.StudentServiceGrpc;
import grpc.firstdemo.generated.StudentServiceGrpc.StudentServiceBlockingStub;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class GrpcClient {

    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8899)
                             .usePlaintext(true)
                             .build();

        StudentServiceBlockingStub blockStub = StudentServiceGrpc.newBlockingStub(channel);
        ResponseInfo responseInfo = blockStub.getRealname(RequestInfo.newBuilder().setUsername("sam").build());
        System.out.println(responseInfo.getRealname());
    }
}

运行代码


分别运行GrpcServer类和GrpcClient类的main方法,启动服务端和客户端,正常情况下会打印如下日志:

接收到客户端的信息:sam


csdn code 路径


这个项目的源代码放置在csdn code上,欢迎访问。
netty_study

你可能感兴趣的:(#,netty)