Feign远程调用:
RestTemplate发起远程调用的代码:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrQlIktO-1675949482462)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230206175759882.png)]](https://img.pic99.top/hhfamen/202405/1010123c481388.png)
存在下面的问题
Feign的介绍:Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LX14pPH3-1675949482463)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230206180308491.png)]](https://img.pic99.top/hhfamen/202405/94d5f59a7824.png)
Feign替代RestTemplate:使用Feign的步骤如下
引入依赖:
org.springframework.cloud spring-cloud-starter-openfeign
在order-service的启动类添加注解开启Feign的功能:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Exi3mZdR-1675949482464)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230206180929228.png)]](https://img.pic99.top/hhfamen/202405/c12a590be5c6.png)
编写Feign客户端:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFVZllZR-1675949482464)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230206191317837.png)]](https://img.pic99.top/hhfamen/202405/05610baf3c4e37f.png)
用Feign客户端代替RestTemplate

自定义配置:Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSTDBTNA-1675949482465)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230207112857901.png)]](https://img.pic99.top/hhfamen/202405/71fa3b7e56a6582.png)
方式一:配置文件方式
全局生效:
feign:client:config:default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #日志级别
局部生效:
feign:client:config:userservice: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置loggerLevel: FULL #日志级别
方式二:Java代码方式,需要先声明一个Bean:
public class FeignClientConfiguration {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;}
}
全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)
Feign使用优化
Feign底层的客户端实现:
因此优化Feign的性能主要包括:
Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖:
io.github.openfeign feign-httpclient
配置连接池:
feign:httpclient:enabled: true #开启feign对HttpClient的支持max-connections: 200 #最大的连接数max-connections-per-route: 50 #每个路径的最大连接数
Feign最佳实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GlVR7SVy-1675949482466)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230207153106143.png)]](https://img.pic99.top/hhfamen/202405/d1c1fdf77d2e6f9.png)
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YECFRELP-1675949482467)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20230207153847247.png)]](https://img.pic99.top/hhfamen/202405/4057d59c0abc604.png)
实现最佳实践方式二的步骤如下:
当定义的FeignClient不在SpringBootApplication的扫描范围时,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "com.cdcas.feign")
方式二:指定FeignClient字节码
@EnableFeignClients(clients = {UserClient.class})