前言:
在Spring框架中,我么可以使用RestTemplate进行微服务之间的远程调用,即一个微服务向另一个微服务发送http请求获取数据。
它的代码是这样的:
但是这样存在很大的问题:
1、代码可读性差,编程体验不统一
2、URL参数复杂,难以维护
因此我们引入声明式的http客户端Feign来进行微服务之间的远程调用,他能帮我们优雅的实现http的请求和发送。
定义和使用Feign客户端:
1、引入依赖:
org.springframework.cloud spring-cloud-starter-openfeign
2、在order-service的启动类添加注解开启Feign的功能:
3、编写Feign客户端
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
上面内容主要是基于SpringMVC的注解来声明远程调用的信息,比如:
服务名称:userservice
请求方式:GET
请求路径:/user/{id}
请求参数:Long id
返回值类型:User
4、用Feign客户端代替RestTemplate
自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
一般我们需要配置的就是日志级别。
配置Feign日志有两种方式:
方式一:配置文件方式
1、全局生效:
feign:
client:
config:
default:
# 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
2、局部生效:
feign:
client:
config:
userservice:
# 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
方式二:java代码方式,需要先声明一个Bean:
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
Feign的性能优化
Feign底层的客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池
因此优化Feign的性能主要包括:
使用连接池代替默认的URLConnection
日志级别,最好用basic或none
Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖:
io.github.openfeign feign-httpclient
配置连接池:
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持
max-connections: 200 # 最大的连接数
max-connections-per-route: 50 # 每个路径的最大连接数
Feign的最佳实践(最佳使用方式)
方式一(继承,面向契约的编程思想,但这里耦合度增大):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用



