🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝🍓 更多文章请点击
文章目录
- 一、Feign简介
- 二、RestTemplate方式调用存在问题
- 三、Feign的使用步骤
- 3.1 引入依赖
- 3.2 添加@EnableFeignClients注解
- 3.3 编写FeignClient接口
- 3.4 使用Feign客户端代用RestTemplate
- 四、日志配置
- 4.1 日志级别介绍
- 4.2 配置日志
- 五、Feign的性能优化
- 六、Feign的实际应用
一、Feign简介
Feign官网
:https://github.com/OpenFeign/feign
Fegin是声明式、模块化的Http客户端,可以帮助我们快捷优雅的调用HTTP接口。在SpringCloud中可以很方便的创建一个Feign客户端,只需声明一个接口,并加上对应的注解就能完成对HTTP接口的调用。
二、RestTemplate方式调用存在问题
可读性差,参数复杂难以维护
//2远程查询用户信息String url="http://provider-server/provider/"+order.getUserId();//3. 发起调用User user = restTemplate.getForObject(url, User.class);
三、Feign的使用步骤
在服务消费者端添加如下
3.1 引入依赖
<!-- 加入feign的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
3.2 添加@EnableFeignClients注解
在启动类或者配置类添加
@EnableFeignClients
3.3 编写FeignClient接口
@FeignClient("provider-server")
public interface ProviderServeClient {/*** 根据id查询用户信息*/@GetMapping("/provider/{id}")User queryById(@PathVariable("id") Long id);}
- 服务名称:
provider-server
- 请求路径:
/provider/{id}
- 请求方式:
GET
- 请求参数:
Long id
- 返回值类型:
User
3.4 使用Feign客户端代用RestTemplate
@Autowiredprivate ProviderServeClient providerServeClient;/*** 根据id查询订单并返回*/@Overridepublic Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2远程查询用户信息
// String url="http://provider-server/provider/"+order.getUserId();//2. 发起调用
// User user = restTemplate.getForObject(url, User.class);User user = providerServeClient.queryById(order.getUserId());//3. 存入orderorder.setUser(user);// 4.返回return order;}
启动调用成功
四、日志配置
4.1 日志级别介绍
1. NONE: 不记录任何日志信息,默认值
2. BASIC: 仅记录请求的方法,URL以及响应状态码和执行时间
3. HEADERS: 在BASIC的基础上,增加了请求和响应头信息
4. FULL: 记录所有请求和响应的明细,包括头信息,请求体,元数据
4.2 配置日志
方式一
: 配置文件方式
全局配置
feign:client:config:default: # 全局的配置loggerLevel: BASIC
局部配置
feign:client:config:provider-server: # 写服务名称,则针对某个微服务的配置loggerLevel: FULL
方式二:
java代码方式
public class FeignClientConfiguration {public Logger.Level feignLogLevel(){return Logger.Level.BASIC;}
}
全局配置
,添加到@EnableFeignClients注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
局部配置
,添加到服务对应的@FeignClient注解中
@FeignClient(value = "provider-server",configuration = FeignClientConfiguration.class)
五、Feign的性能优化
Feign底层的客户端实现:
- URLConnection :默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp : 支持链接池
- 使用连接池代替默认的URLConnection
- 日志级别最好使用
BASIC
或者NONE
引入依赖
<!--httpClient的依赖 --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
配置连接池
httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 30 # 每个路径的最大连接数
六、Feign的实际应用
-
继承方式,给消费者的FeginClient和提供者的controller定义统一的父接口(
不推荐
)缺点:
- 耦合度高
- 参数无法继承
-
模块抽-----取将FeignClient抽取为独立模块,并把所有接口有关的配置都放到这个模块中,提供给所有消费者使用,这样就
不用每个消费者都定义自己的Feign客户端,避免重复开发
抽取启动可能会报错如下:
ProviderServeClient没有找到
Description:Field providerServeClient in com.xing.service.impl.ConsumerServiceImpl required a bean of type 'com.api.clients.ProviderServeClient' that could not be found.The injection point has the following annotations:- @org.springframework.beans.factory.annotation.Autowired(required=true)
原因:
- 启动类所在包:
package com.xing
- fegin模块客户端所在包为:
package com.api;
- Spring Boot启动默认扫描启动类所在包及其所有子包,而fegin客户端所在包没有扫描到,所以报错
ProviderServeClient没有找到
解决方案:
- 指定FeignClient所在包
@EnableFeignClients(basePackages = "com.api")
- 指定FeignClient字节码
@EnableFeignClients(clients = {ProviderServeClient.class})
启动成功
测试接口调用成功