博客
关于我
OpenFeign源码学习
阅读量:791 次
发布时间:2023-02-23

本文共 2546 字,大约阅读时间需要 8 分钟。

SpringBoot中使用OpenFeign

启动类注解

在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工作原理

启动时处理

OpenFeign的工作流程从@EnableFeignClients注解开始。这个注解通过@Import(FeignClientsRegistrar.class)导入扫描注册类FeignClientsRegistrar。该类实现了ImportBeanDefinitionRegistrar接口,并在registerBeanDefinitions方法中执行扫描工作。

扫描逻辑
  • 获取扫描器FeignClientsRegistrar获取一个ClassPathScanningCandidateComponentProvider扫描器。
  • 获取属性:获取@EnableFeignClients注解的属性,获取标记了@FeignClient的接口类集合。
  • 处理不同情况
    • 如果没有指定具体接口,扫描器添加AnnotationTypeFilter,只扫描标记了@FeignClient的接口。
    • 如果指定了具体接口,遍历这些接口,获取其包名并添加到扫描范围内。
  • 注册服务:遍历所有匹配的接口,获取它们的元数据,并调用registerFeignClient方法将服务注册到Spring的BeanFactory中。
  • 服务注册

    registerFeignClient方法负责将服务注册为一个FeignClientFactoryBean的BeanDefinition。这个BeanDefinition的getObject方法会调用FeignClientFactoryBeangetObject方法,生成最终的代理对象。

    代理对象生成

    FeignClientFactoryBeangetObject方法内部,通过Feign配置创建客户端,并使用Targeter构建目标。默认情况下,Spring Cloud的OpenFeign会集成Hystrix,因此Targeter会使用HystrixTargeter来处理服务调用。

    服务调用流程

    当客户端通过代理对象调用接口方法时,调用会被FeignInvocationHandler处理。FeignInvocationHandler通过dispatch map查找对应的SynchronousMethodHandler,并调用其invoke方法。

    SynchronousMethodHandler会构建请求,通过RequestTemplate执行远程调用。executeAndDecode方法负责发送HTTP请求并解析响应。如果没有启用Hystrix,默认的ReflectiveFeign会直接使用Spring的RestTemplate来执行调用。


    OpenFeign调用远程接口

    当OpenFeign代理对象的方法被调用时,会执行以下步骤:

  • 构建请求SynchronousMethodHandler通过RequestTemplate构建请求。
  • 发送请求:调用client.execute方法发送HTTP请求。
  • 处理响应:根据返回类型(如JSON、XML等)解析响应。
  • 处理异常:如果出现404错误或其他非正常响应,OpenFeign会根据配置决定是否重试或抛出异常。

  • 总结

    • OpenFeign通过@EnableFeignClients注解扫描并注册远程服务代理。
    • 代理对象的方法调用最终通过FeignInvocationHandler转换为HTTP请求。
    • OpenFeign默认集成Hystrix,支持服务发现、重试和负载均衡等功能。
    • 开发者通过配置@FeignClient注解,可以自定义服务名称、URL、超时等配置。

    转载地址:http://ewpfk.baihongyu.com/

    你可能感兴趣的文章
    opencv18-canny检测算法
    查看>>
    opencv19-霍夫直线变化
    查看>>
    opencv2-矩阵掩膜操作
    查看>>
    opencv20-霍夫圆检测
    查看>>
    opencv21-像素重映射
    查看>>
    opencv22-直方图均衡化
    查看>>
    opencv23-直方图计算
    查看>>
    opencv24-直方图比较
    查看>>
    opencv25-直方图反向投影
    查看>>
    opencv26-模板匹配
    查看>>
    opencv27-轮廓发现
    查看>>
    opencv28-凸包
    查看>>
    opencv29-轮廓周围绘制矩形框和圆形框
    查看>>
    OpenCV3 install tutorial for Mac
    查看>>
    opencv3-Mat对象
    查看>>
    opencv30-图像矩
    查看>>
    opencv32-基于距离变换和分水岭的图像分割
    查看>>
    opencv4-图像操作
    查看>>
    opencv5-图像混合
    查看>>
    opencv6-调整图像亮度和对比度
    查看>>