Tetrate - 使用Istio進行gRPC轉碼
在構建新的API(如HTTP/2,流,跨語言支援,伺服器推送等)時使用RPC/">gRPC而不是HTTP/JSON有很多優點。最難的部分往往是如何處理HTTP/ JSON的遺留服務。這就是為什麼gRPC-JSON轉碼非常有吸引力的原因:我們可以實現基於gRPC的伺服器,但是使用HTTP/JSON介面暴露給其他傳統服務。因此通常,我們會使用gRPC閘道器或Google Cloud Endpoints等產品 來為我們處理gRPC-JSON轉碼,但Envoy也實現了轉碼!
Envoy將gRPC轉碼作為過濾器實現。在Tetrate,我們使用Istio作為我們的Envoy邊車的控制平面,Istio允許通過其EnvoyFilterCRD 進行自定義Envoy配置。為了利用這一點,我們建立了一個小工具gen-transcoder,它掃描gRPC原型描述符以自動生成準確的Envoy過濾器配置。它還支援過濾Envoy公開為HTTP/JSON的描述符中的服務或包等功能。 gen-transcoder是為了與CI / CD工作流程保持友好。在Tetrate,我們使用它來自動交付gRPC-JSON轉碼器配置,作為我們正常服務部署的一部分。
使用gen-transcoder是一個簡單的兩步過程:
第1步:在原型編譯期間生成原型描述符:
$ protoc \ -I path/to/google/protobufs \ -I path/to/your/protos \ --descriptor_set_out=path/to/output/dir/YOUR_SERVICE_NAME.proto-descriptor \ --include_imports \ --go_out=plugins=grpc:. \ path/to/your/protos/service.proto
第2步:gen-transcoder用於生成Istio Envoy代理配置
$ gen-transcoder \ --port 9080 \ --service foo \ --<b>package</b>s proto.<b>package</b>.name \ --services='Service.*' \ --descriptor=path/to/output/dir/YOUR_SERVICE_NAME.proto-descriptor
作為其中的一部分,我們已經包含了一些示例proto服務,這些服務被編譯為單個proto描述符,您可以通過以下方式使用它。
$ gen-transcoder \ --port 9080 \ --service echo \ --packages proto \ --services 'Echo.*' \ --descriptor \ proto/onebig.proto-descriptor
這將EnvoyFilter專門針對服務proto.EchoService打包proto。
我們很樂意親自嘗試這個工具。您可以在ofollow,noindex" target="_blank">此處 下載原始碼 。有關詳細資訊,請參閱README.md 。
作為警告,EnvoyFilter必須謹慎使用Istio !如果推送了錯誤的過濾器配置,Envoy將拒絕配置更新並停止服務 - 在編寫此工具之前,我們在Tetrate遇到了停機。