前言:OpenFeign 是一个声明式的 HTTP 客户端,它使得我们可以更加方便地调用 REST 服务。通过简单的注解配置,OpenFeign 可以让我们像调用本地方法一样调用远程的 HTTP 接口。在 Spring Cloud 生态系统中,OpenFeign 被广泛用于服务之间的通信。

主要特性

  1. 声明式 HTTP 客户端:通过注解定义接口,不需要编写大量的 HTTP 客户端代码。
  2. 与 Spring Cloud 集成:无缝集成 Ribbon、Eureka 等 Spring Cloud 组件,实现负载均衡和服务发现。
  3. 支持多种编码器和解码器:可以自定义请求和响应的编码解码方式。
  4. 支持熔断器:与 Hystrix、Sentinel 等熔断器集成,增强服务的容错能力。
  5. 支持日志记录:提供详细的请求和响应日志,便于调试和监控。

OpenFeign 远程调用

引入依赖

1
2
3
4
5
6
7
8
9
10
<!--openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

启用OpenFeign

启动类添加@EnableFeignClients(basePackages = "com.hmall.api.client")

1
2
3
4
5
6
7
8
9
10
@EnableFeignClients(basePackages = "com.hmall.api.client")
@MapperScan("com.mall.item.mapper")
@SpringBootApplication
public class ItemServiceApplication {

public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}

}

编写OpenFeign客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "pay-service", fallbackFactory = PayClientFallback.class)
public interface PayClient {
/**
* 根据交易订单id查询支付单
* @param id 业务订单id
* @return 支付单信息
*/
@GetMapping("/pay-orders/biz/{id}")
PayOrderDTO queryPayOrderByBizOrderNo(@PathVariable("id") Long id);
}

PayClientFallback

接口调用失败时的,返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import com.listen.api.client.PayClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;

@Slf4j
public class PayClientFallback implements FallbackFactory<PayClient> {
@Override
public PayClient create(Throwable cause) {
return new PayClient() {
@Override
public PayOrderDTO queryPayOrderByBizOrderNo(Long id) {
return null;
}
};
}
}

使用FeignClient

引入

1
2
@Autowired
PayClient payClient;

使用

1
PayOrderDTO payOrder = payClient.queryPayOrderByBizOrderNo(orderId);

连接池

引入依赖

1
2
3
4
5
<!--OK http 的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>

使用 yml添加如下配置

1
2
3
feign:
okhttp:
enabled: true # 开启OKHttp功能

日志配置

编写config配置类

1
2
3
4
5
6
7
8
9
import feign.Logger;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfig {
@Bean
public Logger.Level feignLogLevel() {
return Logger.Level.FULL;
}
}

启动类添加defaultConfiguration = DefaultFeignConfig.class

1
2
3
4
5
6
7
8
9
@EnableFeignClients(basePackages = "com.listen.api.client",defaultConfiguration = DefaultFeignConfig.class)
@SpringBootApplication
public class UserServiceApplication {

public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}

}