族家 發表於 2026-4-7 15:34:00

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

<h2>前言</h2>
<p>OpenFeign 是 Spring Cloud 官方推荐的声明式 HTTP 客户端,让微服务间调用像调用本地方法一样简单。本文带你全面掌握 OpenFeign 的核心用法。</p>
<h2>一、引入依赖</h2>
<pre><code>&lt;!-- pom.xml --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-openfeign&lt;/artifactId&gt;
&lt;/dependency&gt;

// 启动类开启 Feign
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
      SpringApplication.run(OrderApplication.class, args);
    }
}</code></pre>
<h2>二、声明 Feign 客户端</h2>
<pre><code>// 调用 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&lt;User&gt; 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);
      // 业务逻辑...
    }
}</code></pre>
<h2>三、配置超时和重试</h2>
<pre><code># 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</code></pre>
<h2>四、Feign 日志配置</h2>
<pre><code>@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 + 请求/响应体</code></pre>
<h2>五、请求拦截器(传递 Token)</h2>
<pre><code>@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();
    }
}</code></pre>
<h2>六、Fallback 降级</h2>
<pre><code>@FeignClient(name = "user-service",
             fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient {
    @GetMapping("/{id}")
    User getUserById(@PathVariable("id") Long id);
}

// 降级工厂:可以获取到异常信息
@Component
public class UserFeignFallbackFactory
      implements FallbackFactory&lt;UserFeignClient&gt; {

    @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</code></pre>
<h2>总结</h2>
<p>OpenFeign 让微服务间调用变得优雅简洁。核心要点:声明式接口定义、配置超时重试、拦截器传递上下文、Fallback 实现降级保护。配合 Nacos 实现服务发现,配合 Sentinel 实现限流熔断,构建完整的微服务通信方案。</p>
<p>觉得有帮助请点赞收藏!有问题欢迎评论区交流 🚀</p>

</div>
<div id="MySignature" role="contentinfo">
   

---

📌 **如果觉得文章对你有帮助,欢迎点赞👍收藏⭐!**

💬 有问题或建议?欢迎在评论区留言讨论~

🔗 更多技术干货请关注作者:弥烟袅绕

📚 本文地址:https://www.cnblogs.com/czlws/p/19830454/openfeign-spring-cloud-microservice-rpc<br><br>
来源:https://www.cnblogs.com/czlws/p/19830454/openfeign-spring-cloud-microservice-rpc
頁: [1]
查看完整版本: OpenFeign实战:Spring Cloud微服务间优雅调用指南