【2025版】OpenFeign快速入门
文章目录
- OpenFeign
- 一、引入依赖
- 二、添加@EnableFeignClients注解
- 三、编写Feign客户端
- 四、调用服务
- 五、连接池
- 1. 引入依赖
- 2. 开启连接池
- 六、开启日志
- 七、负载均衡
OpenFeign
一、引入依赖
<!--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>
二、添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
三、编写Feign客户端
@FeignClient("user-service")
public interface UserClient {@GetMapping("/user/{id}")String getUser(@PathVariable Long id);
}
四、调用服务
@Autowired
private UserClient userClient;@GetMapping("/{userId}")
public String getOrder(@PathVariable Long userId) {return "订单服务调用用户服务成功,用户信息:" + userClient.getUser(userId);
}
五、连接池
Feign底层发起http请求,依赖于其它的框架。其底层支持的http客户端实现包括:
- HttpURLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
1. 引入依赖
<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>
2. 开启连接池
feign:okhttp:enabled: true # 开启OKHttp功能
再次请求,打个断点,可以看到delegate已经变成OkHttp的客户端
六、开启日志
OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:
NONE
:不记录任何日志信息,这是默认值。BASIC
:仅记录请求的方法,URL以及响应状态码和执行时间。HEADERS
:在BASIC的基础上,额外记录了请求和响应的头信息。FULL
:记录所有请求和响应的明细,包括头信息、请求体、元数据。
Feign默认的日志级别就是NONE,所以默认我们看不到请求日志。
logging:level:com.paran: DEBUG
public class DefaultFeignConfig {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}
局部生效
:在某个FeignClient中配置,只对当前FeignClient生效
@FeignClient(value = "user-service", configuration = DefaultFeignConfig.class)
全局生效
:在@EnableFeignClients中配置,针对所有FeignClient生效。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)
七、负载均衡
有说在yml中配置的,这种方式会报找不到服务实例的错误,不是因为别的原因,就是加了这个配置的原因,因为把这个loadbalancer的配置去掉就不会报这个错误,一加上就报错
spring:cloud:loadbalancer:configurations: round-robin # 或 random
可以使用下面这种办法实现负载均衡
@Configuration
@LoadBalancerClient(name = "user-service", // 服务名configuration = CustomLoadBalancerConfig.class // 指定配置类
)
public class CustomLoadBalancerConfig {@Beanpublic ReactorServiceInstanceLoadBalancer myServiceLoadBalancer(Environment environment,LoadBalancerClientFactory clientFactory) {String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 拿到延迟加载的 ServiceInstanceListSupplierObjectProvider<ServiceInstanceListSupplier> supplierProvider =clientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class);// 这里使用 RandomLoadBalancer:随机策略return new RandomLoadBalancer(supplierProvider, serviceId);}
}