一.OpenFeign的工作原理:
- 首先通过@EnableFeignClients注解开启FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描。
- 根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。
- 程序启动后,会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IoC容器中。
- 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象。
- 根据RequestTemplate再生成Http请求的Request对象。
- Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient和OkHttp。
- 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
二.OpenFeign和Ribbon的区别:
OpenFeign是基于Ribbon进行了封装,整合了Ribbon和SpringMvc注解,简化了Ribbon的url拼接,我们只需要简单编写Fiegn的客户端接口就可以像调用本地service去调用远程微服务。
三.Hystrix的功能有哪些:
熔断:自我保护机制,防止雪崩,服务器直接崩溃。
限流:到达上限限制,就拒绝请求
缓存:提供了请求缓存、请求合并实现 , 在高并发的场景之下,Hystrix请求缓存可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果。
降级:当一个业务(请求)失败/超时,就会走预先设置好的第二种方案(也就是降级逻辑)。
四.信号量和线程池隔离的区别:
1.线程池 :
hystix提供了一个线程池,让请求在新的线程中去执行(异步),限流上限就是线程池中的线程数量+队列长度,如果超出该限制-拒接请求,触发降级
会有线程切换消耗
2.信号量:
设置一个信号量(数字) ,请求来了会给一个计数器+1,请求走了会-1,某一个时刻,计数器达到信号量上限-拒接请求,触发降级 (同步)
不会有线程切换消耗,开销低
五.Hystrix的熔断机制:
当请求多次失败,就会标记上熔断状态。如果再次请求熔断状态的就会快速失败,触发降级。
避免线程阻塞,导致雪崩。
六.zuul的执行流程:
正常执行流程:
请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
异常执行流程:
-
整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
-
如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
-
如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了,就直接返回。
七.zuul如何定义filter
1.创建一个类继承 ZuulFilter
2.重写它的四个方法