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