OpenFeign实战:Spring Cloud微服务间优雅调用指南

张开发
2026/4/9 17:10:23 15 分钟阅读

分享文章

OpenFeign实战:Spring Cloud微服务间优雅调用指南
一、引入依赖!-- pom.xml -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-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 ListUser 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 请求/响应体回到顶部五、请求拦截器传递 TokenComponent 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 FallbackFactoryUserFeignClient { 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

更多文章