如何覆盖 Spring 云功能区中的 ribbon.serverListRefreshInterval 默认值?
How to override the ribbon.serverListRefreshInterval default value in Spring Cloud Ribbon?
我写了一个简单的 Spring Cloud Ribbon 应用程序,用于调用在 Eureka 中注册的 REST 服务。
但是如何覆盖 ribbon.serverListRefreshInterval
值呢?默认值是30秒,我想减少时间间隔。
提前致谢。
试试:
myService.ribbon.ServerListRefreshInterval=10000
其中 myService
是您的目标微服务的名称。
更新:
在挖掘一些源代码后,我发现 LoadBalancerBuilder
调用:
@Deprecated
public ZoneAwareLoadBalancer(IClientConfig clientConfig, IRule rule,
IPing ping, ServerList<T> serverList, ServerListFilter<T> filter) {
super(clientConfig, rule, ping, serverList, filter);
}
谁的超级是:
@Deprecated
public DynamicServerListLoadBalancer(IClientConfig clientConfig, IRule rule, IPing ping,
ServerList<T> serverList, ServerListFilter<T> filter) {
this(
clientConfig,
rule,
ping,
serverList,
filter,
new PollingServerListUpdater()
);
}
注意 PollingServerListUpdater
构造函数:
private static int LISTOFSERVERS_CACHE_REPEAT_INTERVAL = 30 * 1000; // msecs;
public PollingServerListUpdater() {
this(LISTOFSERVERS_CACHE_UPDATE_DELAY, LISTOFSERVERS_CACHE_REPEAT_INTERVAL);
}
public PollingServerListUpdater(IClientConfig clientConfig) {
this(LISTOFSERVERS_CACHE_UPDATE_DELAY, getRefreshIntervalMs(clientConfig));
}
第二个允许我们覆盖默认的刷新间隔。但是它是第一个被调用的,所以它忽略了 属性.
更新 2:
有一个关于此的未解决问题:https://github.com/spring-cloud/spring-cloud-netflix/issues/1304
@codependent
在application.yml中进行如下配置后,貌似配置没有生效
Compute-Service:
ribbon:
ServerListRefreshInterval: 1000
我观察到实例列表已在 Ribbon 端更新(通过 eureka.client.registry-fetch-interval-seconds 参数),但是 Ribbon 仍然指出一个死实例:
[tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_RIBBON-CONSUMER/192.168.1.101:Ribbon-Consumer:3333 - Heartbeat status: 200
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Got delta update with apps hashcode UP_2_
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Added instance 192.168.1.101:Ribbon-Consumer:3333 to the existing apps in region null
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Deleted instance 192.168.1.101:Compute-Service:2222 to the existing apps
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Added instance 192.168.1.101:Compute-Service:1111 to the existing apps in region null
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : The total number of instances fetched by the delta processor : 3
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : The total number of all instances in the client now is 2
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Completed cache refresh task for discovery. All Apps hash code is Local region apps hashcode: UP_2_, is fetching remote regions? false
[nio-3333-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://Compute-Service/add": Connection refused; nested exception is java.net.ConnectException: Connection refused] with root cause
192.168.1.101:Compute-Service:1111 是正确的服务实例,而 192.168.1.1.101:Compute-Service:2222 是死实例,显然 Ribbon 仍然指向死实例,这意味着 Ribbon ServerList 缓存没有刷新.
我写了一个简单的 Spring Cloud Ribbon 应用程序,用于调用在 Eureka 中注册的 REST 服务。
但是如何覆盖 ribbon.serverListRefreshInterval
值呢?默认值是30秒,我想减少时间间隔。
提前致谢。
试试:
myService.ribbon.ServerListRefreshInterval=10000
其中 myService
是您的目标微服务的名称。
更新:
在挖掘一些源代码后,我发现 LoadBalancerBuilder
调用:
@Deprecated
public ZoneAwareLoadBalancer(IClientConfig clientConfig, IRule rule,
IPing ping, ServerList<T> serverList, ServerListFilter<T> filter) {
super(clientConfig, rule, ping, serverList, filter);
}
谁的超级是:
@Deprecated
public DynamicServerListLoadBalancer(IClientConfig clientConfig, IRule rule, IPing ping,
ServerList<T> serverList, ServerListFilter<T> filter) {
this(
clientConfig,
rule,
ping,
serverList,
filter,
new PollingServerListUpdater()
);
}
注意 PollingServerListUpdater
构造函数:
private static int LISTOFSERVERS_CACHE_REPEAT_INTERVAL = 30 * 1000; // msecs;
public PollingServerListUpdater() {
this(LISTOFSERVERS_CACHE_UPDATE_DELAY, LISTOFSERVERS_CACHE_REPEAT_INTERVAL);
}
public PollingServerListUpdater(IClientConfig clientConfig) {
this(LISTOFSERVERS_CACHE_UPDATE_DELAY, getRefreshIntervalMs(clientConfig));
}
第二个允许我们覆盖默认的刷新间隔。但是它是第一个被调用的,所以它忽略了 属性.
更新 2:
有一个关于此的未解决问题:https://github.com/spring-cloud/spring-cloud-netflix/issues/1304
@codependent
在application.yml中进行如下配置后,貌似配置没有生效
Compute-Service:
ribbon:
ServerListRefreshInterval: 1000
我观察到实例列表已在 Ribbon 端更新(通过 eureka.client.registry-fetch-interval-seconds 参数),但是 Ribbon 仍然指出一个死实例:
[tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_RIBBON-CONSUMER/192.168.1.101:Ribbon-Consumer:3333 - Heartbeat status: 200
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Got delta update with apps hashcode UP_2_
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Added instance 192.168.1.101:Ribbon-Consumer:3333 to the existing apps in region null
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Deleted instance 192.168.1.101:Compute-Service:2222 to the existing apps
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Added instance 192.168.1.101:Compute-Service:1111 to the existing apps in region null
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : The total number of instances fetched by the delta processor : 3
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : The total number of all instances in the client now is 2
[freshExecutor-0] com.netflix.discovery.DiscoveryClient : Completed cache refresh task for discovery. All Apps hash code is Local region apps hashcode: UP_2_, is fetching remote regions? false
[nio-3333-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://Compute-Service/add": Connection refused; nested exception is java.net.ConnectException: Connection refused] with root cause
192.168.1.101:Compute-Service:1111 是正确的服务实例,而 192.168.1.1.101:Compute-Service:2222 是死实例,显然 Ribbon 仍然指向死实例,这意味着 Ribbon ServerList 缓存没有刷新.