Feign远程调用
Ribbon可以调用远程服务,但是不是最佳的选择,我们可以选择Feign组件。
Feign是在Ribbon的基础上进行了封装。
1. Feign简介
Feign是Netflix开发的声明式、模板化的HTTP客户端。
Feign可帮助我们更便捷,优雅的调用HTTP API。
在SpringCloud中,使用Feign非常简单--创建一个接口,并在接口上添加一些注解,代码就完成了。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka从而让Feign的使用更加方便。
Feign具备了Ribbon的负载均衡功能和Eureka的服务注册。
使用feign我们更多的是关注服务消费者,服务消费者如何调用服务提供者微服务。
2. 基于Feign远程服务调用
使用feign步骤:
导入依赖
配置调用接口
在启动类上激活feign
通过自定义的接口调用远程微服务
1.导入Feigfn依赖
在服务消费者中加入依赖
<!-- SpringCloud整合的openfeign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.配置调用接口
服务消费者的合适包中创建feign远程调用微服务接口
每个接口方法对应的是服务提供者暴露的调用API
/**
* Feign调用接口
*
* 1.声明需要调用的微服务名称
* @FeignClient
* name:服务提供者名称
*/
@FeignClient(name = "service-product") //服务提供者名称
public interface ProductFeignClient {
/**
* 2.配置需要调用的微服务接口
*/
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable("id") Integer id);
}
提示:@FeignClient请求ip路径和@RequestMapping请求接口地址组成了请求RUL。
定义各参数绑定时, @PathVariable,@RequestParam,@RequestHeader等可以指定参数属性,在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出异常
@FeignClient :注解通过name指定需要调用的微服务的名称,用于创建Ribbon的负载均衡器。所以Ribbon会把service-product这个微服务解析为注册中心的服务。
3.启动类开启激活feign
服务消费者启动类开启feign注解
/**
* 订单服务启动类 (服务消费者)
* @Author 黄柏茗
* @Date 2021-09-09
*/
//激活feign
@EnableFeignClients
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
System.err.println("订单微服务启动成功");
}
}
4.通过feign接口进行远程调用微服务
服务消费者中调用feign接口进行远程访问微服务
/**
* 订单Controller
*/
@RestController
public class OrderController {
/**
* 1.注入feign调用接口
*/
@Autowired
private ProductFeignClient productFeignClient;
/**
* 下订单
* @param id
* @return
*/
@RequestMapping("/buy/{id}")
public Product getProductById(@PathVariable Integer id) {
//2.使用feign接口进行远程服务调用微服务
Product product = productFeignClient.findById(id);
return product;
}
我们在调用的时候,可以发现,在远程调用微服务的时候,不用拼接URL了,更
测试:
5. Feign和Ribbon的关系
Ribbon是一个基于HTTP和TCP客户端的负载均衡的工具。
它可以在客户端配置RibbonServerList (服务端列表) ,使用HttpClient或RestTemplate模拟http请求,步骤相当繁琐。
Feign是在Ribbon的基础上进行了一次改进,是一个使用起来更加方便的HTTP客户端。采用接口的方式,只需要创建一个接口,然后在上面添加注解即可,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。
简单理解:
Feigin天生具备负载均衡功能,
6.负载均衡
feign本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外的引入依赖,也不需要注册RestTemplate对象。
feign基于ribbon。
我们可以像配置Ribbon那样去配置负载均衡配置,通过 riboon.xx 进行全局配置,也可以通过 服务名.ribbon.xx 来指定服务配置。
使用Ribbon的配置来修改负载均衡配置即可。
测试环境基于Eureka。
模拟启动2个提供相同的微服。
测试:
7.请求压缩
SpringCloud Feign支持对请求或响应的数据进行GZIP压缩,减少通信过程中的性能损耗。
消费者使用数据压缩配置即可。
开启请求与响应的压缩功能:
#开启feign请求与响应的数据压缩
feign:
compression:
request:
enabled: true #开启请求压缩
response: true #开启请求压缩
8.Feign日志级别
开发阶段希望看到Feign请求过程的日志记录,默认Feign日志是不开启的。
想要使用配置方式来达到日志效果,在yml文件配置即可。
使用简单,配置压yml文件即可。
在消费者中修改yml,增加feign的日志配置
#开启feign请求与响应的数据压缩
feign:
compression:
request:
enabled: true #开启请求压缩
response: true #开启请求压缩
#Feign日志输出 (看这里!!!!)
# 日志配置:NONE:不输出日志 BASIC:适用于生产环境追踪问题 HEADERS:在BASIC基础上记录请求和响应头信息 FULL:记录所有
client:
config:
service-product: #需要调用的服务名称
loggerLevel: FULL
#日志输出
logging:
level:
com.hbm.order.feign.ProductFeignClient: debug #可选择feign的接口全限定类名
测试到服务调用时,Feign调用日志已经输出
总结:
重点是在Feign的使用
使用feign步骤:
导入依赖
配置调用接口
在启动类上激活feign
通过自定义的接口调用远程微服务