本文共 2546 字,大约阅读时间需要 8 分钟。
在SpringBoot项目中使用OpenFeign之前,需要在启动类上添加@EnableFeignClients注解。这个注解会扫描项目中的所有标记有@FeignClient的接口,并为它们创建代理对象。
@EnableFeignClients@SpringBootApplicationpublic class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); }} 在需要调用远程服务的接口上添加@FeignClient注解,并指定服务名称和URL。例如:
@FeignClient(name = "user-service", url = "http://127.0.0.1:8001/user-service")public interface IUserFeign { @GetMapping("/user/queryUserName") String queryUserName(@RequestParam("userId") String userId);} 在pom.xml中添加OpenFeign的起始依赖。通常需要包括以下内容:
org.springframework.cloud spring-cloud-starter-openfeign 2.1.3.RELEASE
在服务实现类上注入@Resource接口,通过依赖注入获取远程服务代理。例如:
@Servicepublic class OrderServiceImpl implements IOrderService { @Resource private IUserFeign userFeign; @Override public List list() { // 调用远程服务 String userName = userFeign.queryUserName(userId); // ...其他逻辑 }} OpenFeign的工作流程从@EnableFeignClients注解开始。这个注解通过@Import(FeignClientsRegistrar.class)导入扫描注册类FeignClientsRegistrar。该类实现了ImportBeanDefinitionRegistrar接口,并在registerBeanDefinitions方法中执行扫描工作。
FeignClientsRegistrar获取一个ClassPathScanningCandidateComponentProvider扫描器。@EnableFeignClients注解的属性,获取标记了@FeignClient的接口类集合。AnnotationTypeFilter,只扫描标记了@FeignClient的接口。registerFeignClient方法将服务注册到Spring的BeanFactory中。registerFeignClient方法负责将服务注册为一个FeignClientFactoryBean的BeanDefinition。这个BeanDefinition的getObject方法会调用FeignClientFactoryBean的getObject方法,生成最终的代理对象。
FeignClientFactoryBean的getObject方法内部,通过Feign配置创建客户端,并使用Targeter构建目标。默认情况下,Spring Cloud的OpenFeign会集成Hystrix,因此Targeter会使用HystrixTargeter来处理服务调用。
当客户端通过代理对象调用接口方法时,调用会被FeignInvocationHandler处理。FeignInvocationHandler通过dispatch map查找对应的SynchronousMethodHandler,并调用其invoke方法。
SynchronousMethodHandler会构建请求,通过RequestTemplate执行远程调用。executeAndDecode方法负责发送HTTP请求并解析响应。如果没有启用Hystrix,默认的ReflectiveFeign会直接使用Spring的RestTemplate来执行调用。
当OpenFeign代理对象的方法被调用时,会执行以下步骤:
SynchronousMethodHandler通过RequestTemplate构建请求。client.execute方法发送HTTP请求。@EnableFeignClients注解扫描并注册远程服务代理。FeignInvocationHandler转换为HTTP请求。@FeignClient注解,可以自定义服务名称、URL、超时等配置。转载地址:http://ewpfk.baihongyu.com/