Spring Cloud Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。Feign会完全代理HTTP请求,开发时只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon负载和Hystrix熔断,可以不再需要显式地使用这两个组件。总体来说,Feign具有如下特性:
- 可插拔的注解支持,包括Feign注解和JAX-RS注解;
- 支持可插拔的HTTP编码器和解码器;
- 支持Hystrix和它的Fallback;
- 支持Ribbon的负载均衡;
- 支持HTTP请求和响应的压缩。
Spring Cloud Feign致力于处理客户端与服务器之间的调用需求。随着业务的扩展和微服务数量的增多,不可避免的需要面对如下问题:
- 弹性客户端
- 雪崩效应
简单来说,使用Spring Cloud Feign组件,他本身整合了Ribbon和Hystrix。可设计一套稳定可靠的弹性客户端调用方案,避免整个系统出现雪崩效应。
雪崩效应
在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进。但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,产生“雪崩效应”。引发雪崩效应的原因有:
- 硬件故障:如服务器宕机,机房断电,光纤被挖断等;
- 流量激增:如异常流量,重试加大流量等;
- 缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用;
- 程序BUG:如程序逻辑导致内存泄漏,JVM长时间FullGC等;
- 同步等待:服务间采用同步调用模式,同步等待造成的资源耗尽;
- 服务降级故障:服务的降级可以是以间歇性的故障开始,并形成不可逆转的势头。可能开始只是一小部分服务调用变慢,直到突然间应用程序容器耗尽了线程(所有线程都在等待调用完成)并彻底崩溃。
调用方式
@RequestMapping("/api")
public String HelloServiceFeign(String name){
return helloServiceFeign.getHost(name);
}
@FeignClient( name = "eureka-service",fallback = HelloServiceHystrix.class)
public interface HelloServiceFeign {
@RequestMapping(value = "/Hello/World", method = RequestMethod.GET)
public String getHost(@RequestParam(value="name") String name);
}
@Component
public class HelloServiceHystrix implements HelloServiceFeign {
@Override
public String getHost(String name) {
return "调用失败";
}
}