openfeign

Spring OpenFeign 的异常处理

1、概览 微服务间的 HTTP API 调用可能会出现异常。在 Spring Boot 中使用 OpenFeign 时,默认会把下游服务的 “Not Found” 等异常全部当做 “Internal Server Error” 响应给客户端。这并不是异常的最佳处理方式,幸而,Spring 和 OpenFeign 都提供了一些机制,允许我们自定义异常处理。 本文将带你了解,Spring Boot 和 OpenFeign 默认的异常传播、处理机制,以及如何实现自定义的异常处理。 2、默认的异常传播策略 2.1、Feign 中默认的异常传播 Feign 使用 ErrorDecoder.Default 内部实现类进行异常处理。每当 Feign 收到任何非 2xx 状态码时,都会将其传递给 ErrorDecoder 的 decode 方法。 如果 HTTP 响应有 Retry-After 头信息,decode 方法就会返回 RetryableException,否则就会返回 FeignException。 重试时,如果请求在默认重试次数之后仍然失败,则会返回 FeignException。 decode 方法将 HTTP 方法 key 和响应存储在 FeignException 中。 2.2、Spring Rest Controller 中的默认异常传播 只要 RestController 收到任何未处理的异常,它就会向客户端返回 500 Internal Server Error(内部服务器错误)响应。 该异常响应包含时间戳、HTTP 状态码、异常信息和路径等信息:

Feign Client 异常处理

1、概览 在 Feign 客户端 中,可以使用 ErrorDecoder 或者 FallbackFactory 来处理异常。 2、Maven 依赖 创建一个 Spring Boot 项目,添加 spring-cloud-starter-openfeign 依赖,该 starter 已经包含了 feign-core 依赖。 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.3</version> </dependency> 如果你想自定义要使用的 feign-core 的版本,你也可以手动在 pom.xml 文件中添加 feign-core 依赖: <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-core</artifactId> <version>11.9.1</version> </dependency> 3、使用 ErrorDecoder 处理异常 通过自定义 ErrorDecoder 来处理异常,可以在出现异常时返回自定义的异常。 如下: public class RetreiveMessageErrorDecoder implements ErrorDecoder { private final ErrorDecoder errorDecoder = new Default(); @Override public Exception decode(String methodKey, Response response) { ExceptionMessage message = null; try (InputStream bodyIs = response.

使用 OpenFeign 发起 PATCH 请求

1、概览 通过 REST API 更新资源时,可以使用 PATCH 方法。该方法专门用于“更新部分字段”的场景。当需要完全更改现有资源时(全量替换),可以使用 PUT 方法。 在本教程中,我们将学习如何在 OpenFeign 中设置 HTTP PATCH 方法。我们还将演示在 Feign client 测试 PATCH 方法时出现的异常情况,以及解决方案。 2、Spring Boot 中的应用示例 假设我们需要构建一个简单的微服务,调用下游服务进行部分更新。 2.1、Maven 依赖 首先,我们要添加 spring-boot-starter-web 和 spring-cloud-starter-openfeign 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 2.2、实现 Feign Client 现在,让我们使用 Spring Web 注解在 Feign 中实现 PATCH 方法。 首先,让我们建立一个 User model,它有几个简单的属性。 public class User { private String userId; private String userName; private String email; } 接下来,我们将使用 updateUser 方法来实现一个 UserClient 接口: