OpenFeign介绍

OpenFeign 是一个声明式的 HTTP 客户端工具,集成了 Netflix Feign,支持与 Spring Cloud 一起使用。它简化了 HTTP 服务调用的过程,可以通过定义接口来调用远程服务,而不需要手写复杂的 HTTP 请求代码。开发者只需定义接口并使用注解来配置 HTTP 请求的细节。

在 Spring Cloud 中,OpenFeign 作为微服务间通信的一个常用工具,尤其适合构建基于 REST 的微服务应用。

OpenFeign 相对 RestTemplate + @LoadBalanced 的优势

即便 RestTemplate 可以通过 @LoadBalanced 实现负载均衡,OpenFeign 仍然在以下方面具备优势:

  1. 声明式语法简洁性:OpenFeign 使用接口和注解定义请求,可以省去大量手动编写 URL 和方法的代码,特别是在大型项目中,显著减少重复代码。

  2. 熔断与容错支持:OpenFeign 默认集成了 Hystrix 等容错机制,可以在微服务调用中轻松实现熔断功能。而在 RestTemplate 中实现熔断需要手动配置,例如结合 CircuitBreaker 进行实现,稍显繁琐。

  3. 可扩展性:OpenFeign 提供了更强的扩展支持,如全局请求拦截器(RequestInterceptor)、超时设置等,可通过注解或配置文件集中管理。而 RestTemplate 则需要通过 ClientHttpRequestInterceptor 来手动添加拦截器,配置相对复杂。

  4. 可维护性和测试性:OpenFeign 将远程服务抽象为接口,使得服务之间的依赖关系更清晰,测试时可以轻松进行 Mock,不需要关心实现细节。而在 RestTemplate 中进行类似的 Mock 测试时,需要为每个请求配置更多细节。

使用 OpenFeign

首先,我们需要在 pom.xml 中添加依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

接下来,我们可以在 Spring Boot 项目中定义一个接口,该接口将定义远程服务的 API。例如:

@FeignClient(name = "cloud-provider-payment")
public interface PaymentFeignService {
@GetMapping(value = "/pay/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
}

在上面的代码中,我们使用 @FeignClient 注解定义了一个 Feign 客户端,name 属性指定了服务提供者的服务名,@GetMapping 注解定义了一个 GET 请求,@PathVariable 注解用于获取请求参数。

最后,我们可以在 Controller 中注入该接口,并调用远程服务:

@RestController
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/consumer/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
return paymentFeignService.getPaymentById(id);
}
}

在上面的代码中,我们注入了 PaymentFeignService 接口,并调用了 getPaymentById 方法,实现了远程服务的调用。

OpenFeign天然支持负载均衡,只需要在配置文件中配置服务提供者的服务名即可,无需关心具体的 IP 和端口。

配置超时时间

调用服务的超时时间是一个重要的配置,可以避免因为网络延迟导致的性能问题。

在 OpenFeign 中,我们可以通过配置文件来设置超时时间,例如:

cloud:
openfeign:
client:
config:
default: # 全局配置
connectTimeout: 5000
readTimeout: 5000
my-service: # 指定服务配置
connectTimeout: 5000
readTimeout: 5000

在上述代码中,我们设置了默认的超时时间为 5 秒。

openFeign的默认超时时间是60s。

配置重试机制

在 OpenFeign 中,可以设置重试。

// OpenFeignConfig.java
public OpenFeignConfig{

// 重试机制
@Bean
public Retryer myRetryer() {
return new Retryer.Default(100, 1, 3);
}

// 日志记录级别
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

## 更换默认的client
在 OpenFeign 中,我们可以通过配置文件来更换默认的 client,例如:
```yaml
cloud:
openfeign:
httpclient:
hc5:
enabled: true

在上述代码中,我们通过 cloud.openfeign.httpclient.hc5.enabled 属性来启用 HttpClient 5.x 版本。