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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律