Feign的代码和原理总结

本文详细介绍了Feign在微服务架构中的工作原理及其实现流程,包括启动类注解、包扫描、代理生成、HTTP请求处理及负载均衡等关键步骤。同时,提供了Feign的开发流程示例,从依赖引入到接口编写,帮助读者快速掌握Feign的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Feign的源码实现流程

  •   1、首先启动类上通过@EnableFeignClients 注解,开启 FeignClient的功能。
  •   2、在程序启动时开启包的扫描。把带有@ FeignClient 的注解的类信息注入IoC 容器中。
  •   3、当接口的方法被调用时,通过JDK 的代理来生成RequestTemplate。
  •   4、根据 RequestTemplate 生成 Http 请求的 Request对象。
  •   5、Request 对象交给 Client 去处理,框架可以有HttpClient 和 OkHttp。
  •   6、最终通过LoadBalanceClient类实现负载均衡。

代码的开发流程

1.引入spring-cloud-starter-openfeign
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. 在主启动类上加入注解@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }
}

3. 编写feign接口,value为微服务的名称,  fallback是熔断和降级的替代类
@FeignClient(value = "nacos-provider", fallback = NacosConsumerFeignFallback.class)
public interface NacosConsumerFeignApi {
    @RequestMapping("/**/{userId}")
    List<T> queryInfoByUserId(@PathVariable("userId") String userId);
}

 

<think>嗯,用户问的是FeignOpenFeign的区别以及各自的原理。首先,我得回忆一下这两个东西到底是什么。Feign好像是一个Netflix开发的声明式的HTTP客户端,用来简化服务之间的调用。而OpenFeign是不是后来由Spring Cloud整合的那个版本?或者是另一个分支? 记得Feign最初是Netflix OSS的一部分,后来Netflix停止维护,可能被贡献给开源社区,而Spring Cloud整合了Feign,并可能进行了扩展,形成了OpenFeign?或者是不是OpenFeign其实是Feign的一个开源版本,而原来的Feign已经不再更新了? 需要确认两者的来源。Feign是Netflix开发的,而OpenFeign可能是在Spring Cloud生态中的实现,或者是一个独立的项目?或者可能OpenFeignFeign的社区版,继续维护?或者两者其实是同一个东西,只是名称上的差异? 另外,用户提到各自的原理Feign原理应该是基于注解动态代理,通过接口定义注解来描述HTTP请求,然后生成实现类,发送请求。而OpenFeign可能是在Feign的基础上整合了Spring的功能,比如Ribbon、Eureka等组件结合,实现负载均衡服务发现。 需要进一步查证两者的具体区别。比如,OpenFeign是否支持Spring MVC的注解,而Feign可能不支持?或者Feign需要手动集成其他组件,而OpenFeign自动集成? 还有版本历史方面,可能Feign在某个时间点停止维护,OpenFeign作为分支继续发展,或者被Spring Cloud吸收成为其一部分。比如,Spring Cloud OpenFeign项目是不是基于Feign的封装? 总结可能的区别: 1. 来源维护:Feign由Netflix开发,可能已经停止维护;OpenFeign由Spring社区维护,集成在Spring Cloud中。 2. 功能扩展:OpenFeign可能增加了对Spring MVC注解的支持,比如@GetMapping、@PathVariable等,而原生Feign可能使用自己的注解。 3. 集成能力:OpenFeign与Spring Cloud的其他组件如Eureka、Ribbon、Hystrix等无缝集成,提供负载均衡服务发现,而原生Feign需要手动配置。 4. 依赖生态:Feign可能更轻量,适合非Spring项目;而OpenFeign专为Spring Cloud设计,依赖Spring生态系统。 关于原理部分,两者的核心机制应该类似,都是通过动态代理生成接口实现,将注解转化为HTTP请求。但OpenFeign可能在此基础上利用Spring的ApplicationContextRestTemplate等组件,增强功能。 需要确认这些信息是否准确,可能参考官方文档或者可靠的技术资料。比如,Spring Cloud OpenFeign的文档会说明它是基于Feign的,同时扩展了Spring的支持。 另外,用户可能在使用Spring Cloud时接触到的是OpenFeign,所以需要强调两者的关系,以及为什么会有OpenFeign的存在,比如为了更好的与Spring生态整合,提供更多便利功能。 最后,整理回答结构,分点说明区别,然后分别解释两者的工作原理,确保逻辑清晰,用户能理解它们的不同应用场景选择依据。</think>### Feign OpenFeign 的区别及原理 #### 一、核心区别 1. **来源与维护** - **Feign**:由 Netflix 开发,最初作为 Netflix OSS 的一部分,用于简化 HTTP API 调用。 - **OpenFeign**:是 Spring Cloud 社区基于原生 Feign 的增强版本,整合到 Spring Cloud 生态中,持续维护并扩展功能。 2. **注解支持** - **Feign**:使用原生注解(如 `@RequestLine`, `@Param`),语法独立于 Spring。 - **OpenFeign**:支持 Spring MVC 注解(如 `@GetMapping`, `@PathVariable`),与 Spring Boot 无缝兼容。 3. **集成能力** - **Feign**:需手动集成负载均衡(如 Ribbon)、服务发现(如 Eureka)。 - **OpenFeign**:自动集成 Spring Cloud 组件(如 Ribbon、Eureka、Hystrix),开箱即用。 4. **适用场景** - **Feign**:轻量级,适合非 Spring 项目。 - **OpenFeign**:专为 Spring Cloud 微服务设计,依赖 Spring 生态。 --- #### 二、工作原理 ##### 1. Feign 的核心原理 - **动态代理**:通过 JDK 动态代理生成接口实现类,将注解解析为 HTTP 请求模板。 - **注解翻译**:例如 `@RequestLine("GET /user/{id}")` 会被解析为 HTTP 方法路径。 - **请求发送**:结合编码器(Encoder)、解码器(Decoder) HTTP 客户端(如 OkHttp)发送请求。 ##### 2. OpenFeign 的增强机制 - **Spring 整合**:利用 Spring 的 `ApplicationContext` `RestTemplate`,自动注入 Bean。 - **负载均衡**:通过 Ribbon 实现服务实例选择,支持轮询、随机等策略。 - **服务发现**:集成 Eureka,动态获取服务实例列表。 - **注解兼容**:将 Spring MVC 注解(如 `@RequestMapping`)映射为 HTTP 请求,降低学习成本。 --- #### 三、代码示例对比 **原生 Feign 接口定义** ```java public interface UserService { @RequestLine("GET /user/{id}") User getUser(@Param("id") String id); } ``` **OpenFeign 接口定义(Spring 风格)** ```java @FeignClient(name = "user-service") public interface UserService { @GetMapping("/user/{id}") User getUser(@PathVariable("id") String id); } ``` --- #### 四、总结 - **选型建议**: - 若项目基于 Spring Cloud,优先选择 **OpenFeign**(无需重复造轮子)。 - 若为轻量级非 Spring 项目,可使用原生 **Feign**。 - **核心价值**:两者均通过 **声明式接口** 屏蔽 HTTP 调用细节,但 OpenFeign 在易用性生态整合上更胜一筹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值