常用的RPC架構系列---gRPC

常用的RPC架構系列---gRPC

gRPC是谷歌的一個高性能,開源的高性能 RPC 框架,gRPC面向移動和HTTP/2設計。gRPC隱藏了底層的實現細節,包括序列化(json,xml),數據傳輸(TCP,HTTP,UDP),反序列化等,它可以有效地將數據中心內和跨數據中心的服務與可插拔支持進行負載均衡、跟蹤、健康檢查和認證。gRPC使用在移動設備上能表現更好的特性,例如更省電,更省空間。

gRPC設計理念

定義一個服務,指定其能夠被遠程調用的方法。在服務端實現這個接口,並運行一個gRPC服務來處理客戶端調用。在客戶端擁有一個存根能夠像服務端一樣的方法。gRPC客戶端和服務端都可以在這種環境中運行和交互。

常用的RPC架構系列---gRPC

gRPC主要使用場景

在gRPC項目中,客戶端應用可以像調用本地對象一樣直接調用另一臺不同機器的服務端應用,更能夠容易的創建分佈式應用和服務。

  • 在微服務架構中有效的連接多個服務
  • 將移動設備,瀏覽器客戶端連接到後端服務
  • 生成高效的客戶端

spring boot集成gRPC

因為gRPC依賴Protocol Buffers,所以先簡單看看什麼是Protocol Buffers。

Protocol Buffers 簡稱protobuf,是一種高效,輕便,易用的結構化數據存儲格式。數據存儲格式使用最多的是JSON,XML,他們簡單,易讀,與平臺,語言無關。那麼既然有JSON,XML,為什麼還要有protobuf。普遍認為有兩種原因:

  • protobuf具有了JSON,XML格式所有有點
  • protobuf解析速度比JSON,XML快,效率高
  • protobuf序列化數據非常緊湊,簡潔

1,idea安裝protobuf插件。

setting-->Plugins ,搜到protobuf support,然後點擊安裝即可,最後重啟idea

常用的RPC架構系列---gRPC

2,新建grpc父項目。

分別新建三個模塊:grpc-lib,grpc-server(使用開源grpc-server-spring-boot-starter組件),grpc-client(使用開源grpc-client-spring-boot-starter組件)

組件官網:https://github.com/yidongnan/grpc-spring-boot-starter

因為使用父項目的pom.xml來管理,所以pom.xml內容如下:

  • grpc-lib

其中grpc-lib的pom.xml:

在lib模塊下新建proto文件夾,加入以下ptoro文件:

上面的ptoro文件中

  • syntax指定了protobuf版本為proto3。
  • option java_package:指定生成類的報名
  • option javamultiplefiles有兩個值,true和false。如果為true,每個message和service都會被生成為一個類。如果是false,則所有的message和service都將會是javaouterclassname的內部類
  • service HelloService:定義Rpc的Service,這裡需要注意:下面的方法的傳入參數和返回類型都必須是message
  • message HelloRequest:相當於請求參數,為string類型
  • message HelloResponse:相當於返回參數,為string類型。

運行protobuf插件的compile和compile-custom功能,生成java代碼到src/main/java目錄下。見圖:

常用的RPC架構系列---gRPC

  • grpc-server
    grpc-server模塊pom.xml文件如下:

(1)application.yml文件:

常用的RPC架構系列---gRPC

說明:在使用grpc-server-spring-boot-starter組件時,可以設置 gRPC 的 host(默認:0.0.0.0) 跟 port (默認9090)

(2)HelloService類

這裡,server端就完成了。

  • grpc-client

grpc-client模塊的pom.xml:

(1)application.yml文件:

常用的RPC架構系列---gRPC

說明:這裡我沒有配置指定grpc-server地址和端口,如果沒有配置,那將會按照下面的方式進行解析:

  • 如果存在一個 DiscoveryClient 的 bean,這時會使用 client name 去註冊中心上進行獲取對應服務的 address
  • 否則 client 端將使用 localhost 和 9090 端口

(2)HelloClient類

說明:@GrpcClient("grpc-server"),指定的值為grpc服務提供方名稱,這裡是grpc-server。

(3)HelloController類

這裡,client端就完成了。

3,測試

先啟動server,再啟動client。使用瀏覽器訪問client端接口:http://localhost:8081/sayHello?username=張三

server端打印:

常用的RPC架構系列---gRPC

client端效果:

常用的RPC架構系列---gRPC

總結,spring boot與gRPC整合還是很簡單,最重要的是版本要一致,然後對proto語法有個大致的瞭解。

本人水平有限,難免有錯誤或遺漏之處,望大家指正和諒解,提出寶貴意見,願與之交流。


分享到:


相關文章: