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

前言

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