OpenFeign精选

https://www.bilibili.com/read/cv11238006/   掌握 OpenFeign 核心原理

https://blog.csdn.net/weixin_70730532/article/details/126875028  OpenFeign 夺命连环 9问

OpenFeign主要用于微服务项目中的服务远程调,Feign 不做任何请求处理,通过处理注解相关信息生成 Request,并对调用返回的数据进行解码,从而实现 简化 HTTP API 的开发 。

Feign 的启动原理 

1.Feign Starter 在项目启动过程中注册全局配置,扫描包下所有的 @FeignClient 接口类,并进行注册 IOC 容器@FeignClient 接口类被注入时,通过动态代理 (FactoryBean#getObject )返回动态代理类。接口被调用时被动态代理类逻辑拦截

2. 将获取的 @FeignClient 中的url等 请求信息通过编码器生成 Request

3. 将获取的服务名称,交由 Ribbon 进行负载均衡,挑选出一个健康的 Server 实例

4.继而通过 Client 携带 Request 调用远端服务返回请求响应,通过解码器生成 Response 返回客户端,将信息流解析成为接口返回数据 

在使用Feign作为客户端时,最终请求会转发成 http://<服务名称>/<relative-path-to-service>的格式,通过LoadBalancerFeignClient, 提取出服务标识<服务名称>,然后根据服务名称在上下文中查找对应服务的负载均衡器FeignLoadBalancer,负载均衡器负责根据既有的服务实例的统计信息,挑选出最合适的服务实例

 

Ribbon通过ILoadBalancer接口提供负载均衡服务,其实现原理为:

 

  • ILoadBalancer依赖ServerList通过DiscoveryClient从nacos Client处获取Server列表并缓存这些Server列表。
  • IPing接口定时对ILoadBalancer缓存的Server列表进行检测,判断其是否可用。
  • IRule接口是负载均衡策略的抽象,ILoadBalancer通过IRule选出一个Server。(就是通过算法怎么对已经获取到的服务精选选取)

Hystrix如何实现:

使用命令模式将所有对外部服务(或依赖关系)的调用包装在HystrixCommand或HystrixObservableCommand对象中,并将该对象放在单独的线程中执行;
每个依赖都维护着一个线程池(或信号量),线程池被耗尽则拒绝请求(而不是让请求排队)。
记录请求成功,失败,超时和线程拒绝。
服务错误百分比超过了阈值,熔断器开关自动打开,一段时间内停止对该服务的所有请求。
请求失败,被拒绝,超时或熔断时执行降级逻辑。
近实时地监控指标和配置的修改。

 面试题:

1.如果openFeign没有设置对应得超时时间,那么将会采用Ribbon的默认超时时间

 

posted @ 2023-05-29 16:23  好记性不如烂笔头=>  阅读(79)  评论(0编辑  收藏  举报