當前位置:
首頁 > 科技 > 「熱點」Service Mesh利器:NGINX將支持gRPC

「熱點」Service Mesh利器:NGINX將支持gRPC

NGINX將在1.13.10版本中包含grpc相關功能。

這個版本支持NGINX代理gRPC TCP連接。可以用來:

  • 發布gRPC服務,包括未加密/加密的gRPC服務。

  • 通過單個endpoint發布多個gRPC服務,使用NGINX路由到後端服務。 甚至可以和其他HTTP/2服務使用相同的endpoint,例如網站和 REST API。

  • 反向代理gRPC服務,對gRPC服務集群進行負載均衡。

什麼是gRPC?

gRPC是一種rpc協議,用於客戶端和服務端之間的通信。 gRPC設計的很緊湊並且多語言支持良好,同時支持request/response模式和流式交互。 由於其廣泛的語言支持和簡單面向用戶的設計,該協議越來越受歡迎,其中包含服務混搭(service mesh)實現 。

「熱點」Service Mesh利器:NGINX將支持gRPC

無論是明文還是TLS加密,gRPC都通過HTTP/2傳輸。 gRPC request使用HTTP POST請求。 gRPC response也使用類似的方式,並在response結束時使用HTTP trailer 發送狀態碼。

因為gRPC使用了HTTP/2的連接復用和流式傳輸功能,所以gRPC不能使用HTTP 1.x。


使用NGINX管理gRPC服務

下面是一個簡單的gRPC程序作為DEMO。

簡單gRPC服務

首先,我們在客戶端和伺服器應用程序之間插入NGINX。 NGINX為伺服器應用程序提供了一個穩定可靠的網關。

「熱點」Service Mesh利器:NGINX將支持gRPC

注意這裡需要使用帶gRPC功能的NGINX。 如果您想從源代碼構建NGINX,請記住包含http_sslhttp_v2模塊:

「熱點」Service Mesh利器:NGINX將支持gRPC

「熱點」Service Mesh利器:NGINX將支持gRPC

NGINX監聽gRPC流量,並使用grpc_pass指令代理流量。 下面的配置是將埠80上加密的gRPC流量轉發到埠50051上的服務:

「熱點」Service Mesh利器:NGINX將支持gRPC

我們需要確保grpc_pass指令中的地址是正確的。 重新編譯客戶端以指向NGINX的IP地址和監聽埠。

當運行修改後的客戶端時,會看到與之前相同的響應,但請求是經由GINX轉發。 我們可以在訪問日誌中看到請求記錄:

注意:NGINX不支持在明文(非TLS)埠上同時支持HTTP/1和HTTP/2。 如果你想同時處理兩個協議版本,你應該為每個協議版本創建一個監聽埠。

發布TLS加密的gRPC服務

上面的示例使用未加密的HTTP/2(明文)進行通信。 這對測試和部署來說非常簡單,但生產環境需要加密。 你可以使用NGINX來添加這個加密層。

「熱點」Service Mesh利器:NGINX將支持gRPC

首先創建一個自簽名證書對並修改您的NGINX伺服器配置,如下所示:

「熱點」Service Mesh利器:NGINX將支持gRPC

修改gRPC客戶端以使用TLS,連接到埠1443,並禁用證書檢查(使用自簽名或不可信證書時需要如此)。 如果你使用的是Go,則需要將crypto/tlsgoogle.golang.org/grpc/credentials添加到導入列表中,並將grpc.Dial調用修改為以下內容:

這就是需要做的所有工作。 在生產環境中,你還需要將自簽名證書替換為受信任的證書頒發機構(CA)頒發的證書。

反向代理加密的gRPC服務

如果想在內部調用對gRPC請求加密。 首先需要修改伺服器應用程序以偵聽TLS加密( grpcs)連接:

「熱點」Service Mesh利器:NGINX將支持gRPC

在NGINX配置中,您需要修改將gRPC流量代理到upstream server的協議:

「熱點」Service Mesh利器:NGINX將支持gRPC

路由

這裡將會介紹如何使用NGINX代理多個gRPC後端服務。

「熱點」Service Mesh利器:NGINX將支持gRPC

使用NGINX,您可以識別服務和方法,然後使用location指令路由流量。 您可能已經猜出gRPC請求URL是從proto規範中的包,服務和方法名稱派生的。 考慮如下SayHelloRPC方法:

「熱點」Service Mesh利器:NGINX將支持gRPC

調用SayHelloRPC方法需要從/helloworld.Greeter/SayHello發出POST請求,如以下日誌條目所示:

「熱點」Service Mesh利器:NGINX將支持gRPC

使用NGINX路由請求非常簡單:

「熱點」Service Mesh利器:NGINX將支持gRPC

你可以自己嘗試一下。 例子中擴展了Hello World包(在helloworld.proto)添加一個名為Dispatcher的新服務,然後創建了一個實現Dispatcher方法的新服務。 客戶端使用一個HTTP/2連接向GreeterDispatcher服務發出RPC請求。 NGINX會將請求路由到合適的gRPC伺服器。

請注意/location塊。 該塊處理與已知gRPC調用不匹配的請求。 您可以使用像這樣的location塊提供網頁內容和其他非gRPC服務。

負載均衡

如何擴展gRPC服務以增加容量並提供高可用性? NGINX的upstream group就是做這事的:

「熱點」Service Mesh利器:NGINX將支持gRPC

當然,如果您的upstream正在監聽TLS,則可以使用grpc_passgrpcs://upstreams

NGINX可以採用一系列負載均衡演算法來分配後端gRPC伺服器上的gRPC請求。 NGINX的內置狀況檢查將檢測後端服務是否無法響應或者是否產生錯誤,如果檢測到後端服務出問題,NGINX會自動移除該節點。 如果沒有後端節點可用,則會返回/error502grpc

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

超越比特幣以太坊的區塊鏈技術:石墨烯項目簡介
聊聊微軟剛發布的區塊鏈去中心化身份識別系統DID

TAG:高可用架構 |