Spring boot Spring Cloud/Netflix OSS中的负载平衡
我正在看Spring Boot/Cloud和Netflix FWs(Eureka,Ribbon)。我正在研究这个例子: 基本上,它是关于一些使用Eureka服务注册表的小型Spring Boot微服务的 现在,我想启动同一服务的多个实例(在本例中,AccountService位于不同的端口上)。我读到的所有内容(上面的文章等)都表明,如果我这样做,所有实例都会冗余地向Eureka注册,并且当我调用服务时,会应用客户端负载平衡,并动态选择要调用的服务 然而,事实并非如此。当我启动第一个服务实例时,它将被注册并显示在Eureka仪表板中。当我在不同的端口上启动相同的服务时,它也会注册,但它似乎会替换以前的服务实例:Eureka仪表板仍然只显示一个可用性区域为1(应该是2?)的实例,对该服务的所有调用都由第二个实例处理。查询注册表时,仅应用此实例 当我停止第二个实例时,经过一段时间后,Eureka切换回第一个实例,它仍然工作。因此,它似乎保留了所有实例,但只使用最新注册的实例 我错过了什么重要的事情吗?我认为所有实例都应该同时使用 ========== 应用程序属性是(这些属性与Spring站点的示例基本相同): EurekaServerSpring 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注册,并且当我调用服务时,会应用客户端负载平衡,并动态选择要调用的服务 然而,事实并非如此。当我启动第一个服务实例时
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()方法,但是其中一个只给我一个实例,而没有给我另一个。哦,对不起,我没有看到。如果你等一两分钟会发生什么?客户端可能找到这两个实例了吗?没有,它只找到最近注册的实例。。。当我停止该实例时,它会切换回第一个注册的实例