jxlwqq / blog-microservices

A blog microservices written in Golang, which can be deployed in an Istio-enabled kubernetes cluster.
MIT License
189 stars 40 forks source link

gRPC 转 Rest 的几种实现 #1

Open jxlwqq opened 2 years ago

jxlwqq commented 2 years ago
jxlwqq commented 2 years ago

Envoy Filter gRPC-JSON Transcoder Demo:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: myapp-grpc-transcoder
spec:
  workloadSelector:
    labels:
      app: myapp # match your deployment
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
            subFilter:
              name: envoy.filters.http.router
        portNumber: 50051 # application port
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.grpc_json_transcoder
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_json_transcoder.v3.GrpcJsonTranscoder
          services:
          - mycompany.myapi.v1.MyService # your gRPC service
          print_options:
            add_whitespace: true
            always_print_enums_as_ints: false
            always_print_primitive_fields: true
            preserve_proto_field_names: false
          convert_grpc_status: true
          proto_descriptor_bin: # base64 encoded proto descriptor

参考:

https://github.com/istio/istio/issues/7652

https://www.tetrate.io/blog/grpc-transcoding-with-istio/

需要设置 proto_descriptor_bin,跟业务逻辑有一定的耦合,如果 proto 文件发生变更,EnvoyFilter 也要跟着更新。

性能方面存疑,没有具体测试过。

jxlwqq commented 2 years ago

本 demo 使用 gRPC Gateway,部分代码如下:

https://github.com/jxlwqq/blog-microservices/blob/541be8290929fc74dc51c368f7b38f169d120870/cmd/blog/main.go#L72-L87

jxlwqq commented 2 years ago

Kong 插件在 Kubernetes 集群的使用如下:

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: <grpc-gateway-example>
config: 
  proto: path/to/hello.proto
plugin: grpc-gateway
---
apiVersion: networking/v1beta1
kind: Ingress
metadata:
  name: {ROUTE}
  annotations:
    kubernetes.io/ingress.class: kong
    konghq.com/plugins: <grpc-gateway-example>
spec:
  rules:
  - host: examplehostname.com
    http:
      paths:
      - path: /bar
        backend:
          serviceName: echo
          servicePort: 80