Feign 是一个声明式的 HTTP 客户端,用于简化微服务之间的 HTTP 调用。以下是使用 Feign 实现接口调用的核心步骤:
1. 添加依赖
在 Maven 或 Gradle 项目中添加 Feign 依赖:
<!-- Spring Cloud OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 启用 Feign 客户端
在 Spring Boot 主应用类上添加 @EnableFeignClients 注解:
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableFeignClients // 启用 Feign 客户端
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3. 定义 Feign 接口
创建一个接口并使用 @FeignClient 注解指定服务名:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service") // 指定服务名(与注册中心一致)
public interface UserFeignClient {
@GetMapping("/users/{id}") // 映射服务的 API 路径
User getUserById(@PathVariable("id") Long id); // 定义方法签名
}
4. 配置服务地址(可选)
如果未使用服务注册中心(如 Eureka、Nacos),需通过 url 属性指定服务地址:
@FeignClient(name = "user-service", url = "http://localhost:8081")
public interface UserFeignClient {
// 接口方法
}
5. 注入并使用 Feign 客户端
在需要调用远程服务的类中注入 Feign 接口:
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class UserService {
@Autowired
private UserFeignClient userFeignClient;
public User getUser(Long id) {
return userFeignClient.getUserById(id); // 直接调用接口方法
}
}
6. 配置自定义解码器/编码器(可选)
如需处理特殊格式(如 JSON 以外的格式),可自定义解码器:
import feign.codec.Decoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Decoder feignDecoder() {
return new MyCustomDecoder(); // 自定义解码器实现
}
}
7. 配置请求拦截器(可选)
添加拦截器处理请求头(如认证信息):
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;
@Component
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("Authorization", "Bearer token"); // 添加认证头
}
}
8. 配置超时和重试(可选)
通过 application.yml 配置连接超时和读取超时:
feign:
client:
config:
default:
connectTimeout: 5000 # 连接超时(毫秒)
readTimeout: 5000 # 读取超时(毫秒)
retryer: com.example.CustomRetryer # 自定义重试策略
核心概念总结
@FeignClient:声明 Feign 客户端,name 指定服务名,url 指定直接地址。
HTTP 方法注解:使用 @GetMapping、@PostMapping 等映射远程 API。
服务发现:与注册中心(如 Eureka、Nacos)集成时,Feign 会自动通过服务名发现实例。
负载均衡:默认集成 Ribbon 或 Spring Cloud LoadBalancer 实现负载均衡。
通过以上步骤,你可以快速实现微服务间的声明式 HTTP 调用,避免编写繁琐的 RestTemplate 代码。