Spring Cloud Feign 优雅的服务调用
作者:@后青春期的Keats
本文为作者原创,转载请注明出处:https://www.cnblogs.com/keatsCoder/p/12435936.html
Fegin 是由NetFlix开发的声明式、模板化HTTP客户端,可用于SpringCloud 的服务调用。提供了一套更优雅、便捷的HTTP调用API,并且SpringCloud整合了Fegin、Eureka和Ribbon。使其使用更加简便。替换了之前使用RestTemplate进行硬编码方式的服务调用。
Feign组件入门
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
开启服务
在启动类上添加 @EnableFeignClients 开启
@SpringBootApplication @EnableFeignClients public class ServiceConsumerApplication {}
写服务接口
- 在项目中创建一个文件夹用来管理Fegin的所有接口
- 可以按照服务提供者的名字进行二级分类
- 创建一个接口。这里我根据服务提供者的名称创建了一个 UserServiceFeignClient 的接口
- 接口上添加注解 @FeignClient("SERVICE-PROVIDER"),注解的默认值填写服务提供者的名字
- 复制提供者的Controller方法,注意不要遗漏类名上的地址
package cn.keats.service_consumer.feign; import cn.keats.service_consumer.entity.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; /** * @Author: keats_coder * @Date: 2020/3/7 * @Version 1.0 */ @FeignClient("SERVICE-PROVIDER") public interface UserServiceFeignClient { @GetMapping("/api/v1/user/{age}") User getUser(@PathVariable("age") Integer age); /** * 用户列表 * @return */ @GetMapping("/api/v1/users") List<User> getUsers(); }
调用
在需要调用服务的地方使用 @AutoWired 注入该接口。调用其对应的方法
@Autowired private UserServiceFeignClient userServiceFeignClient; /** * 基于 Feign 的优雅的接口调用方式 */ @GetMapping("teacher/user/{age}") public User getAllUser(@PathVariable Integer age){ return userServiceFeignClient.getUser(age); }
Feign负载均衡
Feign中已经集成了Ribbon的负载均衡功能,默认情况下使用轮询的规则,若想要自定义可以参考:Ribbon进行服务调用/负载均衡以及请求重试配置
Feign的配置
新版本的Feign支持配置文件配置,常用的配置有日志级别的配置。开发环境下可以配置成最细腻级别的日志方便检查问题
# feign的配置 feign: client: config: SERVICE-PROVIDER: loggerLevel: FULL # NONE(默认选项), BASIC, HEADERS, FULL; 内容依次丰富、性能影响依次增大 logging: level: cn.keats.service_consumer.feign.UserServiceFeignClient: debug
Feign的执行原理
- 在Spring容器启动时,扫描到 @EnableFeignClients 注解。而该注解又导入了 FeignClientsRegistrar.class 这个类。该类定义了扫描所有添加 @FeignClient 注解的接口
- FeignClientsRegistrar 实现了 Spring ImportBeanDefinitionRegistrar 类,用来导入自定义Bean。其中该方法主要用来导入Bean.
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { this.registerDefaultConfiguration(metadata, registry); // 注册配置 this.registerFeignClients(metadata, registry);// 注册Feign客户端 }
- 之后通过 registerFeignClient 方法,以动态代理的形式生成接口的实现。让我们得以调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端