Feign 实战指南:从 REST 替代到性能优化与最佳实践

2025-11-21 18:39:11 | FIFA世界杯

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 服务中引入依赖

org.springframework.cloud

spring-cloud-starter-openfeign

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.<