在Eureka中设置加入区域列表

时间:2017-07-03 08:33:50

标签: 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设置了这个,但事实并非如此。

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

1 个答案:

答案 0 :(得分:1)

我没有找到任何地方在eureka中设置接受的区域列表,但我发现我们可以在ServerListFilter中创建Ribbon中使用的自定义Feign Zuulpublic 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;
    }

}

我所有客户的默认配置

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

<?php
    $target_dir = "uploads/";
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
        } else {
            echo "File is not an image.";
            $uploadOk = 0;
        }
    }
    ?>

配置代码,请注意,这必须位于documents中作为请求的@ComponentScan的排除路径中,并且我使用了可用区属性,但可以使用任何列表。

github sample