摘要:與文章框架實踐之一文中實踐的另一種通用框架能通過自動生成對應(yīng)語言的接口類似,也能自動地生成和的存根,我們只需要一個命令就能快速搭建起運行環(huán)境。類似于之前對于框架的實踐步驟,下面一一闡述。
gRPC是Google開源的通用高性能RPC框架,它支持的是使用Protocol Buffers來編寫Service定義,支持較多語言擴平臺并且擁有強大的二進制序列化工具集。與文章《RPC框架實踐之:Apache Thrift》 一文中實踐的另一種通用RPC框架 Thrift 能通過Generator自動生成對應(yīng)語言的Service接口類似,gRPC也能 自動地生成 Server和Client的 Service存根(Stub),我們只需要 一個命令 就能快速搭建起RPC運行環(huán)境。
下面實踐一下gRPC框架,做的事情就是:Client端通過遠程RPC調(diào)用Server的獲取時間的接口,從而將服務(wù)器時間獲取到本地并顯示。
類似于之前對于 RPC框架: Thrift 的實踐步驟,下面一一闡述。
注: 本文首發(fā)于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓
首先創(chuàng)建一個基于Maven的項目: GrpcAPI
pom中加入grpc相關(guān)的依賴
io.grpc grpc-all 1.12.0
這個grpc-all包含了很多grpc相關(guān)的組件:grpc-netty 、 grpc-protobuf 、grpc-stub 等等
pom中加入grpc相關(guān)的 build插件
這里添加兩個Maven插件,目的是后面需要用這些插件來執(zhí)行Protocol Buffers命令,從而自動生成相關(guān)的Stub代碼:
os-maven-plugin:生成平臺無關(guān)的屬性
protobuf-maven-plugin:執(zhí)行Protocol Buffers命令并生成Stub代碼庫
kr.motd.maven os-maven-plugin 1.4.1.Final org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 grpc-java com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier} io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier} compile compile-custom
編寫.proto的服務(wù)定義文件
這里.proto文件的作用和寫法就和我的前一篇文章《RPC框架實踐之:Apache Thrift》 一文中Thrift所要求的.thrift文件編寫一樣,是有其自己的語法要求的!
syntax = "proto3”; // 語法版本 // stub選項 option java_package = "com.hansonwang99.grpc.api”; option java_outer_classname = “RPCDateServiceApi”; option java_multiple_files = true; // 定義包名,類似于我的文章《RPC框架實踐之:Apache Thrift》中的Thrift的namespace package com.hansonwang99.grpc.api; // 服務(wù)接口定義,服務(wù)端和客戶端都要遵守該接口進行通信 service RPCDateService { rpc getDate (RPCDateRequest) returns (RPCDateResponse) {} } // 定義消息(請求) message RPCDateRequest { string userName = 1; } // 定義消息(響應(yīng)) message RPCDateResponse { string serverDate = 1; }
執(zhí)行mvn compile命令來自動生成代碼Stub
mvn編譯完成以后,在target/generated-sources目錄下就能看到根據(jù)上面.proto文件自動轉(zhuǎn)化生成的Java代碼Stub
代碼生成結(jié)果如下所示
好了,既然gRPC-API已經(jīng)有了,下面可以分別編寫服務(wù)端和客戶端
創(chuàng)建基于Maven的項目:Server
pom中添加 GrpcAPI 依賴
com.hansonwang99 GrpcAPI 1.0-SNAPSHOT compile
接下來一步比較關(guān)鍵
實現(xiàn)gRPC服務(wù)接口
public class RPCDateServiceImpl extends RPCDateServiceGrpc.RPCDateServiceImplBase{ @Override public void getDate(RPCDateRequest request, StreamObserverresponseObserver) { RPCDateResponse rpcDateResponse = null; Date now=new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("今天是"+"yyyy年MM月dd日 E kk點mm分”); String nowTime = simpleDateFormat.format( now ); try { rpcDateResponse = RPCDateResponse .newBuilder() .setServerDate( "Welcome " + request.getUserName() + ", " + nowTime ) .build(); } catch (Exception e) { responseObserver.onError(e); } finally { responseObserver.onNext( rpcDateResponse ); } responseObserver.onCompleted(); } }
我想此處重寫的getDate()方法并不陌生吧,這正是上文 .proto 文件中定義的Service接口。
此處邏輯比較簡單:獲取當(dāng)前時間,并且將其與請求RPCDateRequest中提取出的userName字段進行拼接,然后返回給調(diào)用端!形成一個閉環(huán)
創(chuàng)建gRPC服務(wù)端啟動類
public class GRPCServer { private static final int port = 9999; public static void main( String[] args ) throws Exception { Server server = ServerBuilder. forPort(port) .addService( new RPCDateServiceImpl() ) .build().start(); System.out.println( "grpc服務(wù)端啟動成功, 端口=" + port ); server.awaitTermination(); } }
端口自定義的9999,也就是在該端口監(jiān)聽?,F(xiàn)在可以立即運行GRPCServer,來啟動服務(wù)端
創(chuàng)建基于Maven的項目:Client
pom中依然需要添加 GrpcAPI 依賴
com.hansonwang99 GrpcAPI 1.0-SNAPSHOT compile
創(chuàng)建gRPC客戶端啟動類
public class GRPCClient { private static final String host = “l(fā)ocalhost”; private static final int serverPort = 9999; public static void main( String[] args ) throws Exception { ManagedChannel managedChannel = ManagedChannelBuilder.forAddress( host, serverPort ).usePlaintext().build(); try { RPCDateServiceGrpc.RPCDateServiceBlockingStub rpcDateService = RPCDateServiceGrpc.newBlockingStub( managedChannel ); RPCDateRequest rpcDateRequest = RPCDateRequest .newBuilder() .setUserName(“hansonwang99”) .build(); RPCDateResponse rpcDateResponse = rpcDateService.getDate( rpcDateRequest ); System.out.println( rpcDateResponse.getServerDate() ); } finally { managedChannel.shutdown(); } } }
現(xiàn)在立即啟動 GRPCClient!
還記得我們的目標(biāo)嗎?
RPC完成的即是遠程的過程調(diào)用,在本實驗中那就是客戶端可以遠程調(diào)用服務(wù)端的getDate()過程,并將結(jié)果取到客戶端來顯示!
本文實驗代碼在此 → 需要自取
作者更多的原創(chuàng)文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot應(yīng)用監(jiān)控實戰(zhàn)
SpringBoot應(yīng)用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯(lián)合編程
Spring Boot日志框架實踐
SpringBoot優(yōu)雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:
利用K8S技術(shù)棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務(wù)器配置
Docker容器可視化監(jiān)控中心搭建
利用ELK搭建Docker容器化應(yīng)用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務(wù)調(diào)用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準(zhǔn)則
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11870.html
摘要:與文章框架實踐之一文中實踐的另一種通用框架能通過自動生成對應(yīng)語言的接口類似,也能自動地生成和的存根,我們只需要一個命令就能快速搭建起運行環(huán)境。類似于之前對于框架的實踐步驟,下面一一闡述。 showImg(https://segmentfault.com/img/remote/1460000014946557); 概述 gRPC是Google開源的通用高性能RPC框架,它支持的是使用P...
摘要:在文章微服務(wù)調(diào)用鏈追蹤中心搭建一文中模擬出來的調(diào)用鏈就是一個遠程調(diào)用的例子,只不過這篇文章里是通過這種同步調(diào)用方式,利用的是協(xié)議在應(yīng)用層完成的,這種方法雖然奏效,但有時效率并不高。 showImg(https://segmentfault.com/img/remote/1460000014858219); 一、概述 RPC(Remote Procedure Call)即 遠程過程調(diào)...
摘要:在文章微服務(wù)調(diào)用鏈追蹤中心搭建一文中模擬出來的調(diào)用鏈就是一個遠程調(diào)用的例子,只不過這篇文章里是通過這種同步調(diào)用方式,利用的是協(xié)議在應(yīng)用層完成的,這種方法雖然奏效,但有時效率并不高。 showImg(https://segmentfault.com/img/remote/1460000014858219); 一、概述 RPC(Remote Procedure Call)即 遠程過程調(diào)...
摘要:概述進行的開發(fā)過程中,我們很多時候經(jīng)常需要重啟服務(wù)器才能保證修改的源代碼文件或者一些諸如的配置文件以及一些靜態(tài)文件生效,這樣耗時又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 進行SpringBoot的Web開發(fā)過程中,我們很多時候經(jīng)常需要重啟Web服務(wù)器才能保證修改的 源代碼文件、或者一些...
閱讀 1131·2021-11-24 10:21
閱讀 2573·2021-11-19 11:35
閱讀 1672·2019-08-30 15:55
閱讀 1301·2019-08-30 15:54
閱讀 1202·2019-08-30 15:53
閱讀 3512·2019-08-29 17:21
閱讀 3314·2019-08-29 16:12
閱讀 3424·2019-08-29 15:23