Feign

作者: 升空的焰火 | 来源:发表于2019-06-13 08:56 被阅读0次

一.简介

springcloud的服务器之间的调用方式。

@FeignClient(value = AAA.IFAAS_FILE_SYSTEM,url ="http://")       

通过注解在接口上,使用restful风格调用其他服务接口。

现在思考下,如何这样实现?

1.首先注解的扫描:

            结合springboot,配置装载技术,扫描注解.

2.因为是请求时做调用,加载注解的信息,所有应该是aop操作,这样必须找到实现类:

          实现类用动态代理实现,然后加入到springbean中。

3.模板会请求:restTemplate


4.负载均衡:ribbon


来看看feign的实现

1.通过包扫描注入FeignClient的bean,该源码在FeignClientsRegistrar类:首先在启动配置上检查是否有@EnableFeignClients注解,如果有该注解,则开启包扫描,扫描被@FeignClient注解接口 .


2.程序启动后通过包扫描,当类有@FeignClient注解,将注解的信息取出,连同类名一起取出,赋给BeanDefinitionBuilder,然后根据BeanDefinitionBuilder得到beanDefinition,最后beanDefinition式注入到ioc容器中.



3.注入bean之后,通过jdk的代理,当请求Feign Client的方法时会被拦截,代码在ReflectiveFeign类

4. 在SynchronousMethodHandler类进行拦截处理,当被FeignClient的方法被拦截会根据参数生成RequestTemplate对象,该对象就是http请求的模板

5. 其中有个executeAndDecode()方法,该方法是通RequestTemplate生成Request请求对象,然后根据用client获取response


启动类@EnableFeignClients -> registerDefaultConfiguration-> registerFeignClients-> newInstance-> invoke

总结

首先通过@EnableFeignCleints注解开启FeignCleint

根据Feign的规则实现接口,并加@FeignCleint注解

程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。

当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate

RequesTemplate在生成Request

Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp

最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

相关文章

网友评论

      本文标题:Feign

      本文链接:https://www.haomeiwen.com/subject/uvgfgqtx.html