-
OpenFeign 是一个基于 Spring 的声明式、模板化的 HTTP 客户端,它简化了编写 Web 服务客户端的过程。用户只需创建一个接口并添加相应的注解,即可实现对远程服务的调用。Spring Cloud OpenFeign 对 Feign 进行了二次封装,使得在 Spring Cloud 中使用 Feign 的时候,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程访问,更感知不到在访问 HTTP 请求。
-
快速开始
- 引入依赖
<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>
- 编写调用接口,并使用@FeignClient注解
@FeignClient(name = "order-service",path ="/order") public interface ServuceFeignClient { @RequestMapping("/queryByUserId/{userId}") List<User> queryByUserId(@PathVariable Long userId); @RequestMapping("/getPort") Integer getPort(); }
- 在启动类添加@EnableFeignClients 注解
-
由于每次请求都要创建Client,所以引入okhttp,可以进行连接池的设置
- 引入依赖
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
- 进行配置
feign: okhttp: enabled: true
-
最佳实践:采用抽取方式
-
将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。
-
首先创建一个module,命名为feign-api,在feign-api中引入spring-cloud-starter-openfeign依赖
-
将与feign有关的Clients接口,实体类,配置类都复制到feign-api中
-
在其他可能会用到feign的模块中引入feign-api的包
-
重启后可能会发生错误,因为你得feign-api的模块中给的Clients在cn.itcast.feign.clients包中,而要调用feign的order-service的 @EnableFeignClients 注解是在cn.itcast.order 包下,不在同一个包,无法扫描到Clients。为解决这个问题可以指定feign应该扫描的包
@EnableFeignClients(basePackages = "orderservice.feign.clients")
-
-
feign的日志
- 基于Java代码来修改日志级别,先声明一个类,再声明一个Logger.Level的对象
/** * OpenFeign的配置 */ public class DefaultFeignConfiguration { /** * 配置日志基本 * @return */ @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; // 日志级别为BASIC } }
- 全局生效,将其放到 启动类的@EnableFeignClients这个注解中
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
- 局部生效,放到对应的@FeignClient这个注解
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class)
- 配置文件方式
# 针对某个微服务的配置 userservice:微服务名称 FULL:日志级别 feign.client.config.userservice.logger-level=FULL # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 #feign.client.config.default.logger-level=FULL
- 日志级别
日志的级别分为四种: - NONE:不记录任何日志信息,这是默认值。 - BASIC:仅记录请求的方法,URL以及响应状态码和执行时间 - HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息 - FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。