gRPC 是由 Google 開源的一個 RPC 框架,旨在統一服務間通信的方式。該框架基于 HTTP/2 協議傳輸,使用 Protocol Buffers 作為接口描述語言,可以自動生成服務間調用的代碼。
nginx提供了一個grpc的模塊用于實現grpc協議的反向代理,通過配置上游轉發的方式(grpc_pass)即可,跟proxy_pass的使用方式相同,可以通過配置upstream zone來實現負載均衡。但是如果想使用多個層級對grpc請求進行代理的話,會發現grpc客戶端會提示 not find trailers的錯誤。主要是因為nginx在響應過程中會把響應體后面的trailers過濾掉,從而導致客戶端接收不到預期的trailers,進而報錯。
解決的方案可以在配置文件中通過 add_trailers 這一配置項來添加trailers,不過這種方法比較受限,首先需要知道server端會響應哪些trailes頭以及內容;
另外一種解決方案是開發一個模塊在nginx的響應過程中,對trailers進行過濾并保存,在響應給上一層級或者客戶端時,把trailers進行恢復。這樣的話便可以實現trailers經過多層級的轉發后仍然保持正常的狀態。