Http客户端Feign的使用(黑马springcloud笔记)-创新互联
- Feign基本使用
- 一、Feign代替RestTemplate
- 二、自定义配置
- 三、Feign使用优化
- 1. 底层优化
- 2. 日志优化
- 四、最佳实践
- 方式一:继承
- 方式二:抽取
步骤:
引入依赖
org.springframework.cloud spring-cloud-starter-openfeign 启动类上添加注解@EnableFeignClients
编写Feign客户端
@FeignClient("userService") public interface UserApi {@GetMapping("/user/{id}") User findById(@PathVariable Long id); }
使用
这是RestTemplate的代码
@Service public class OrderService {@Autowired private OrderMapper orderMapper; @Autowired RestTemplate restTemplate; public Order queryOrderById(Long orderId) {// 1.查询订单 Order order = orderMapper.findById(orderId); // 2.调用REST接口查询数据 User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class); // 3.封装数据 order.setUser(user); // 4.返回 return order; } }
这是Feign的代码:
@Service public class OrderService {@Autowired private OrderMapper orderMapper; @Autowired UserApi userApi; public Order queryOrderById(Long orderId) {// 1.查询订单 Order order = orderMapper.findById(orderId); // 2.调用REST接口查询数据 User user = userApi.findById(order.getUserId()); // 3.封装数据 order.setUser(user); // 4.返回 return order; } }
代码可读性更高了,并且自带负载均衡。
feign可以自定义配置一些东西:
springboot中配置一般都是两种方式,代码或者application.yml
代码
@Bean public Logger.Level feignLogLevel() {return Logger.Level.FULL; }
若是全局生效,需要在启动类的注解中加上该配置类:
@EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
若是局部,只需要在对应的客户端中声明:
@FeignClient(value = "userService", configuration = CustomConfiguration.class)
application.yml
配置文件同样也可以配置全局或者局部
全局:
feign: client: config: default: # 这个就是区分全局或者局部的 若是default则是全局 logger-level: full
局部:
feign: client: config: userService: # 这个就是区分全局或者局部的 若是default则是全局 logger-level: full
Feign底层实现默认是URLConnection,不支持连接池,效率低。
我们可以选择Apache HttpClient或是OKHttp(俩都支持连接池)来优化Feign的性能。
以HttpClient为例:
引入依赖
io.github.openfeign feign-httpclient 配置连接池
feign: httpclient: enabled: true # 开启feign对httpclient的支持 max-connections: 200 # 大连接数 max-connections-per-route: 50 # 每个路径大连接数
简单说就是使用NONE级别或是BASIC级别,级别高了消耗性能。
四、最佳实践 方式一:继承给消费者的FeignClient和提供者的Controller定义一个统一的父接口作为标准。
缺点:紧耦合
方式二:抽取就是搞一个公共的模块,把多个微服务都需要的接口写在里面,需要使用时引入即可。
缺点就是会引入很多不用的东西。
实现:
创建新的公共模块,导入feign的依赖,创建普通maven项目即可,不然打包时有坑。
将order-service中的Feign客户端、实体类、Feign的配置等移入该公共模块
在order-service中引入该公共模块
如:
com.example feign-api 0.0.1-SNAPSHOT 指定客户端
两种方式
扫描包,全部导入
@EnableFeignClients(basePackages = "com.example.feignapi.apis")
该包下的所有feign客户端都会被扫描
指定客户端导入
@EnableFeignClients(clients = {UserAPI.class})
指定客户端,可以是一个数组
建议使用第二种。
测试
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:Http客户端Feign的使用(黑马springcloud笔记)-创新互联
URL地址:http://cdiso.cn/article/djoicd.html