Feign替代RestTemplate
RestTemplate方式调用存在的缺陷
String url="http://userservice/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
代码可读性差,变成体验不统一;
参数复杂的时候URL难以维护。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加注解,启动类上,这里我们针对的主要就是消费者得服务。
@EnableFeignClients
书写工具类
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
信息:服务名称,请求方式,请求路径,请求路径,返回值类型
将之前得RestTemplate对象注解掉。
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 4.返回
User user = userClient.findById(order.getUserId());
order.setUser(user);
return order;
}
小结
引入依赖 --> 添加注解 --> 编写FeignCLient接口 --> 方法替代
自定义配置Feign
修改配置类型
我拿日志配置的设置举例。
配置文件方式
feign:
client:
config:
# default: #全局配置
# loggerLevel: FULL
userservice: #针对某个微服务配置
loggerLevel: FULL #日志级别
Java代码方式
先声明Bean
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}
全局配置
在主启动类得这个注解
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
针对每个提供者服务配置
在client的工具类中的注解
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
使用优化
底层客户端实现:
URLConnection:默认实现,不支持连接池
Apache HttpClient :支持连接池
OKHttp:支持连接池
优化的性能主要是:
使用连接池代替默认的URLConnection
日志级别,最好用basic或none
使用方式
我拿httpclient举例
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件修改
feign:
client:
config:
# default: #全局配置
# loggerLevel: FULL
# userservice: #针对某个微服务配置
# loggerLevel: FULL #日志级别
httpclient:
enabled: true #开启支持
max-connections: 200 #最大连接数
max-connections-per-route: 50 #每个路径的最大连接数
总结
日志级别尽量用basic,我使用的是java代码方式,不是配置文件方式,你可以看到,我的配置文件日志级别注释掉了。
使用HttpClient或OKHttp代替URLConnection
导依赖
配置文件开启功能,设置参数。
最佳实践
消费者的FeignClient在远程调用提供者的服务时,需要每次都要书写这个类,如果有100个消费者服务需要调用的话是不是很麻烦呢?将其抽取出来,只需要书写一次,在需要时直接导包就可以。
方式————抽取
将FeignClient、POJO、Feign的默认配置都抽取出来成为一个项目,供所有消费使用。
步骤
定于moule,导入feign的starter依赖。
将将提供者的Cllent、FeignConfiguration、需要的实体类移植到该模块中。
在需要的消费者中引入该模块的依赖,并把那些不必要的类和包斩掉。
将消费者中的import更新为该模块的依赖。
重启测试。
新模块的
对于之前的消费者,不需要的部分删去。
可以看到没有那些类和文件了。
导依赖的时候很简单。
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign-api</artifactId>
<version>1.0</version>
</dependency>
需要注意的
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决: 方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
原来消费的配置文件中也不能有关于feign的配置了,需要全部注释掉,那该怎末办呢,还有之前的httpclient,那就不能使用了呀,我觉得有两种方式
一:放到抽取出来的那个公共模块里面去;
二:在nacos的管理端,针对某个服务写配置文件,你可以试试