本文我們來講解一下如何使用 grpc構建微服務,grpc是乙個開源框架,可用於構建可擴充套件且高效能的微服務並建立服務之間的通訊。
隨著企業越來越多地轉向微服務,對構建這些微服務的低延遲和可擴充套件框架的需求也在增加。為了滿足這一需求,各種工具和框架提供商正加快滿足微服務需求。同時從構建大型微服務應用程式的經驗中學習,技術專業人士分享他們對可重用元件的知識,以便其他人可以構建具有相同規模和效能的架構。
grpc 是乙個開源框架(由 google 建立),是乙個通用的 rpc 框架,用於大規模構建具有高效能的網路應用程式。實現有多種語言版本,並且支援跨平台通訊。
grpc 非常適合服務與服務之間的 rpc 通訊。在這裡,我們將使用 j**a 來實現微服務和相關框架,讓它的功能更齊全。為了讓其他服務可以訪問它,我們將建立乙個包裝 rest 服務,這個服務將使用 grpc 客戶端與 grpc 服務進行通訊。
$grpc 基本上是一種與平台和編碼無關的協議。這意味著,您可以使用任何型別的編碼,如二進位制、json、xml 等,但推薦的方法是使用「protobuf」,它使用專門的序列化/反序列化機制支援二進位制編碼。可插拔設計允許使用者對其進行擴充套件以支援所需的平台和堆疊。
protobuf 的核心構造是 proto idl(介面定義語言),定義了訊息型別和服務定義。它還提供了為所需平台生成模型類和服務介面的工具。
我們可以從在.proto檔案中定義訊息型別的 proto 定義開始。看下面的例子。
message accountproto
有關資料型別和關鍵字的完整參考,請參閱proto3文件。
protobuf 提供了一種工具,可以根據適用於您的平台/程式語言的訊息定義為模型類生成**。以下命令將根據給定的訊息定義在 j**a 中生成account類。
$ > protoc -i=proto-demo --j**a_out=proto-demo account.proto
grpc 服務定義是一組需要對定義的訊息型別執行的操作。這些操作可以採用以下四種通訊形式之一:
單通道 rpc— 它是最簡單的通訊形式。它本質上是同步的,允許使用者以阻塞模式傳送請求並等待響應,直到伺服器完成處理。
流式 rpc— 在這種形式中,客戶端一次性傳送資料,但伺服器以流的形式返回響應。
客戶端流式 rpc— 與伺服器流式傳輸不同,在這種形式中,客戶端以流的形式傳送請求的資料,伺服器將資料作為乙個整體返回。
雙向流式 rpc— 在這種形式中,伺服器和客戶端都支援根據請求和響應流式傳輸資料。
具有標準 crud 操作的訊息型別的示例服務定義將採用以下輸入:
service accountservice
grpc-j**a 實現提供的擴充套件工具有助於根據域邏輯和伺服器存根生成使用者需要實現的服務介面,客戶端將使用這些存根呼叫已部署的服務。
$ > protoc -i=grpc-demo\src\main\proto --j**a_out=grpc-demo\src\main\proto account.proto
grpc-j**a 庫提供了乙個響應式伺服器實現(基於 netty)來部署您的服務和乙個阻塞/非阻塞客戶端實現來連線您的服務和其他服務。
您需要註冊您的服務實現並以程式設計方式啟動伺服器。
server = serverbuilder.forport(port), .addservice(new greeterimpl()).build().start();
在此處找到 github 參考。
要連線到部署在基於 netty 的 grpc 伺服器上的服務,您需要建立乙個訊息通道並將其與生成的伺服器存根連線以進行呼叫。
managedchannel channel = managedchannelbuilder.fortarget(target).useplaintext().build();
blockingstub = greetergrpc.newblockingstub(channel);
hellorequest request = hellorequest.newbuilder().setname(name).build();
helloreply response = blockingstub.sayhello(request);
在此處找到 github 參考。
還有乙個 grpc web 模組,允許 web 客戶端無縫訪問您的 grpc 服務。他們的早期版本支援通過反向**連線 web 客戶端,但現在可以在沒有中間**的情況下進行。
另一種方法是使用 rest/graphql 協議將包裝服務層暴露給面向外部的世界,並通過 grpc 客戶端連線。
我們可能需要在其之上新增另一層,以使用 hibernate 等資料訪問庫建立功能齊全的域服務。與 hibernate 或任何資料庫一樣,需要以某種方式修飾所需的實體,而這對於 protobuf 模型生成的模型可能不可行。因此,我們可能需要一些對映邏輯來將模型類轉換為實體類。乙個這樣好的庫是 mapstruct,它基於 bean 約定進行自動對映。我們只需要提供對映介面:
account map(accountproto accountproto);
accountproto map(account account);
}為了進一步簡化整個構建和執行環境,有一些流行的第三方 m**en 外掛程式和庫也有幫助。
協議緩衝區 m**en 外掛程式(由 xolstice 提供)執行 proto 工具及其擴充套件,以及從.proto檔案構建和生成源**。它還附加了 .proto檔案作為專案的資源。請參閱示例配置以生成 j**a **。
com.google.protobuf:protoc:$:exe:$
grpc-j**a
io.grpc:protoc-gen-grpc-j**a:$:exe:$
參考可以在這裡找到。
mapstruct 庫支援生成訊息型別的對映器類,這些對映器類可以將訊息從/到類的實體。它提供了乙個註解處理器,通過在構建時分析指定的註解來生成乙個對映器類。m**en編譯外掛程式參考下面的配置。
org.mapstruct
mapstruct-processor
$
預設情況下,grpc 伺服器不會與 web 伺服器(在本例中為 netty)一起啟動。此外,它需要在伺服器啟動之前註冊所有 grpc 服務。lognet 的 grpc spring boot 會自動掃瞄所有帶有@grpcservice註解的類,並向伺服器構建器註冊服務定義。構建伺服器後,它會在 spring 應用程式屬性中配置的埠上自動啟動 grpc 伺服器。
除了註冊服務和啟動伺服器外,它還支援自動配置的安全、健康檢查和服務發現。有關詳細資訊,請參閱此處。
github 上提供了上述方法的完整示例實現。
除了構建 grpc 之外,google 的應用程式還提供了文章中提到的工具/庫和 spring boot 啟動框架。一些專門的微服務框架為 grpc 服務實現提供了開箱即用的支援。
quarkus grpc
asp.net grpc
akka grpc
salesforce grpc
go基於grpc構建微服務框架 服務註冊與發現
grpc 是谷歌開源的rpc框架,基於http2實現,並支援跨語言,目前基本涵蓋了主流語言.跨語言的實現主要得益於protobuf,通過編寫proto檔案,通過protobuf工具生成對應語言的類庫進行使用.對於go這樣一門新生語言來說,生態鏈還處於發展階段,微服務框架也是如此,下面將基於grpc ...
Go微服務 grpc的簡單使用
我的是windows,將壓縮包bin目錄下的exe放到環境path目錄中即可。然後獲取外掛程式支援庫 grpc執行時介面編譯碼支援庫 從 proto檔案 grpc介面描述檔案 生成 go檔案 的編譯器外掛程式 go get u github.com golang protobuf protoc ge...
微服務優化之使用gRPC做微服務的內部通訊
grpc是乙個高效能的 開源的 普遍通用的rpc框架。簡單地說,它能夠幫助我們建立透明的服務端和客戶端通訊系統。google開發了grpc並且將其開源。通過它,乙個客戶端消費者服務可以像呼叫本地方法一樣,呼叫另一台主機上面的服務端方法。grpc本質上仍然遵循常規的remote procedure c...