SpringCloud-Day3-Feign
Http客户端Feign
1. Feign-基于Feign远程调用
1.1RestTemplate存在的问题引出Feign
1.2 Feign的介绍
Feign是个声明式的http的客户端,官方地址链接: link.
其作用就是帮助我们优雅的实现http请求的发送
1.3 Feign在代码中的实现
Feign的使用步骤
①引入依赖
②添加@EnableFeignClients注解
③编写FeignClient接口
④使用FeignClient中定义的方法代替RestTemplate
- 引入依赖
<!--Feign客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 在order-service的启动类添加注解开启Feign的功能
- 编写Feign客户端,做接口声明
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
- 用客户端Feign替代RestTemplate
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private UserClient userClient; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); //2.利用Feign远程调用 User user = userClient.findById(order.getUserId()); //3.封装user到Order order.setUser(user); // 4.返回 return order; }
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
•服务名称:userservice
•请求方式:GET
•请求路径:/user/{id}
•请求参数:Long id
•返回值类型:User
2.Feign-自定义配置
两种配置方式
2.1 配置文件方式
2.2 Java代码方式
Feign的日志配置:
-
方式一是配置文件,feign.client.config.xxx.loggerLevel
①如果xxx是default则代表全局
②如果xxx是服务名称,例如userservice则代表某服务
-
方式二是java代码配置Logger.Level这个Bean
①如果在@EnableFeignClients注解声明则代表全局
②如果在@FeignClient注解中声明则代表某服务
3.Feign-性能优化
3.1Feign-底层的客户端实现
Feign底层的客户端实现:
•URLConnection:默认实现,不支持连接池
•Apache HttpClient :支持连接池
•OKHttp:支持连接池
因此优化Feign的性能主要包括:
①使用连接池代替默认的URLConnection
②日志级别,最好用basic或none
3.2 Feign-性能优化实现-连接池配置
Feign添加HttpClient的支持
引入依赖:
<!--引入httpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置连接池:
feign:
httpclient:
enabled: true
max-connections: 200
max-connections-per-route: 50
Feign的优化:
1.日志级别尽量用basic
2.使用HttpClient或OKHttp代替URLConnection
①引入feign-httpClient依赖
②配置文件开启httpClient功能,设置连接池参数
4.Feign-最佳实践
4.1 方式1:继承
给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
4.2 方式2:抽取
将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
Feign的最佳实践:
①让controller和FeignClient继承同一接口
②将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用
4.3 实现方式2 抽取
实现步骤
- 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
- 将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
- 在order-service中引入feign-api的依赖
- 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
- 重启测试
不同包的FeignClient的导入有两种方式:
①在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包
②在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码