一.简介
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做到了负载均衡。
网友评论