【LSP】微服务通信之feign的注册、发现过程
http://cdn.u1.huluxia.com/g4/M01/63/6A/rBAAdl90WmaAQirAAACt4WdlvYs650.jpg
前言
feign 是目前微服务间通信的主流方式,是springCloud中一个非常重要的组件。他涉及到了负载均衡、限流等组件。真正意义上掌握了feign可以说就掌握了微服务。
一、feign的使用
feign 的使用和dubbo的使用本质上非常相似。dubbo的理念是:像调用本地方法一样调用远程方法。那么套在feign上同样适用:像调用本地接口一样调用远程接口。
使用feign只需要2步:定义一个接口并用FeignClient注解说明接口所在服务和路径,服务启动类上添加@EnableFeignClients。如下所示
1.1,定义一个feign接口
@FeignClient(contextId = "order", name = "order", path = "/app")
public interface OrderApiFeignClient {
/**
* 获取订单列表
* @return
*/
@RequestMapping("order/list")
BaseResponse<List<OrderVO>> obtaining(@PathVariable("userId") Long userId);
}
1.2,再启动类上添加注解
@EnableSwagger2
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients("com.xxx.*")
@ComponentScan(value={"com.xxx"})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication .class, args);
}
}
二、feign 接口如何被实例化到spring容器的?
首先按照一般的思路,我们会猜测基于接口生成代理类,然后对接口的调用实际上调的是代理对象,那真的是这样么? 我们带着猜想往下看。
2.1 @EnableFeignClients 注解都做了些什么?
http://cdn.u1.huluxia.com/g4/M01/63/6A/rBAAdl90WmeAbgTzAACr_xyzzPM159.png
可以看到注解本身主要定义了要扫描的feign接口包路径以及配置,但是注解本身又有注解Import ,可以看到他引入了FeignClientsRegistrar到容器。从名字看这个类就应该是在将feign接口注册到容器中,接下来我们具体看一下这个类干了些什么。
/**
* @author Spencer Gibb
* @author Jakub Narloch
* @author Venil Noronha
* @author Gang Li
*/
class FeignClientsRegistrar
implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
可以看到FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar接口,但凡是实现了这个接口的类被注入到容器后,spring容器在启用过程中都会去调用它的void registerBeanDefinitions(AnnotationMetadata var1, BeanDefinitionRegistry var2)方法,可以确定的是FeignClientsRegistrar肯定重写了此方法,我们接下来看一下该方法的实现。http://cdn.u1.huluxia.com/g4/M01/63/6B/rBAAdl90WmeAIGFBAABBh57FUEE171.png
可以看到在这个方法中做了两件事: 1)注册feign配置, 2)注册feign接口。我们这里抓一下重点,看一下feign接口是怎么注册的?http://cdn.u1.huluxia.com/g4/M01/63/6B/rBAAdl90WmmADP_9AAZ1i3bcKNE586.jpg
页:
[1]