Openfeign

Spring Cloud OpenFeign 入门

1、概览 本文将带你了解 Spring Boot 应用中的声明式 REST 客户端 - Spring Cloud OpenFeign。 Feign 通过可插拔的注解支持(包括 Feign 注解和 JAX-RS 注解)使编写 Web 客户端更加容易。 此外,Spring Cloud 还增加了对 Spring MVC 注解和使用与 Spring Web 中相同的 HttpMessageConverter 的支持。 使用 Feign 的一个好处是,除了接口定义外,无需编写任何调用服务的代码。 2、依赖 首先,创建 Spring Boot Web 项目,并在 pom.xml 文件中添加 spring-cloud-starter-openfeign 依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 此外,还需要添加 spring-cloud-dependencies 依赖: <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 你可以在 Maven Central 上找到 spring-cloud-starter-openfeign 和 spring-cloud-dependencies 的最新版本。 3、Feign 客户端 接着,需要将 @EnableFeignClients 添加到 main 类中:

Netflix Feign 与 OpenFeign

1、概览 本文将会带你了解 Spring Cloud Netflix Feign 与 Spring Cloud OpenFeign 之间的区别。 2、Feign 通过 Feign 提供的注解支持,我们只需要定义接口就可以实现 Web 客户端,非常简单。 最初,Feign 由 Netflix 创建并发布,是其 Netflix OSS 项目的一部分。如今,它已成为一个开源项目。 2.1、Spring Cloud Netflix Feign Spring Cloud Netflix 将 Netflix OSS 产品集成到 Spring Cloud 生态系统(全家桶)中。其中包括 Feign、Eureka、Ribbon 以及大量其他工具和实用程序。Feign 被单独定义在一个 Spring Cloud Starter 中,以便只使用 Feign。 2.2、OpenFeign 后来,Netflix 决定停止在内部使用 Feign 并停止其开发。根据这一决定,Netflix 将 Feign 完全转移到开源社区的一个名为 OpenFeign 的新项目中。 幸运的是,它继续得到开源社区的大力支持,并推出了许多新功能和更新。 2.3、Spring Cloud OpenFeign 同样,Spring Cloud OpenFeign 将 OpenFeign 项目集成到 Spring Cloud 生态系统中。 这种集成增加了对 Spring MVC 注解的支持,并提供相同的 HttpMessageConverter。

Spring Cloud Feign 集成测试

1、概览 本文将带你了解 Feign 客户端的集成测试。 首先创建一个基本的 Open Feign 客户端,并使用 WireMock 编写一个简单的集成测试。 之后,给客户端添加 Ribbon 配置,并为其构建一个集成测试。最后,配置一个 Eureka 测试容器,并测试此设置,以确保整个配置按预期工作。 2、Feign Client 要设置 Feign 客户端,首先要添加 Spring Cloud OpenFeign Maven 依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 然后,创建一个 Book 模型类: public class Book { private String title; private String author; } 最后,创建 Feign 客户端接口: @FeignClient(name = "books-service") public interface BooksClient { @RequestMapping("/books") List<Book> getBooks(); } 现在,我们有了一个从 REST 服务中获取 List<Book> 的 Feign 客户端。接下来,编写一些集成测试。 3、WireMock 3.1、设置 WireMock 服务器 要测试 BooksClient,需要一个提供 /books 端点的 mock 服务,客户端将调用该 mock 服务。为此,我们使用 WireMock。

OpenFeign 上传文件

1、概览 Feign 是微服务中通过 REST API 以声明方式与其他微服务通信的强大工具,本文将带你了解如何使用 Open Feign 上传文件。 2、先决条件 假设如下 RESTful Web 服务用于文件上传: POST http://localhost:8081/upload-file 该 Web 服务端点定义如下: @PostMapping(value = "/upload-file") public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) { // 文件上传逻辑 } 3、依赖 为了支持文件上传的 application/x-www-form-urlencoded 和 multipart/form-data 编码类型,需要添加 feign-core、 feign-form 和 feign-form-spring 模块。 在 Maven 中添加以下依赖: <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-core</artifactId> <version>10.12</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.8.0</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.8.0</version> </dependency> 还可以直接使用 spring-cloud-starter-openfeign 依赖,它已经包含了 feign-core: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.0</version> </dependency> 4、配置 在 main 类中添加 @EnableFeignClients:

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 接口: