SpringCloud的Fegin,Ribbon详解
大家好,我是酷酷的韩~ 下面将继续分享springcloud中的feign和ribbon。
一.fegin简介?
1.feign是netflix开发的声明式,模板化的HTTP客户端,Feign可以帮我们更快捷,优雅的调用HTTP API
2.feign采用的是基于接口的注解
3.feign整合了ribbon,具有负载均衡的能力。
4.整合了hystrix,具有熔断的能力。
二.fegin的使用:
1.添加pom文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.启动类添加@EnableFeignClients
3.定义一个接口@FeignClient(name=“xxx”)指定调用哪个服务
4.fallback调用失败回调方法,需要使用如下配置:
feign:
hystrix:
enabled:true
5.一般情况下 ribbon的超时时间<hystrix超时时间(因为涉及到ribbon的重试机制)
因为ribbon中重试机制与feign的重试机制有冲突,源码中默认关闭feign的重试机制。
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用
如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义
hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次
默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
非GET方式请求,只有连接异常时,才会进行重试
三.示例:
1.这里有两个服务,hjq-provider-mh,hjh-provider-rw。首先在hjq-provider-rw中写一个接口,如下:
/**
* 测试熔断
*/
@GetMapping(value = "user/test")
public String test() {
try {
Thread.sleep(2000);
return "测试1";
} catch (InterruptedException e) {
}
return "测试2";
}
全路径为/rw/user/test
2.在hjq-provider-mh中写一个接口
@RestController
@Slf4j
public class TestFeignController {
@Autowired
private TestFeign testFeign;
@GetMapping("/test/test")
public String test(@RequestParam("number") Integer number) {
if (number == 1) {
return "success";
}
return testFeign.test();
}
}
feign调用方:
@FeignClient(value = "hjq-provider-rw",fallback = TestFeign.TestFeignA.class)
public interface TestFeign {
@GetMapping(value = "/rw/user/test")
public String test();
@Component
@Slf4j
static class TestFeignA implements TestFeign{
@Override
public String test() {
log.error("挤爆了!");
return "挤爆了!";
}
}
}
其中@FeignClient中value是指定服务名,fallback指降级后的返回,当被调用方(这里是hjq-provider-rw)服务停止时会出现服务降级,返回’“挤爆了”,feign默认是不开启服务熔断,不能够走fallback,需要添加如下配置:
#开启hystrix配置
feign:
hystrix:
enabled: true #开启feign熔断
3.两个服务都启动,调用hjq-provider-mh中的接口,正常情况如下
当断开hjq-provider-rw服务,或者里面的服务报错,异常,则是以下:
4.监控熔断,当多次出现此情况时,出现熔断如下:
Circuit:Open熔断器打开,默认是20个服务 50%出错,则出现服务熔断,此时可以参考另一篇文章:https://blog.csdn.net/hjq_ku/article/details/89520168 里面有介绍到详细一些。
天行健,君子以自強不息,地勢坤,君子以厚德载物。------酷酷的韩~