Spring Cloud使用Feign进行远程调用的操作指南
作者:Dream_sky分享
一、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
@Autowired private ProviderServeClient providerServeClient; /** * 根据id查询订单并返回 */ @Override public 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. 存入order order.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 = {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->ProviderServeClient.class})
启动成功
测试接口调用成功
以上就是Spring Cloud使用Feign进行远程调用的操作指南的详细内容,更多关于Spring Cloud Feign远程调用的资料请关注脚本之家其它相关文章!