服务提供端集群,会涉及到spring’cloud中的另一个组件 负载均衡 由组件feign实现
(默认仅仅实现负载均衡是不需要feign的,仅仅使用ribbon配置和@LoadBalance注解即可)
前面提到,消费者调用服务者的方法,是使用的discoveryClient.getInstances.get(0).geturi获取到的uri,再拼接成的url,交由restTemplate调用getForObject方法获得;
实际上,集群情况下,该做法只能获得固定的某一个服务,别的服务无法被调用,这时候就需要做负载均衡了;
需要在消费端 引入feign的依赖openfeign 启动类添加注解@EnableFeignClient
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置文件中配置
# feign 内置的ribbon 以下都是默认
ribbon:
ReadTimeout: 2000 # 读取超时时长 作用在服务提供端的,如果提供端2秒内未给出响应,视为超时
ConnectTimeout: 1000 # 建立链接的超时时长
MaxAutoRetries: 0 # 当前服务器的重试次数
MaxAutoRetriesNextServer: 0 # 重试多少次服务
OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试
重点:
@Bean
@LoadBalanced
// 在配置类中注入的Bean RestTemplate 需要添加注解@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
上一章中的代码 discoveryClient.getInstances.get(0).geturi 可以省略
使用 String url = “http://user-service/user/”+id 即可达到负载均衡的效果;
附:
# 设置eureka中ribbon的模式 默认为轮询,此时设置成随机; eureka中继承的ribbon
# 如果使用了feign组件集成的ribbon负载均衡组件,此处的配置仍然会作用到ribbon配置中.
# 调用user-service的时候,ribbon规则设置如下
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule