Feign是什么
feign是一个声明式的http客户端官方地址:https://github.com/OpenFeigh/feign
其作用就是帮助我们优雅的实现http请求的发送
使用Feign
1.引入依赖:
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在微服务的启动类添加注解开启Feign的功能:
@EnableFeignClients
3.编写Feign客户端,之后直接调用就好了:
package cn.itcast.order.clients;
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findeByid(@PathVariable Long id);
}
自定义Feign的配置
一般需配置的就是日志级别
一:配置日志:
方式1:yml配置文件修改
全局生效:
feign:
client:
config:
default: # 这里用default就是全局配置,如果是些服务名称,就是某个微服务的配置
loggerLevel:FULL
局部生效:
feign:
client:
config:
userserivce: # 这里用default就是全局配置,如果是些服务名称,就是某个微服务的配置
loggerLevel:FULL
方式2:java代码方式,
1.需要先声明一个Bean:
public class FeignClientConfiguration{
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
2.之后如果是需要全局生效,则把他放在@EnableFeignClients注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
3.如果是局部配置,则把他放在@FeignClient这个注解中:
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.clss)
二:配置响应结果解析器
三:配置请求参数编码
四:配置注解格式
五:配置失败重试机制
feign的性能优化
feign底层的客户端实现:
urlconnection:默认实现,不支持连接
apache httpclient:支持连接池
okhttp:支持连接池
因此优化feign的性能主要包括:
1.使用连接池代替默认的urlconnection
2.日志级别,最好用basic或none
优化连接池步骤
一:引入httpclient依赖
<!--feign添加httpclient的依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
二:配置yml
feign:
httpclient:
enabled: true # 支持httpCLient的开关
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 单个路径的最大连接数
feign的最佳实践
方式一(继承):给消费者的Feignclient和提供者的controller定义统一的父接口作为标准
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的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.重启测试
6.当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
在消费者的启动类上添加
@EnableFeignClients(basePackages = "包名")
方式二:指定FeignClient字节码
在消费者的启动类上添加
@EnableFeignClients(clients = {UserClient.class})