底层使用Ribbon作为负载均衡的客户端,而Ribbon的负载均衡依赖于注册中心来获得各个服务的地址
根据URI自动调用注册中心的相应服务
底层默认使用JDK中的HttpURLConnection发送HTTP请求

原理简述

  1. 程序启动时,进行包扫描

    1. @EnableFeignClients(basePackages={"com.genew.cm.common"})注解配置的扫描包路径,如果没配置,默认为启动类的包路径 <br />获取扫描包路径@FeignClient注解的类,注入扫IOC容器<br />类必须是interface<br />fallbackfallbackFactory配置的必须是接口的实现类
  2. Feign中的接口被调用时,通过JDK的动态代理来生成RequestTemplate

代理类先调用到FeignInvocationHandler的invoke方法,而这个invoke方法相当于直接调用了SynchronousMethodHandler的invoke方法
构造了RequestTemplate以及出现异常重试的Retryer,最后根据构造的RequestTemplate发起了http请求以及decode
RequestTemplate中包含所有信息,并声明Request
构造RequestTemplate时,根据传入的参数动态构建URL中的参数(@PathVarible)以及URL ?追加的参数,还有body等等,最后再处理@QueryMap注入的参数,以保证优先级最高
发起http请求时,没有负载均衡时,默认是通过JDK的HttpURLConnection发送请求,另一种就是LoadBalancerFeignClient各种实现类,如Apache的HTTPClient,以及OKhttp等,这些实现也是通过ribbon动态指定服务器IP地址,以达到负载均衡的作用
最后将response处理成需要的返回值类型,以及根据状态码进行decode
image.png