怎么用模板做網(wǎng)站云南seo
- 起源
- 特點
- 主要優(yōu)缺點
- 應用場景
- 組成部分
- 使用方法
- SpringBoot集成gRPC
- Vert.x集成gRPC
- Nacos集成gRPC
- 監(jiān)控gRPC調(diào)用過程
- Java使用示例
起源
gRPC的起源可以追溯到2015年,當時谷歌發(fā)布了一款開源RPC框架,名為gRPC。gRPC的設計初衷是為了提供一種標準化、可通用和跨平臺的RPC解決方案,類似于谷歌內(nèi)部的Stubby框架,但更加開放和可擴展。
gRPC的受歡迎程度迅速增長,許多大型公司開始采用gRPC,包括Netflix、Square、Lyft、Docker、CoreOS和思科等。隨著gRPC的普及,它被接納進了云原生計算基金會(Cloud Native Computing Foundation,CNCF),這是最受歡迎的開源軟件基金會之一,致力于讓云原生計算具備通用性和可持續(xù)性。
gRPC的設計理念基于遠程過程調(diào)用(RPC),旨在簡化分布式系統(tǒng)中的服務間通信。通過定義服務接口和使用Protocol Buffers進行序列化,gRPC使得客戶端可以像調(diào)用本地方法一樣調(diào)用遠程服務,屏蔽了網(wǎng)絡通信的復雜性,使開發(fā)者能夠更專注于業(yè)務邏輯的開發(fā)。
gRPC的來源和發(fā)展源于谷歌對標準化、通用化和跨平臺的RPC框架的需求,以及社區(qū)對gRPC的接納和廣泛采用。gRPC已經(jīng)成為許多微服務組件和分布式系統(tǒng)之間通信的重要工具,并且在云原生應用開發(fā)中發(fā)揮著越來越重要的作用。
特點
gRPC是一個高性能、開源和通用的RPC(遠程過程調(diào)用)框架,面向服務端和移動端,基于HTTP/2設計。以下是gRPC的一些主要特點:
- 語言中立:支持多種語言,包括Java、C++、Python、Go、Ruby、C#、Java等。
- 基于IDL文件定義服務:通過proto3工具生成指定語言的數(shù)據(jù)結(jié)構、服務端接口以及客戶端Stub。
- 通信協(xié)議基于標準的HTTP/2設計:支持雙向流、消息頭壓縮、單TCP的多路復用、服務端推送等特性,這些特性使得gRPC在移動端設備上更加省電和節(jié)省網(wǎng)絡流量。
- 序列化支持PB(Protocol Buffer)和JSON:PB是一種語言無關的高性能序列化框架,基于HTTP/2+PB,保障了RPC調(diào)用的高性能。
- 服務端創(chuàng)建流程:采用Build模式,對底層服務綁定、transportServer和NettyServer的創(chuàng)建和實例化做了封裝和屏蔽,讓服務調(diào)用者不用關心RPC調(diào)用細節(jié)。
- 客戶端存根:在客戶端擁有一個存根能夠像服務端一樣的方法,使得客戶端應用可以像調(diào)用本地對象一樣直接調(diào)用另一臺不同機器上服務端應用的方法。
gRPC能夠節(jié)省帶寬、降低TCP鏈接次數(shù)、節(jié)省CPU,幫助移動設備延長電池壽命等。此外,gRPC的協(xié)議設計上使用了HTTP2現(xiàn)有的語義,請求和響應的數(shù)據(jù)使用HTTP Body發(fā)送,其他的控制信息則用Header表示。ProtoBuf能夠?qū)?shù)據(jù)進行序列化,并廣泛應用在數(shù)據(jù)存儲、通信協(xié)議等方面。
主要優(yōu)缺點
gRPC是一個高性能、開源的遠程過程調(diào)用(RPC)框架,具有許多優(yōu)勢和劣勢。
優(yōu)勢:
- 高性能:gRPC使用Protocol Buffers作為數(shù)據(jù)交換格式,具有高效的序列化和反序列化性能。它還支持多種傳輸協(xié)議,包括HTTP/2,提供了高吞吐量和低延遲的通信能力。
- 跨語言支持:gRPC基于標準的Protocol Buffers,可以在多種編程語言中使用,包括Java、Python、Go、C#、Ruby等。這使得在不同語言編寫的服務之間進行通信變得更加容易。
- 強大的擴展性:gRPC的設計具有高度的可擴展性,支持自定義插件和中間件。這使得開發(fā)人員可以根據(jù)自己的需求對gRPC進行定制和擴展。
- 雙向流式通信:gRPC支持雙向流式通信,客戶端和服務器可以同時發(fā)送數(shù)據(jù),適用于需要連續(xù)數(shù)據(jù)交互的場景。
- 高度可定制的傳輸協(xié)議:gRPC可以基于HTTP/2進行傳輸,同時也可以使用其他傳輸協(xié)議。這使得開發(fā)人員可以根據(jù)需求選擇最佳的傳輸協(xié)議。
- 支持負載均衡:gRPC內(nèi)置負載均衡功能,可以輕松地將請求分發(fā)到多個服務器實例或服務上,實現(xiàn)水平擴展和高可用性。
- 強大的社區(qū)支持:gRPC由Google開發(fā)并維護,擁有龐大的社區(qū)和活躍的開發(fā)者群體。這意味著遇到問題時可以獲得及時的幫助和解決方案。
劣勢:
- 復雜性:gRPC涉及的概念和技術較多,學習曲線相對較陡峭。開發(fā)人員需要了解protobuf、RPC基本概念以及各種高級特性才能充分利用gRPC的優(yōu)勢。
- 依賴管理:使用gRPC需要安裝和配置多個依賴項,包括protobuf編譯器、gRPC服務器和客戶端庫等。這增加了項目的復雜性和維護成本。
- 安全性和隱私:雖然gRPC提供了TLS/SSL加密通信的支持,但開發(fā)人員仍需確保正確配置安全設置,并處理所有相關的安全和隱私問題。
- 網(wǎng)絡開銷:gRPC使用Protocol Buffers作為數(shù)據(jù)交換格式,相對于XML或JSON等文本格式,序列化和反序列化的開銷可能更大。
- 不支持HTTP/1.x:gRPC基于HTTP/2傳輸協(xié)議,不直接支持HTTP/1.x協(xié)議。如果需要與使用HTTP/1.x協(xié)議的服務進行通信,需要進行協(xié)議轉(zhuǎn)換或升級目標服務為HTTP/2。
- 瀏覽器支持有限:由于大多數(shù)瀏覽器只支持HTTP/1.x協(xié)議而不支持HTTP/2,因此使用gRPC在瀏覽器端直接進行通信可能存在限制。需要額外的工具或技術來實現(xiàn)瀏覽器與gRPC服務的通信。
- 社區(qū)標準不統(tǒng)一:雖然gRPC擁有龐大的社區(qū)支持,但與其他技術(如RESTful API)相比,其作為RPC框架的標準尚未完全統(tǒng)一。這可能導致與其他技術的不兼容或額外的集成工作。
總體而言,gRPC在高性能、跨語言支持和擴展性等方面表現(xiàn)出色,但也有一些復雜性、安全性和瀏覽器支持等方面的劣勢。選擇使用gRPC時需要根據(jù)項目的具體需求進行權衡,并充分考慮這些優(yōu)劣勢。
應用場景
gRPC的應用場景主要包括以下幾個方面:
- 微服務架構:在微服務架構中,服務之間的通信是關鍵。gRPC提供了一種高效、通用的方式來支持服務間的通信,使得服務間的調(diào)用更加簡單、快速。
- 移動應用開發(fā):對于需要從移動應用中調(diào)用遠程服務的場景,gRPC是一種很好的選擇。由于其高效和低延遲的特性,gRPC使得移動應用可以更快地與遠程服務器進行通信。
- 實時游戲:在實時游戲中,低延遲的通信是非常重要的。gRPC由于其高效和低延遲的特性,被廣泛應用于實時游戲的后端服務中。
- 云原生應用開發(fā):在云原生應用開發(fā)中,服務間的通信和擴展性是非常重要的。gRPC作為一種通用的、高效的RPC框架,被廣泛應用于云原生應用開發(fā)中。
- 物聯(lián)網(wǎng)(IoT):在物聯(lián)網(wǎng)場景中,設備間需要進行高效的通信。gRPC的高效和低延遲特性使得它成為物聯(lián)網(wǎng)設備間通信的理想選擇。
- 跨語言服務調(diào)用:由于gRPC支持多種語言,因此它非常適合需要跨語言服務的場景,例如使用不同語言的微服務之間的通信。
總的來說,gRPC適用于任何需要高性能、低延遲的遠程服務調(diào)用的場景,尤其在微服務架構、移動應用開發(fā)、實時游戲、云原生應用開發(fā)、物聯(lián)網(wǎng)和跨語言服務調(diào)用等方面有廣泛的應用。
組成部分
gRPC是一個高性能、開源的遠程過程調(diào)用(RPC)框架,由以下主要組成部分構成:
- 服務定義:使用Protocol Buffers(protobuf)定義服務接口和數(shù)據(jù)模型。創(chuàng)建一個
.proto
文件,在其中定義服務方法和數(shù)據(jù)類型。 - 服務實現(xiàn):在服務器端實現(xiàn)服務接口,并運行一個gRPC服務器來處理客戶端調(diào)用。
- 客戶端存根(Stub):在客戶端,使用生成的代碼創(chuàng)建一個gRPC客戶端存根(Stub),并使用它來發(fā)起gRPC調(diào)用。
- 網(wǎng)絡傳輸模塊:底層傳輸層,可以是TCP或HTTP。
- 序列化與反序列化:用于將數(shù)據(jù)轉(zhuǎn)換為可以在網(wǎng)絡上傳輸?shù)母袷?#xff0c;以及將接收到的數(shù)據(jù)轉(zhuǎn)換回原始格式。
- 身份驗證和授權:gRPC支持多種安全機制,如TLS/SSL加密通信、身份驗證和授權等。
- 性能優(yōu)化:優(yōu)化gRPC的性能可能需要對服務進行調(diào)優(yōu)和優(yōu)化。
- 文檔和社區(qū)支持:gRPC有一個活躍的社區(qū),提供了豐富的文檔和示例代碼。
這些組成部分共同協(xié)作,使得gRPC成為一個功能強大的RPC框架,適用于構建高效、可擴展的分布式系統(tǒng)。通過使用gRPC,開發(fā)人員可以更容易地創(chuàng)建和維護跨語言、跨平臺的分布式應用程序。
使用方法
要使用gRPC,你需要按照以下步驟進行操作:
- 定義服務:使用Protocol Buffers(protobuf)定義服務接口和數(shù)據(jù)模型。創(chuàng)建一個
.proto
文件,并在其中定義服務方法和數(shù)據(jù)類型。 - 生成代碼:使用protobuf編譯器將
.proto
文件編譯成目標編程語言的代碼。這將生成服務接口和消息類的代碼,用于在客戶端和服務器之間傳輸數(shù)據(jù)。 - 實現(xiàn)服務:在服務器端實現(xiàn)服務接口,并運行一個gRPC服務器來處理客戶端調(diào)用。確保你已經(jīng)安裝了gRPC服務器所需的依賴庫。
- 創(chuàng)建客戶端:在客戶端,使用生成的代碼創(chuàng)建一個gRPC客戶端存根(stub),并使用它來發(fā)起gRPC調(diào)用。確保你已經(jīng)安裝了gRPC客戶端所需的依賴庫。
- 配置和啟動服務:根據(jù)你的需求,配置gRPC服務器和客戶端的參數(shù),如端口號、超時時間等。啟動gRPC服務器和客戶端,并確保它們能夠正常通信。
- 測試和驗證:編寫測試用例,驗證gRPC服務的正確性。你可以使用自動化測試工具或編寫手動測試腳本來測試服務的各個方面,包括請求和響應的序列化、服務的可用性和性能等。
- 部署和監(jiān)控:將gRPC服務部署到生產(chǎn)環(huán)境,并監(jiān)控其性能和可用性。確保你的服務具有適當?shù)娜蒎e機制和負載均衡能力,以便在出現(xiàn)故障時能夠快速恢復。
在使用gRPC時,還需要注意以下幾點:
- 跨語言支持:gRPC支持多種編程語言,因此你可以選擇適合你的項目的語言進行開發(fā)。確保你選擇了與你的團隊和技術棧相匹配的語言。
- 安全性:gRPC支持多種安全機制,如TLS/SSL加密通信、身份驗證和授權等。根據(jù)需要配置安全選項,以確保你的服務的安全性。
- 性能優(yōu)化:gRPC的性能取決于多個因素,包括網(wǎng)絡帶寬、序列化和反序列化開銷等。優(yōu)化gRPC的性能可能需要對服務進行調(diào)優(yōu)和優(yōu)化。
- 文檔和社區(qū)支持:gRPC有一個活躍的社區(qū),提供了豐富的文檔和示例代碼。你可以通過查看官方文檔、參與社區(qū)論壇或?qū)で蠹夹g支持來解決問題和學習更多關于gRPC的知識。
SpringBoot集成gRPC
在Spring Boot項目中集成gRPC涉及幾個關鍵步驟,下面是一個大致的指南:
-
添加依賴:
首先,你需要在你的pom.xml
(Maven)或build.gradle
(Gradle)文件中添加gRPC和相關的依賴。例如,對于Maven,你可能需要添加類似下面的依賴:<dependencies><!-- gRPC依賴 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><!-- 其他的Spring Boot依賴 --> </dependencies>
其中
${grpc.version}
是你想要使用的gRPC的版本號。 -
定義gRPC服務:
使用Protocol Buffers(protobuf)定義你的服務接口和數(shù)據(jù)模型。創(chuàng)建一個.proto
文件,并在其中定義RPC服務和消息類型。 -
生成代碼:
使用protobuf編譯器生成Java代碼。這通常可以通過Maven或Gradle插件來完成,或者在構建過程中手動執(zhí)行。 -
實現(xiàn)gRPC服務:
在Spring Boot應用中,創(chuàng)建一個類來實現(xiàn)你在.proto
文件中定義的gRPC服務接口。使用@GrpcService
注解來標記這個類,以便Spring能夠發(fā)現(xiàn)并注冊它。 -
配置gRPC服務器:
配置gRPC服務器以監(jiān)聽特定的端口和地址。在Spring Boot中,你可以通過配置文件(如application.properties
或application.yml
)來設置這些屬性,或者在Java配置類中設置。 -
創(chuàng)建gRPC客戶端:
在你的Spring Boot應用中,你可能還需要創(chuàng)建gRPC客戶端來調(diào)用其他gRPC服務。你可以使用gRPC的Java庫來創(chuàng)建一個客戶端存根(stub),并通過它來發(fā)起RPC調(diào)用。 -
啟動和測試:
啟動你的Spring Boot應用,并測試gRPC服務是否能夠正常工作。你可以編寫集成測試來驗證gRPC服務的端到端行為,或者使用像BloomRPC這樣的工具來手動測試你的服務。 -
安全性和異常處理:
根據(jù)你的需求,配置gRPC服務的安全性,如使用SSL/TLS加密通信。同時,確保妥善處理異常和錯誤,以便向客戶端提供有用的錯誤信息。
Vert.x集成gRPC
將gRPC集成到Vert.x項目中需要幾個關鍵步驟。Vert.x是一個用于構建響應式應用的框架,它支持多種編程語言,包括Java、JavaScript、Groovy和Kotlin。下面是在Vert.x項目中集成gRPC的步驟:
- 添加依賴:
在Vert.x項目中,你需要添加gRPC的依賴。這通常可以通過將相關依賴添加到項目的pom.xml
(Maven)或build.gradle
(Gradle)文件中來完成。確保你已經(jīng)添加了Vert.x和gRPC的正確版本。
2. 定義gRPC服務和消息:
使用Protocol Buffers(protobuf)定義你的gRPC服務和消息。創(chuàng)建一個.proto
文件,在其中定義你的服務接口和數(shù)據(jù)模型。確保你已經(jīng)安裝了protobuf編譯器,以便將.proto
文件編譯成Java代碼。
3. 生成gRPC服務和消息代碼:
使用protobuf編譯器將.proto
文件編譯成Java代碼。這將生成一個服務接口和相關的消息類,用于在gRPC客戶端和服務器之間傳輸數(shù)據(jù)。
4. 創(chuàng)建gRPC服務器:
在Vert.x中,創(chuàng)建一個gRPC服務器實例,并指定要監(jiān)聽的端口。使用生成的gRPC服務和消息代碼,實現(xiàn)你的服務邏輯。Vert.x提供了用于處理gRPC請求和響應的API。
5. 創(chuàng)建gRPC客戶端:
在需要調(diào)用gRPC服務的客戶端代碼中,創(chuàng)建一個gRPC客戶端實例。使用生成的gRPC服務和消息代碼,構建客戶端存根(stub),并使用它來發(fā)起gRPC調(diào)用。
6. 啟動和測試:
啟動你的Vert.x應用程序,并確保gRPC服務器和客戶端正確運行。你可以編寫單元測試和集成測試來驗證gRPC服務的正確性。
7. 配置和優(yōu)化:
根據(jù)需要配置gRPC服務器的參數(shù),如超時設置、線程池大小等。Vert.x提供了靈活的配置選項,可以優(yōu)化gRPC服務的性能和可靠性。
8. 安全性和異常處理:
根據(jù)你的需求,配置gRPC服務的安全性,如使用SSL/TLS加密通信。同時,確保妥善處理異常和錯誤,以便向客戶端提供有用的錯誤信息。
請注意,上述步驟是一個大致的指南,具體的實現(xiàn)細節(jié)可能會根據(jù)你的具體需求和項目配置有所不同。確保參考Vert.x和gRPC的官方文檔以獲取更詳細的信息和示例代碼。
Nacos集成gRPC
要將Nacos與gRPC集成,您可以按照以下步驟進行操作:
-
定義gRPC服務和消息:
- 使用Protocol Buffers(protobuf)定義您的gRPC服務和消息。創(chuàng)建一個
.proto
文件,在其中定義您的服務接口和數(shù)據(jù)模型。
- 使用Protocol Buffers(protobuf)定義您的gRPC服務和消息。創(chuàng)建一個
-
生成gRPC服務和消息代碼:
- 使用protobuf編譯器將
.proto
文件編譯成Java代碼。這將生成一個服務接口和相關的消息類,用于在gRPC客戶端和服務器之間傳輸數(shù)據(jù)。
- 使用protobuf編譯器將
-
實現(xiàn)gRPC服務:
- 在Nacos中,創(chuàng)建一個gRPC服務器實例,并實現(xiàn)您定義的服務接口。您可以使用Nacos提供的API和功能來擴展和管理gRPC服務。
-
創(chuàng)建gRPC客戶端存根:
- 在需要調(diào)用gRPC服務的客戶端代碼中,創(chuàng)建一個gRPC客戶端存根(stub),并使用它來發(fā)起gRPC調(diào)用。確保您已經(jīng)將生成的客戶端存根與您的客戶端應用程序集成。
-
配置Nacos以支持gRPC:
- 根據(jù)您的需求,配置Nacos以支持gRPC通信。您可能需要配置Nacos的gRPC監(jiān)聽器、路由和負載均衡等設置。確保您已正確配置Nacos以與您的gRPC服務通信。
-
啟動和測試:
- 啟動您的Nacos服務器和gRPC服務,并確保它們能夠正常通信。編寫測試用例,驗證gRPC服務的正確性,包括請求和響應的序列化、服務的可用性和性能等。
-
部署和監(jiān)控:
- 將Nacos和gRPC服務部署到生產(chǎn)環(huán)境,并監(jiān)控其性能和可用性。確保您的服務具有適當?shù)娜蒎e機制和負載均衡能力,以便在出現(xiàn)故障時能夠快速恢復。
-
維護和更新:
- 定期檢查和更新Nacos和gRPC的版本,以獲得最新的功能和安全修復。同時,關注社區(qū)動態(tài),以便及時獲取問題修復和新特性的更新。
監(jiān)控gRPC調(diào)用過程
要監(jiān)控gRPC調(diào)用過程,你可以考慮以下幾個方面:
- 使用gRPC的追蹤和監(jiān)控工具:gRPC本身提供了一些追蹤和監(jiān)控工具,可以幫助你監(jiān)控gRPC調(diào)用的過程。例如,你可以使用OpenCensus或OpenTelemetry等工具來收集gRPC調(diào)用的時序數(shù)據(jù)和度量指標,并可視化地展示調(diào)用過程。
- 實現(xiàn)自定義的追蹤和監(jiān)控邏輯:在你的gRPC服務中,你可以實現(xiàn)自定義的追蹤和監(jiān)控邏輯來收集調(diào)用過程中的數(shù)據(jù)。例如,你可以在服務端和客戶端添加追蹤代碼,記錄調(diào)用的開始時間、結(jié)束時間、請求數(shù)據(jù)和響應數(shù)據(jù)等信息,并將這些信息發(fā)送到監(jiān)控系統(tǒng)進行展示和分析。
- 使用日志記錄:在gRPC的客戶端和服務器端,你可以使用日志記錄來記錄調(diào)用過程中的重要事件和錯誤信息。例如,你可以在客戶端和服務端的代碼中添加日志語句,記錄調(diào)用的詳細信息和錯誤信息,以便于排查問題和監(jiān)控調(diào)用過程。
- 使用性能分析工具:你可以使用性能分析工具來監(jiān)控gRPC調(diào)用的性能指標,如響應時間、吞吐量、錯誤率等。這些工具可以幫助你發(fā)現(xiàn)性能瓶頸和問題,并提供優(yōu)化建議。
- 使用分布式追蹤系統(tǒng):如果你的gRPC服務部署在分布式系統(tǒng)中,你可以使用分布式追蹤系統(tǒng)來監(jiān)控整個調(diào)用鏈路。通過分布式追蹤系統(tǒng),你可以跟蹤一個請求從客戶端到服務器再到客戶端的完整調(diào)用鏈路,并分析整個鏈路的性能和瓶頸。
監(jiān)控gRPC調(diào)用過程需要結(jié)合多種工具和技術來實現(xiàn)。通過使用gRPC提供的工具、實現(xiàn)自定義的追蹤和監(jiān)控邏輯、使用日志記錄和性能分析工具以及使用分布式追蹤系統(tǒng)等方法,你可以全面地監(jiān)控gRPC調(diào)用的過程,及時發(fā)現(xiàn)和解決問題,并優(yōu)化調(diào)用性能。
Java使用示例
下面是一個簡單的Java使用gRPC的示例:
首先,你需要定義你的gRPC服務和消息。創(chuàng)建一個.proto
文件,例如hello.proto
:
syntax = "proto3";package helloworld;service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}
然后,使用protobuf編譯器生成Java代碼:
protoc --java_out=. hello.proto
接下來,你可以在服務器端實現(xiàn)gRPC服務:
import io.grpc.stub.StreamObserver;
import helloworld.GreeterGrpc;
import helloworld.HelloReply;
import helloworld.HelloRequest;public class GreeterImpl extends GreeterGrpc.GreeterImplBase {@Overridepublic void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();responseObserver.onNext(reply);responseObserver.onCompleted();}
}
在客戶端,你可以使用生成的gRPC存根來發(fā)起gRPC調(diào)用:
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import helloworld.GreeterGrpc;
import helloworld.HelloReply;
import helloworld.HelloRequest;public class GreeterClient {public static void main(String[] args) throws Exception {ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);HelloRequest request = HelloRequest.newBuilder().setName("world").build();HelloReply reply = stub.sayHello(request);System.out.println("Greeter client received: " + reply.getMessage());}
}
在這個示例中,我們定義了一個簡單的gRPC服務,其中只有一個SayHello
方法。在服務器端,我們實現(xiàn)了這個方法,并返回一個包含問候消息的HelloReply
對象。在客戶端,我們使用生成的gRPC存根來調(diào)用SayHello
方法,并打印返回的消息。
-
gRPC官網(wǎng)
-
gRPC協(xié)議詳解
-
Vert.x gRPC