前言
OpenFeign 是 Spring Cloud 官方推荐的声明式 HTTP 客户端,让微服务间调用像调用本地方法一样简单。本文带你全面掌握 OpenFeign 的核心用法。
一、引入依赖
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
// 启动类开启 Feign
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
二、声明 Feign 客户端
// 调用 user-service 的 Feign 接口
@FeignClient(name = "user-service", path = "/api/users")
public interface UserFeignClient {
@GetMapping("/{id}")
User getUserById(@PathVariable("id") Long id);
@PostMapping
User createUser(@RequestBody User user);
@GetMapping
List<User> listUsers(@RequestParam("page") int page,
@RequestParam("size") int size);
@DeleteMapping("/{id}")
void deleteUser(@PathVariable("id") Long id);
}
// 在 Service 中注入使用
@Service
public class OrderService {
@Autowired
private UserFeignClient userFeignClient;
public Order createOrder(Long userId, Long productId) {
// 像调用本地方法一样调用远程服务
User user = userFeignClient.getUserById(userId);
// 业务逻辑...
}
}
三、配置超时和重试
# application.yml
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 10000
loggerLevel: FULL
user-service:
connectTimeout: 3000
readTimeout: 5000
# 全局超时配置
ribbon:
ConnectTimeout: 3000
ReadTimeout: 5000
MaxAutoRetries: 1
MaxAutoRetriesNextServer: 2
四、Feign 日志配置
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // 记录完整请求响应
}
}
// 在 FeignClient 中使用自定义配置
@FeignClient(name = "user-service",
configuration = FeignConfig.class)
public interface UserFeignClient {
// ...
}
# 日志级别说明
# NONE: 无日志(默认)
# BASIC: 仅记录请求方法、URL、响应状态码、执行时间
# HEADERS: 记录 BASIC + 请求/响应头
# FULL: 记录 HEADERS + 请求/响应体
五、请求拦截器(传递 Token)
@Component
public class FeignAuthInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 从请求上下文获取 Token
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("Authorization");
if (token != null) {
// 将 Token 传递给下游服务
template.header("Authorization", token);
}
}
}
}
// 配置拦截器
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor feignAuthInterceptor() {
return new FeignAuthInterceptor();
}
}
六、Fallback 降级
@FeignClient(name = "user-service",
fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient {
@GetMapping("/{id}")
User getUserById(@PathVariable("id") Long id);
}
// 降级工厂:可以获取到异常信息
@Component
public class UserFeignFallbackFactory
implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable cause) {
return new UserFeignClient() {
@Override
public User getUserById(Long id) {
log.error("调用 user-service 失败", cause);
return new User(id, "默认用户", "降级数据");
}
};
}
}
# 开启降级
feign.circuitbreaker.enabled: true
总结
OpenFeign 让微服务间调用变得优雅简洁。核心要点:声明式接口定义、配置超时重试、拦截器传递上下文、Fallback 实现降级保护。配合 Nacos 实现服务发现,配合 Sentinel 实现限流熔断,构建完整的微服务通信方案。
觉得有帮助请点赞收藏!有问题欢迎评论区交流
文章摘自:https://www.cnblogs.com/czlws/p/19830454/openfeign-spring-cloud-microservice-rpc
