GRPC-java的简单使用

GRPC的简介

(1)在gRPC中客户端能够直接调用运行在不一样机器上服务器端的方法,与其它RPC(远程方法调用)同样,定义一个方法,能够被远程使用参数调用,而后经过返回值进行响应。
(2)服务器端运行gRPC服务来处理客户端的调用,客户端保存着服务器端的存根——提供服务器端的方法,来决定调用哪一个方法。
(3)服务器端与客户端经过protocol buffers进行通讯,谷歌本身的开源的数据序列化结构。 如图:
grpc原理html

简单的demo(源代码地址)

目的:客户端向服务器端发送请求计算两个字符串相加,服务器端返回结果
工具:IDEA+mavenjava

(1)编写 proto文件

syntax="proto3";//使用的版本
option java_package="nwpu.cn.grpc.api";//生成class文件所在的包
option java_outer_classname="GrpcAddApi";//class文件的名称
option java_multiple_files=true;//若是是false 每一个message和service都会是java_outer_classname的内部类,相反则单独生成类文件,防止生成类文件过大

package nwpu.cn.grpc.api;

//服务接口定义,服务端和客户端都要遵循该接口进行通讯
service RPCAddService{
  //接收请求,返回响应
    rpc getAdd(RPCAddRequest) returns(RPCAddResponse){}
}
//定义请求消息
message RPCAddRequest{
    string first=1;
    string second=2;
}
//定义响应消息
message RPCAddResponse{
    string result=1;
}

(2)添加maven依赖(参考grpc-java)

<build>
        <extensions>
		  <!--os-maven-plugin:生成平台无关的属性-->
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.5.0.Final</version>
            </extension>
        </extensions>
        <plugins>
		  <!--protobuf-maven-plugin:执行Protocol Buffers命令并生成Stub代码库-->
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.17.1:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--加入grpc相关依赖   包括hrpc-netty、Grpc-protobuf、grpc-stub-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.17.1</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.17.1</version>
        </dependency>
    </dependencies>

(3)服务器端实现

/*
public static abstract class RPCAddServiceImplBase implements io.grpc.BindableService
注意这里是一个 BindableService类,服务器端发布服务的使用就是使用io.grpc.Server中的addService()方法将BindableService服务添加进去
参考GPCServer.java的实验与API
*/
RPCAddServiceImpl.java
public class RPCAddServiceImpl extends RPCAddServiceGrpc.RPCAddServiceImplBase{
    @Override
    public void getAdd(RPCAddRequest request, StreamObserver<RPCAddResponse> responseObserver) {
        RPCAddResponse rpcAddResponse=null;
        String result=request.getFirst()+request.getSecond();
       try{
           rpcAddResponse=RPCAddResponse.newBuilder().setResult(result).build();
       }catch (Exception e){
           responseObserver.onError(e);
       }finally {
           responseObserver.onNext(rpcAddResponse);
       }
       responseObserver.onCompleted();
    }
}
public class GRPCServer {
    private static final int port=9999;
    public static void main(String argc[]) throws IOException, InterruptedException {
	//添加服务
        Server server= ServerBuilder.forPort(port).addService(new RPCAddServiceImpl())
                .build().start();
        System.out.println("Grpc服务器启动,端口="+port);
		//等待客户端的链接
        server.awaitTermination();
    }
}

(3)客户端的实现

public class GRPCClient {
    private static final String host="localhost";
    private static final int serverport=9999;
    public static void main(String[] args) throws Exception{
	   /*
        ManagedChannel 提供生命周期管理的通道
         ManagedChannelBuilder 建立 ManagedChannel实例
         forAddress() 使用目标地址和端口建立channel
         usePlaintext() 使用服务器的明文链接
         与其相对应的 useTransportSecuriry() 使用TLS加密
         */
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, serverport).usePlaintext().build();
       try {

           RPCAddServiceGrpc.RPCAddServiceBlockingStub rpcAddService = RPCAddServiceGrpc.newBlockingStub(managedChannel);
           RPCAddRequest rpcAddRequest = RPCAddRequest.newBuilder().setFirst("1").setSecond("2").build();
           RPCAddResponse rpcAddResponse = rpcAddService.getAdd(rpcAddRequest);
           System.out.println(rpcAddResponse.getResult());
       }finally {
           managedChannel.shutdown();
       }
    }
}

参考资料

CodeSheep
CodeSheep / Maven_gRPC
grpc官网
API
grpc-java——github
maven 多项目管理--demogit

相关文章
相关标签/搜索