我没有找到任何地方来设置eureka中可接受的区域列表,但我发现我们可以创建自定义区域
ServerListFilter
在里面
Ribbon
Feign
和
Zuul
下面是代码
public class DevServerListFilter extends ZonePreferenceServerListFilter {
private final List<String> acceptedZone = new ArrayList<>();
public DevServerListFilter(String[] acceptedZones) {
for (String zone: acceptedZones) {
this.acceptedZone.add(zone);
}
}
@Override
public void initWithNiwsConfig(IClientConfig niwsClientConfig) {
super.initWithNiwsConfig(niwsClientConfig);
}
@Override
public List<Server> getFilteredListOfServers(List<Server> servers) {
List<Server> zoneAffinityFiltered = super.getFilteredListOfServers(servers);
Set<Server> candidates = Sets.newHashSet(zoneAffinityFiltered);
Iterator serverIterator = candidates.iterator();
while (serverIterator.hasNext()) {
Server server = (Server)serverIterator.next();
if(!acceptedZone.contains(server.getZone())) {
zoneAffinityFiltered.remove(server);
}
}
return zoneAffinityFiltered;
}
}
上述过滤器扩展
ZonePreferenceServerListFilter
通过检查已接受区域的列表,将忽略不在此列表中的任何服务器。
@Configuration
@RibbonClients(defaultConfiguration = MyDefaultRibbonConfiguration.class)
public class MyRibbonConfiguration {
}
我的所有客户端的默认配置
@Configuration
public class MyDefaultRibbonConfiguration {
// @Bean
// public IPing ribbonPing(IClientConfig config) {
// return new PingUrl();
// }
@Bean
public ServerListFilter<Server> ribbonServerListFilter(IClientConfig config,EurekaClientConfigBean eurekaClientConfigBean) {
String[] availabilityZones = eurekaClientConfigBean.getAvailabilityZones(eurekaClientConfigBean.getRegion());
DevServerListFilter filter = new DevServerListFilter(availabilityZones);
filter.initWithNiwsConfig(config);
return filter;
}
}
配置代码,请注意,它必须位于@ComponentScan中请求的排除路径中
documents
,我使用了availability zone属性,但可以使用任何列表。
github sample