类似于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());
}
}
我想这只是在频道上正确设置配置的问题,但我不确定是否遗漏了什么。
暂无答案!
目前还没有任何答案,快来回答吧!