Feign 实战指南:从 REST 替代到性能优化与最佳实践
一 . Feign 替代 RestTemplate
1.1 RestTemplate 方式调用存在的问题
1.2 Feign 的介绍
1.3 定义和使用 Feign 客户端
1.3.1 引入依赖
1.3.2 添加注解
1.3.3 编写 Feign 的客户端进行接口声明
1.3.4 测试
小结
1.4 通过 POST 请求进行远程调用
二 . 自定义配置
2.1 配置文件方式
① 全局生效
② 局部生效
2.2 Java 代码方式
① 全局配置
② 局部配置
2.3 小结
三 . 性能优化
3.1 引入依赖
3.2 配置连接池
3.3 小结
四 . 最佳实践
4.1 继承方式
4.2 抽取方式
4.3 实现抽取方式
① 抽取
② 在 order-service 中使用 feign-api
③ 重启测试
④ 解决扫描包问题
五 . 扩展
5.1 Feign 调用注意事项
在微服务架构中,服务间通信的便捷性与性能至关重要。本文将深入解析 Feign 这一声明式 HTTP 客户端的核心应用,从替代传统 RestTemplate 解决调用痛点开始,逐步讲解自定义配置、性能优化及企业级最佳实践。内容涵盖 Feign 客户端定义与使用、日志级别配置、连接池优化,以及通过继承或抽取方式实现代码复用,帮助读者构建高效、可维护的微服务通信体系。 本专栏的内容均来自于 B 站 UP 主黑马程序员的教学视频,感谢你们提供了优质的学习资料,让编程不再难懂。 专栏地址 : https://blog.csdn.net/m0_53117341/category_12835102.html
一 . Feign 替代 RestTemplate
1.1 RestTemplate 方式调用存在的问题
先来看一下我们之前通过 RestTemplate 方式发起远程调用的代码
这种方式是通过 URL 地址指明要访问的服务名称、请求路径以及请求的参数信息 , 由 RestTemplate 来负责发起请求 .
那这段代码存在一些问题 :
代码可读性差 , 编程体验不够统一 : 在代码中引入了 URL , 导致代码不够统一
参数复杂 URL 难以维护 : 就比如我们访问的 Nacos 的路径 , 他的 URL 就非常复杂
1.2 Feign 的介绍
Feign 是一个声明式的 HTTP 客户端
声明式 : 比如早期 , 我们学习 MySQL 的事务的时候 , 我们需要手动开启关闭事务 . 那后来学习 Spring 的时候 , 就提供了 Spring 的声明式事务 , 只需要在配置文件中告诉 Spring 对谁加事务即可 . 那以后所有的事务都交给 Spring 来帮我们做 .
那声明式 HTTP 客户端也是如此 , 我们如果要发送 HTTP 请求 , 那只需要将发送请求所需要的信息声明出来 , 剩下的工作 Feign 帮助我们来做 .
Feign 的作用就是帮助我们优雅地实现 HTTP 请求的发送 , 解决上面提出的问题 .
1.3 定义和使用 Feign 客户端
1.3.1 引入依赖
在 order-service 服务中引入依赖
1.3.2 添加注解
我们需要在 order-service 的启动类中添加开启 Feign 功能的注解
package com.example.order;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("com.example.order.mapper")
@SpringBootApplication
@EnableFeignClients // 开启 Feign 功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 随机轮训
// @Bean
// public IRule randomRule() {
// return new RandomRule();
// }
}
1.3.3 编写 Feign 的客户端进行接口声明
我们需要在该接口上添加一个注解 @FeignClient , 并且指定要调用的服务名称
接下来我们编写一个方法 , 方法的返回值就是我们想获取到的结果 , 方法的参数就是我们要传的参数
然后我们还需要在方法上面添加一个注解声明请求的方式
那上面用了动态参数 , 下面我们也需要用 @PathVariable 注解来接收
package com.example.order.clients;
import com.example.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.<