使用gRPC路由的特使

时间:2018-03-07 04:06:04

标签: docker docker-compose grpc envoyproxy

我似乎无法让Envoy使用部署的多个gRPC服务。 gRPC调用始终转到同一个实例。 Envoy负载均衡器如何发现有其他相同服务的实例是使用docker-compose规模启动的?

我使用的Service1配置:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 30271 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: service1_grpc
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: service1_grpc }
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: service1_grpc
    connect_timeout: 25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    dns_lookup_family: V4_ONLY
    http2_protocol_options: { }
    hosts: [{ socket_address: { address: 127.0.0.1, port_value: 30270 }}]

现在调用者服务的gRPC客户端初始化为:

grpc.Dial("service1_grpc:30271", grpc.WithInsecure())

问题是,每当我使用docker-compose scale命令启动多个service1实例时,新启动的实例都不会接收任何调用。我的配置问题在哪里?

1 个答案:

答案 0 :(得分:2)

您的群集由静态主机定义支持:docker-compose ps。因此,Envoy只会在那里列出的主机上平衡 - 端口30270上的单个主机。

Docker-compose将为它带来的每个主机创建动态命名的实例。由于您在配置时不知道这些名称,因此您必须使用类似'app/assets/styles/**/*.css') <<<< 的内容来获取这些名称,然后将其反馈给Envoy的动态配置。

要实现的特定动态配置是the Endpoint Discovery Service。有一个关于LearnEnvoy.io的好教程将带您了解这些概念。