Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring Cloud/Netflix OSS中的负载平衡_Spring Boot_Spring Cloud_Microservices_Netflix Eureka_Netflix Ribbon - Fatal编程技术网

Spring boot Spring Cloud/Netflix OSS中的负载平衡

Spring boot Spring Cloud/Netflix OSS中的负载平衡,spring-boot,spring-cloud,microservices,netflix-eureka,netflix-ribbon,Spring Boot,Spring Cloud,Microservices,Netflix Eureka,Netflix Ribbon,我正在看Spring Boot/Cloud和Netflix FWs(Eureka,Ribbon)。我正在研究这个例子: 基本上,它是关于一些使用Eureka服务注册表的小型Spring Boot微服务的 现在,我想启动同一服务的多个实例(在本例中,AccountService位于不同的端口上)。我读到的所有内容(上面的文章等)都表明,如果我这样做,所有实例都会冗余地向Eureka注册,并且当我调用服务时,会应用客户端负载平衡,并动态选择要调用的服务 然而,事实并非如此。当我启动第一个服务实例时

我正在看Spring Boot/Cloud和Netflix FWs(Eureka,Ribbon)。我正在研究这个例子:

基本上,它是关于一些使用Eureka服务注册表的小型Spring Boot微服务的

现在,我想启动同一服务的多个实例(在本例中,AccountService位于不同的端口上)。我读到的所有内容(上面的文章等)都表明,如果我这样做,所有实例都会冗余地向Eureka注册,并且当我调用服务时,会应用客户端负载平衡,并动态选择要调用的服务

然而,事实并非如此。当我启动第一个服务实例时,它将被注册并显示在Eureka仪表板中。当我在不同的端口上启动相同的服务时,它也会注册,但它似乎会替换以前的服务实例:Eureka仪表板仍然只显示一个可用性区域为1(应该是2?)的实例,对该服务的所有调用都由第二个实例处理。查询注册表时,仅应用此实例

当我停止第二个实例时,经过一段时间后,Eureka切换回第一个实例,它仍然工作。因此,它似乎保留了所有实例,但只使用最新注册的实例

我错过了什么重要的事情吗?我认为所有实例都应该同时使用

========== 应用程序属性是(这些属性与Spring站点的示例基本相同):

EurekaServer

eureka:  
  instance:  
    hostname: localhost  
  client:    
    registerWithEureka: false  
    fetchRegistry: false  

server:  
  port: 1111     

spring:  
  thymeleaf:  
    enabled: false  
spring:  
  application:  
    name: accounts-service  
  freemarker:  
    enabled: false           
  thymeleaf:  
    cache: false             
    prefix: classpath:/accounts-server/templates/      

eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://localhost:1111/eureka/  

server:  
  port: 4444   # HTTP (Tomcat) port, for the second instance this is changed to a different port
帐户服务器

eureka:  
  instance:  
    hostname: localhost  
  client:    
    registerWithEureka: false  
    fetchRegistry: false  

server:  
  port: 1111     

spring:  
  thymeleaf:  
    enabled: false  
spring:  
  application:  
    name: accounts-service  
  freemarker:  
    enabled: false           
  thymeleaf:  
    cache: false             
    prefix: classpath:/accounts-server/templates/      

eureka:  
  client:  
    serviceUrl:  
      defaultZone: http://localhost:1111/eureka/  

server:  
  port: 4444   # HTTP (Tomcat) port, for the second instance this is changed to a different port

我认为,由于您在
帐户服务器上使用的是静态端口号,因此Eureka将只注册一个实例…
你可以在客户机上做类似的事情

server:
  compression.enabled: true
  port: 0
(在本例中,我使用YAML来配置,而不是属性)

在网关上,您应该指定需要一个负载平衡器,如下所示

 @Autowired
 private LoadBalancerClient loadBalancer;
 ....
 private String getUrl(){
    return loadBalancer.choose("your-service-name").getUri().toString();
}

我也做过类似的事情,如果您感兴趣,可以看一下

我认为,由于您在
帐户服务器上使用的是静态端口号
,Eureka将只注册一个实例…
你可以在客户机上做类似的事情

server:
  compression.enabled: true
  port: 0
(在本例中,我使用YAML来配置,而不是属性)

在网关上,您应该指定需要一个负载平衡器,如下所示

 @Autowired
 private LoadBalancerClient loadBalancer;
 ....
 private String getUrl(){
    return loadBalancer.choose("your-service-name").getUri().toString();
}

我也做过类似的事情,如果您感兴趣,可以查看一下

@dshuld如果您使用的是Angel release train或1.0.x版,您需要使每个实例都有一个唯一的id。请参阅。比如:

eureka:
  instance:
    metadataMap:
      instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}}

对于Brixton发布系列(1.1.x),它应该有一个合理的默认值。

@dshuld如果您使用的是Angel发布系列或1.0.x版本,则需要使每个实例具有唯一的id。请参阅。比如:

eureka:
  instance:
    metadataMap:
      instanceId: ${spring.application.name}:${spring.application.instance_id:${server.port}}

对于Brixton release train(1.1.x),它应该有一个合理的默认值。

您可以从客户端和服务器发布您的application.properties吗?您可以从客户端和服务器发布您的application.properties吗?正如我在问题中所写的,第二个实例是从不同的端口启动的。我也尝试过加载BalancerClient.choose()方法,但是其中一个只给我一个实例,而没有给我另一个。哦,对不起,我没有看到。如果你等一两分钟会发生什么?客户端可能找到这两个实例了吗?没有,它只找到最近注册的实例。。。当我停止该实例时,它会切换回第一个注册的实例,正如我在问题中所写的,第二个实例使用不同的端口启动。我也尝试过加载BalancerClient.choose()方法,但是其中一个只给我一个实例,而没有给我另一个。哦,对不起,我没有看到。如果你等一两分钟会发生什么?客户端可能找到这两个实例了吗?没有,它只找到最近注册的实例。。。当我停止该实例时,它会切换回第一个注册的实例