天天看点

微服务--Hystrix熔断器

雪崩效应

  • 在微服务系统中,一个请求会调用多个服务来完成,服务可用的情况下,当某一个服务出现网络延迟或者故障时,请求就会被阻塞,等待故障服务响应。
  • 在高并发的情况下,单个服务的延迟导致整个请求延迟或阻塞,可能在几秒就使整个服务负载饱和
  • 雪崩效应: 单个点服务的请求故障导致用户请求阻塞,最终导致整个服务资源耗尽。由于服务依赖性,导致依赖该故障服务的其他服务也处于阻塞,最终导致其他服务资源耗尽,不可用。从而导致整个服务系统都不可用。

熔断器

  • 作用:防止雪崩效应
  • 原理:服务调用过程中,发现请求延迟或者阻塞,等待一定时间,判定为超时。并且根据设定的进行重试,重试次数都超时或者失败。则进行熔断,在一定时间内不在请求该服务,并预设返回默认值。保持请求逻辑,以及链路服务可用。

Hystrix

  • Hystrix是NetFlix公司开源项目,提供熔断器的功能,能够阻止分布式系统中出现联动故障。
  • Hystrix是通过隔离服务的访问点组织联动故障,并提供故障的解决方案,从而提高整个分布式系统的弹性

工作机制

  • 在一定的时间内,API接口的调用失败次数小于设定的阀值时,熔断器处于关闭状态,该API接口正常提供服务
  • 当API请求失败超过阀值,Hystrix判定服务故障,打开熔断器,处于打开状态;请求该API接口会执行快速失败的逻辑(fallback逻辑),请求的线程不会被阻塞
  • 打开状态的熔断器,一段时间之后会处于半打开状态,并将一定量的请求执行正常逻辑,另一部分执行fallback逻辑。若执行正常逻辑请求失败,则熔断器继续打开,若成功,则熔断器关闭。具有自我修复能力。

使用Feign Hystrix

  • 因为熔断只是作用在服务调用这一端,因此只需要在Consumer 端做配置

jar包引入

  • pom文件
<dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
           
  • 由于Feign中已经依赖了Hystrix,不需要引入额外的Hystrix包

application.xml 配置文件

  • feign.hystrix.enabled=true
spring.application.name=spring-cloud-hystrix-consumer
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
# 开启熔断
feign.hystrix.enabled=true
           

增加API熔断

  • 增加熔断处理类(fallback),实现Feign客户端接口,方法名同API名
/**
 * Feign 结合Hystrix 熔断器。如果熔断回调该方法
 *
 * @author yanbin
 * @since 2019/8/27 10:10
 */
@Component
public class IndexRemoteFallback implements IndexRemote {
	@Override
	public String hello(@RequestParam(value = "name") String name) {
		return "Hystrix fallback! name: " + name;
	}
}
           
  • @FeignClient 注解增加:fallback属性,指定定义好的类
@FeignClient(name = "spring-cloud-eureka-provider", fallback = IndexRemoteFallback.class)
public interface IndexRemote {
	@RequestMapping(value = "/hello")
	String hello(@RequestParam(value = "name") String name);
}
           

配置启动类

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class HystrixConsumerApplication {
	public static void main(String[] args) {
		SpringApplication.run(HystrixConsumerApplication.class, args);
	}
}
           

请求入口

@RestController
@RequestMapping("/")
public class ConsumerController {

	@Autowired
	private IndexRemote indexRemote;

	@RequestMapping("/hi/{name}")
	public String hi(@PathVariable("name") String name) {
		return indexRemote.hello(name);
	}
}
           

调试

  • 启动Eureka Server Provider Consumer

正常请求

微服务--Hystrix熔断器

熔断

  • 停掉Provider 返回Fallback。Hystrix熔断器起作用了
    微服务--Hystrix熔断器
  • 重启Provider,恢复服务
    微服务--Hystrix熔断器

继续阅读