【问题标题】:Adding servers in the client-side dynamically/Runtime在客户端动态/运行时添加服务器
【发布时间】:2016-12-14 16:20:50
【问题描述】:

我正在使用 Consul 进行服务发现;并在客户端启动期间在 NameResolver.start(Listener listener) 中提供服务器列表。

  1. 如何添加作为服务提供者加入的新服务器(在 Consul 中)
  2. 我正在使用循环;当其中一台服务器死亡时;它不断击中死服务器
  3. 您是否有一个样本可以重试 UNAVAILABLE 异常?我只想在放弃客户端之前至少重试一次。

提前谢谢你

【问题讨论】:

    标签: grpc grpc-java


    【解决方案1】:

    当服务器列表发生变化时(在 Consul 中),调用 NameResolver.Listener.onUpdate(),你应该至少调用一次。

    负载平衡实现和 API 正在接受大规模的返工,这应该会极大地改进循环。

    【讨论】:

    • 是的,在启动时我会做 NameResolver.Listerner.onUpdate();但是当领事状态发生变化时;我无法再次调用 NameResolver.Listerner.onUpdate(),因为侦听器已被调用方 ManagedChannel 取消。我尝试在 NameResolver.start(Listener listener) 方法中保留 Listner 的引用。
    • 唯一的选择似乎是我必须编写自己的负载均衡器;再次不幸的是我不能使用 TransportManager.updateRetainedTransports() 因为它还没有实现。所有这些都是为了避免 Ngnix 或其他 HTTP2 负载均衡器代替 gRPC 客户端负载均衡器
    • NameResolver 应该将 start() 期间提供的 Listener 存储为一个字段,然后在发生变化时调用 onUpdate()。我不明白另一段代码如何使引用无效。这是由内置的 DnsNameResolver 完成的。
    • @EricAnderson 能否为我们公开示例代码。
    • @ThamiraLakmal,我不明白。你可以看看DnsNameResolver。由于阻止了 DNS 查询和一些临时黑客,这有点复杂。我们没有任何简单的示例,但在简单的情况下,仅 JavaDocs 就可以让您非常接近。
    【解决方案2】:

    我编写了自己的 LoadBalancer;和 @Override pickTransport() 从 Consul 到 RoundRobin 健康的 gRPC 服务器。

    【讨论】:

      【解决方案3】:

      在这里,我使用 consul 作为我的注册表。它工作正常。

      它包含 Eureka 和 consul 的示例。

      https://github.com/WThamira/gRpc-spring-boot-example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        相关资源
        最近更新 更多