Feign
是开源的声明式http客户端,简化restTemplate调用时url难以维护,代码不可读等问题。
只要声明一个接口,feign就会自动构造一个请求的地址并请求
feign也具有负载均衡,通过整合ribbon实现,所以之前ribbon配置在这依然可用。
加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
加注解
在启动类上加@EnableFeignClients
没有配置
创建远程http调用接口
@FeignClient(name = "user-center")
public interface UserCenterFeignClient{
//当findById被调用的时候,feign就会构建出http://user-center/users/{id}并请求
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
如果参数多的话,写成(@RequestParam xx1,xx2,xx3...)即可
调用的时候就可以不用restTemplate,并写相关url,用UserCenterFeignClient.findById(id)即可。
feign的组成
feign细粒度配置自定义
配置和ribbon一样,可通过java代码或配置文件配置
指定feign日志级别
feign的日志级别有
使用java代码的方式:
跟ribbon指定规则类似
在feign接口注解中加configuration
@FeignClient(name = "user-center" , configuration = "UserCenterFeignConfiguration.class")
public interface UserCenterFeignClient{
//当findById被调用的时候,feign就会构建出http://user-center/users/{id}并请求
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
再写个UserCenterFeignConfiguration类
public class UserCenterFeignConfiguration{
@Bean
public Logger.level level(){
return Logger.level.FULL;
}
}
在配置文件中配置UserCenterFeignConfiguration类
logging:
level:
(UserCenterFeignConfiguration的全路径): debug
feign日志级别建立在接口是debug的基础上,假如是info,那不会打印
使用配置的方式:
feign:
client:
config:
#想要调用的微服务的名称
user-center:
loggerLevel: full
feign的全局配置自定义
跟ribbon相似,代码配置:
在启动类上的@EnableFeignClients加括号配置,变为@EnableFeignClients(defaultConfiguration = "UserCenterFeignConfiguration.class")即可
配置属性的方式:
feign:
client:
config:
#全局配置
default:
loggerLevel: full
feign支持的配置项
代码方式和属性方式的配置项略有不同
代码方式:
属性方式:
feign配置的优先级
全局代码<全局属性<细粒度代码<细粒度属性
feign构造多参数的请求
如果另写一个FeignClient接口,且注解name一样(例如都是"user-center"),需要加配置
spring:
main:
allow-bean-definition-overriding: true
Get方式
接口在传入参数中加@SpringQueryMap注解
@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
@GetMapping("/q")
UserDTO findById(@SpringQueryMap UserDTO userDTO);
}
或者一个一个传参
@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
@RequestMapping(value = "/q" , method = RequestMethod.GET)
UserDTO findById(@RequestParam("id") Long id,@RequestParam("name") String name , ...);
}
Post方式
@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient{
@RequestMapping(value = "/q" , method = RequestMethod.POST)
UserDTO findById(@RequestBody UserDTO userDTO);
}
feign脱离ribbon使用
之前的例子,feign调用的服务都是注册在nacos中的,如果feign想调用没有注册在nacos上的服务(例如调用百度)
@FeignClient(name = "baidu", url = "http://www.baidu.com")
public interface TestBaiduFeignClient{
@GetMapping("")
public String index();
}
调用的时候
private TestBaiduFeignClient testBaiduFeignClient;
@GetMapping("baidu")
public String baiduIndex(){
return this.testBaiduFeignClient.index();
}
RestTemplate和Feign对比
feign性能优化
1.配置连接池(例如Apache的HttpClient或者okhttp,这里用httpclient)
加依赖
<dependency>
<groupId>io.github.openfeign></groupId>
<artifactId>feign-httpclient</artifactId>
写配置
feign:
httpclient:
#让feign使用apache httpclient做请求,而不是默认的urlconnection
enabled: true
#feign的最大连接数
max-connections: 200
#feign单个路径的最大连接数
max-connections-per-route: 50
2.选择合适的日志级别
不建议设成full,因为打印的日志太多了,可以设成basic
来源:CSDN
作者:耗子肉
链接:https://blog.csdn.net/haozi_rou/article/details/98967361