(1)在gRPC中客戶端能夠直接調用運行在不一樣機器上服務器端的方法,與其它RPC(遠程方法調用)同樣,定義一個方法,能夠被遠程使用參數調用,而後經過返回值進行響應。
(2)服務器端運行gRPC服務來處理客戶端的調用,客戶端保存着服務器端的存根——提供服務器端的方法,來決定調用哪一個方法。
(3)服務器端與客戶端經過protocol buffers進行通訊,谷歌本身的開源的數據序列化結構。 如圖:
html
目的:客戶端向服務器端發送請求計算兩個字符串相加,服務器端返回結果
工具:IDEA+mavenjava
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; }
<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>
/* 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(); } }
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