Tetrate - 使用Istio進行gRPC轉碼

banq發表於2018-10-27

在構建新的API(如HTTP/2,流,跨語言支援,伺服器推送等)時使用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 \
    --packages proto.package.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。
我們很樂意親自嘗試這個工具。您可以在此處下載原始碼。有關詳細資訊,請參閱README.md
作為警告,EnvoyFilter必須謹慎使用Istio !如果推送了錯誤的過濾器配置,Envoy將拒絕配置更新並停止服務 - 在編寫此工具之前,我們在Tetrate遇到了停機。

相關文章