1、本例采用spring cloud feign + eureka 实现
2、feign底层其实用的ribbon实现负载均衡
3、代码分析
provider1代码如下:
@Slf4j
@RestController
public class TestController {
@GetMapping("/hello")
public Object hello() throws InterruptedException {
log.info("service provider 1");
Thread.sleep(7000L);
return "hello,I'am service provider 1";
}
}
实例1,设置延时7s。
实例2正常
consumer配置文件
server:
port: 8081
spring:
application:
name: feign-consume
eureka:
client:
serviceUrl:
defaultZone: http://localhost:12346/eureka/
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置规则 随机
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置规则 重试
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
ConnectTimeout: 500 #请求连接超时时间
ReadTimeout: 1000 #请求处理的超时时间
OkToRetryOnAllOperations: true #对所有请求都进行重试
MaxAutoRetriesNextServer: 2 #切换实例的重试次数
MaxAutoRetries: 1 #对当前实例的重试次数
OkToRetryOnAllOperations:是否所有请求都重试,false:只有get重试,true:get和post都会重试,需要关注接口幂等性因素。
4、请求服务
发现超时,超时等待时间为1s
此时provider1打印日志(不包含首次重试1次MaxAutoRetries)
2020-09-18 18:09:08.601 INFO 79741 --- [io-10001-exec-7] c.s.c.e.controller.TestController : service provider 1
2020-09-18 18:09:09.607 INFO 79741 --- [io-10001-exec-8] c.s.c.e.controller.TestController : service provider 1
但是页面返回结果是:
hello,I'am service provider 2
可以得出结论,在请求provider1超时的情况下,请求了provider1两次,两次任然超时,切换请求实例到provider2,最终返回provider2的结果。