Feign
RestTemplate方式调用存在的问题
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url,User.class);
代码可读性差,编程体验不统一
参数复杂URL难以维护
Feign的介绍
Feign是一个声明式的http客户端,官方地址https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
定义和使用Feign客户端
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启Feign
在orderservice启动类上添加EnableFeignClients

创建客户端接口UserClient

使用Feign方式拉取服务

自定义Feign配置
Feign配置参数
Feign运行自定义配置来覆盖默认配置,可以修改配置如下:

配置Feign日志的两种方式
方式一:配置文件方式
全局生效
feign:
client:
config:
default: #这里使用default就是全局配置,如果写服务名称就是针对某个微服务的配置
loggerLevel: FULL
局部生效
feign:
client:
config:
default: #这里使用default就是全局配置,如果写服务名称就是针对某个微服务的配置
loggerLevel: FULL
方式二:java代码方式
需要先声明一个Bean

全局配置,使用EnableFeignClient注解

局部配置,使用FeignClient注解,value指定服务名

Feign的性能优化
Feign底层的客户端实现
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feiign的性能主要包括
- 使用连接池代替默认的URLConnection
- 日志级别,最好使用basic或none
Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖(httpclient的依赖)
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置yml文件
feign:
client:
config:
default:
loggerlevel: BASIC
httpclient:
enabled: true #开启feign对httpclient的支持
max-connections: 200 #最大的连接数
max-connections-per-route: 50 #每个路径的最大连接数
Feign的最佳实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。通过API来约束Fiegn客户端和提供者的服务

一般不推荐,会造成紧耦合。
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用。

抽取FeignClient的实现
1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中。

3.在order-service中引入feign-api的依赖。
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

当定义FeignCLient不再SPringBootApplication的扫描包范围时,这些FeignClient无法使用,两种解决方案:
方式一:指定FeignClient所在包

方式二:指定FeignFlient字节码


本文来自博客园,作者:Laplace蒜子,转载请注明原文链接:https://www.cnblogs.com/RedNoseBo/p/16356689.html

浙公网安备 33010602011771号