服务调用
Eureka内部已经集成了ribbon,因此我们直接使用就可以
- 在创建RestTemplate的时候,声明@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 使用restTemplate调用远程微服务
restTemplate.getForObject("http://product-service/product/getProduct/"+id,String.class);
ip和端口使用服务名代替
负载均衡
ribbon是一个典型的客户端负载均衡器,在发起访问之前,ribbon会根据内部的负载均衡算法,获取本次请求应该访问的地址。
负载均衡策略
- com.netflix.loadbalancer.RoundRobinRule:以轮询的方法进行负载均衡(默认)
- com.netflix.loadbalancer.RandomRule:随机策略
- com.netflix.loadbalancer.RetryRule:重试策略
- com.netflix.loadbalancer.WeightedResponseTimeRule:权重策略,会计算每隔服务的权重,越高的被调用的可能性就越大
- com.netflix.loadbalancer.BestAvailabilityFilteringRule:可用过滤策略,过滤掉故障和请求超过阈值的服务实例,再从剩下的实例中轮询调用
在服务消费者中的yml文件中选择负载均衡策略:
#修改ribbon的负载均衡策略,规则 服务名:ribbon:NFLoadBalancerRuleClassName:策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略选择建议:
根据机器的负载能力,如果性能都差不多,就用轮询策略就可以了,如果性能差别有点大,那就使用权重
重试机制
假如服务的消费者发送一个请求到服务提供者,在规定时间内没有响应(请求失败),则会根据负载均衡策略发送这个请求到另一台机器重试(默认情况下是不开启的)。
- 在服务的消费者的pom文件中引入依赖:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
- 在yml文件中,修改配置
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #重试策略
ConnectTimeout: 250 #Ribbon的连接超时时间
ReadTimeout: 1000 #Ribbon的数据读取超时时间
OkToRetryOnAllOperation: true #是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 #切换实例重试次数
MaxAutoRetries: 1 #对当前实例的重试次数
注意,假如要关闭重试,则需要将OkToRetryOnAllOperation设置成false