netflix-eureka - 在 Eureka 中设置接受区域列表

标签 netflix-eureka spring-cloud-netflix

他们是在 Eureka 中忽略区域或定义可接受区域列表的方法,例如,如果我们有 3 个区域(officeshahbourjoe )

我希望区域 shahbour 中的服务仅使用 shahbour 中定义的主要服务和 office 中的次要服务,并忽略此区域中的所有其他区域示例 joe

我尝试如下所示,它正在努力选择相同的区域,但如果它们在同一区域没有服务,它会在所有其他区域进行负载平衡

spring:
  profiles: shahbour
eureka:
  instance:
    metadataMap:
      zone: shahbour
  client:
    region: lebanon
    serviceUrl:
      defaultZone: http://office:8761/eureka/
    preferSameZoneEureka: true
    availabilityZones:
      lebanon: shahbour,office

我以为设置 availabilityZones 会设置这个,但事实并非如此。

这是针对开发环境的,我试图将每个开发人员设置为使用他的机器作为区域,如果服务不存在,则使用办公室服务器作为备份,但不要使用其他开发人员。

最佳答案

我没有在 eureka 中找到任何地方设置可接受的区域列表,但我发现我们可以在 Ribbon 中创建我们的自定义 ServerListFilter 用于FeignZuul 所以下面是代码

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 中的请求,并且我使用了可用性区域属性,但可以使用任何列表。

github sample

关于netflix-eureka - 在 Eureka 中设置接受区域列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44881018/

相关文章:

java - Controller 中构造函数的参数 0 需要一个类型为 Service 类的 bean,但无法找到

java - Spring cloud中Zuul服务器的回退方法

docker - 尽管有 docker 容器的随机外部端口,但仍使用 Eureka

spring-cloud - Hystrix 和 Ribbon 超时警告

docker - 当 Docker 容器发布端口时,应用程序使用 IP 而不是主机名在 Eureka 中注册

testing - 如何实现集成测试以检查我的断路器回退是否被调用?

java - 方法 POST 不支持 Netflix Eureka 和 ZUUL

spring-boot - 如何将Keycloak注册到Spring Eureka Server

docker - Dockerized微服务无法注册到Eureka服务器

spring-boot - 何时配置 zuul 路由