grpcjava缓存旧的dns条目,不重试获取新条目

hgqdbh6s  于 2021-06-29  发布在  Java
关注(0)|答案(0)|浏览(207)

类似于javagrpc:invalidatedns cache,但更具体地说是docker开发环境,在该环境中,服务可以上下移动(因为有些堆栈非常占用资源,所以有些堆栈会根据需要关闭和打开)。更容易做到 docker stack rm 以及 docker stack deploy 对于我们需要的部分,而不是为每个堆栈创建缩放脚本。在这种情况下,当重新创建服务时,vip可以更改(我知道我可以在网络上修复ip,但这意味着每个堆栈必须知道哪些可用,这是我想要避免的)。
在这种情况下,dns可能指向一个旧的地址,所以我使用 -Dnetworkaddress.cache.ttl=5 看一下grpcjava代码,我似乎只需要设置这些代码,这样就可以保持一致。至少5秒(即ttl)
但是假设我想让它运行起来,只在需要时重试,只定义一次消息通道(因为根据说明,这是一个非常昂贵的操作)。我把事情安排如下。但我偶尔会失败。我不重用存根,因为它似乎会在我第一次使用时引起问题。

@Component
public class ClientProvider {
  @Value("${srv.host}")
  private String host;

  @Value("${srv.port}")
  private int port;

  @Value("${srv.maxRetryAttempts:5}")
  private int maxiRetryAttempts;

  @Value("${srv.maxMessageSize:50000000}")
  private int maxMessageSize;

  private ManagedChannel channel;
  @PostConstruct
  public void initChannel() {
    channel = ManagedChannelBuilder
             .forAddress(host, port)
             .usePlaintext()
             .enableRetry()
             .maxRetryAttempts(maxRetryAttempts)
             .maxInboundMessageSize(maxMessageSize)
             .build();
  }

  public MyBlockingStub blockingStub() {
    return MyGrpc.newBlockingStub(channel);
  }

  public MyStub stub() {
    return MyGrpc.newStub(channel);
  }

  @PreDestroy
  public void shutdownChannel() {
    channel.shutdown();
  }
}

所以我摆脱了单一通道,每次需要存根时都创建通道。它似乎工作,但我不认为这是正确的方式做事情,特别是因为我没有清理通道后使用。

@Component
public class ClientProvider {
  @Value("${srv.host}")
  private String host;

  @Value("${srv.port}")
  private int port;

  @Value("${srv.maxRetryAttempts:5}")
  private int maxiRetryAttempts;

  @Value("${srv.maxMessageSize:50000000}")
  private int maxMessageSize;

  public ManagedChannel channel() {
    return ManagedChannelBuilder
             .forAddress(host, port)
             .usePlaintext()
             .enableRetry()
             .maxRetryAttempts(maxRetryAttempts)
             .maxInboundMessageSize(maxMessageSize)
             .build();
  }

  public MyBlockingStub blockingStub() {
    return MyGrpc.newBlockingStub(channel());
  }

  public MyStub stub() {
    return MyGrpc.newStub(channel());
  }
}

我想这只是在频道上正确设置配置的问题,但我不确定是否遗漏了什么。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题