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

相關文章
相關標籤/搜索