Ribbon&Feign

  1. Ribbon:一个基于Http和TCP的客户端负载均衡工具。部署在客户端,解决并提供了微服务的负载均衡问题。
  2. 负载均衡分类:
    a) 集中式负载均衡:即在 consumer 和provider 之间使用独立的负载均衡设施(比如nginx等,通过某种策略转发给provider )
    b) 将负载均衡逻辑集成到consumer, consumer从注册中心获知有那些地址可以用,然后自己再从这些地址中选择出一个合适的 provider
    c) 二者区别:集中式负载均衡 , 有一个独立的负载均衡服务器部署在 客户端 与服务之间 ,由它来接受请求并分配给不同的服务。进程式负载均衡将负载均衡逻辑集成到consumer .consumer从注册中心获悉那些服务可以用 ,再按照负载均衡策略使用服务
  3. Ribbon的负载均衡策略:轮询,随机 ,权重。
  4. ILoadBalance 负载均衡器:ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等。负载均衡器是从EurekaClient(EurekaClient的实现类为DiscoveryClient)获取服务信息,根据IRule去路由,并且根据IPing判断服务的可用性。完整过程:首先获取所有标识@LoadBalanced注解的RestTemplate(可以理解成获取那些开启了Ribbon负载均衡功能的RestTemplate),然后将Ribbon默认的拦截器LoadBalancerInterceptor添加到RestTemplate中,这样当使用RestTemplate发起http请求时就会起到拦截的作用。当有请求发起时,ribbon默认的拦截器首先会创建ILoadBalancer(里面包含了选取服务的规则(IRule)、服务集群的列表(ServerList)、检验服务是否存活(IPing)等特性)。然后使用ILoadBalancer从服务集群中选择一个服务,最后向这个服务发送请求。https://www.jianshu.com/p/e459f43ef96d
  5. Feign:https://zhuanlan.zhihu.com/p/78286377 Feign 是一种声明式、模板化的 HTTP 客户端(仅在 consumer 中使用)。封装了Http调用流程,更适合面向接口化的变成习惯,Spring Cloud 的声明式调用, 可以做到使用 HTTP 请求远程服务时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的Http Client 构造请求再解析返回数据。
  6. Feign具体流程:
    a) PHASE 1. 基于面向接口的动态代理方式生成实现类:在Feign 底层,通过基于面向接口的动态代理方式生成实现类,将请求调用委托到动态代理实现类
    b) PHASE 2. 根据Contract协议规则,解析接口类的注解信息(将注解解析成参数等操作)
    c) PHASE 3. 基于 RequestBean,动态生成Request: 根据传入的Bean对象和注解信息,从中提取出相应的值,来构造Http Request 对象
    d) PHASE 4. 使用Encoder 将Bean转换成 Http报文正文(消息解析和转码逻辑)
    e) PHASE 5. 拦截器负责对请求和返回进行装饰处理,用户可以实现Feign的拦截器接口进行自定义操作。
    f) PHASE 6. 日志记录,在发送和接收请求的时候,Feign定义了统一的日志门面来输出日志信息 , 并且将日志的输出定义了四个等级:
    NONE 不做任何记录
    BASIC 只记录输出Http 方法名称、请求URL、返回状态码和执行时间
    HEADERS 记录输出Http 方法名称、请求URL、返回状态码和执行时间 和 Header 信息
    FULL 记录Request 和Response的Header,Body和一些请求元数据
    g) PHASE 7 . 基于重试器发送HTTP请求: Feign 内置了一个重试器,当HTTP请求出现IO异常时,Feign会有一个最大尝试次数发送请求
    h) PHASE 8. 发送Http请求。Feign 真正发送HTTP请求是委托给 feign.Client 来做的:Feign 默认底层通过JDK 的 java.net.HttpURLConnection 实现了feign.Client接口类,在每次发送请求的时候,都会创建新的HttpURLConnection 链接,这也就是为什么默认情况下Feign的性能很差的原因。可以通过拓展该接口,使用Apache HttpClient 或者OkHttp3等基于连接池的高性能Http客户端
  7. Feign 整体框架非常小巧,在处理请求转换和消息解析的过程中,基本上没什么时间消耗。真正影响性能的,是处理Http请求的环节。如上所述,由于默认情况下,Feign采用的是JDK的HttpURLConnection,所以整体性能并不高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值