携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
⭐️前面的话⭐️
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《王道408》,📚《深入理解 Java 虚拟机-周志明》,📚《Java 核心技术卷》
💬算法刷题:✅力扣🌐牛客网
🎈Github
🎈码云Gitee
七、Feign远程调用(HTTP客户端Feign)
// vaule和name 其实是一个属性
public @interface FeignClient {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
......
}
@FeignClient(name="${feign.name.element2:element-server2}")
public interface IBaseDataFeignClient extends IBaseDataFeignController {
}
7.1 Feign替代RestTemplate
RestTemplate方式调用存在的问题
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
代码可读性差,编程体验不统一;参数复杂URL难以维护。
-
Feign的介绍
- 官网:github.com/OpenFeign/f…
- Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现 http 请求的发送,解决上面提到的问题。
# 声明式
理解声明式:如spring的声明式事务,对谁加事务规则定义好,spring来实现事务。
feign接口定义:发http请求的信息写出来就可以
- 定义和使用Feign客户端
1)引入依赖
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)在order-service的启动类添加注解开启Feign的功能:@EnableFeignClients
3)编写Feign客户端
7.2 自定义配置Feign日志的2种方式
方式1:配置文件
方式2:java代码方式,需要先声明一个Bean
7.3 Figen使用优化(性能调优)
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好用
basic或none
连接池配置(以HttpClient为例)
1)引入feign-httpClient依赖
<!--引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)配置文件开启httpClient功能,设置连接池参数
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 支持HttpClient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
Feign的优化:
1)日志级别尽量用basic
2)使用HttpClient或OKHttp代替URLConnection
引入feign-httpClient依赖
配置文件开启httpClient功能,设置连接池参数
7.4 Feign最佳实践(我做过的内容)
所谓继承:让controller和FeignClient继承同一接口
所谓抽取:将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用
方式一(继承)
给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
方式二(抽取)
将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
实现Feign最佳实践
# 实现最佳实践方式二的步骤如下:
(1)首先创建一个module,命名为feign-api,然后引入feign的starter依赖
(2)将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
(3)在order-service中引入feign-api的依赖
(4)修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
(5)重启测试
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决: