1.为什么会出现熔断?
这里有个名词叫雪崩效应,起源于密码学中,意思是任何一个明文的变化将引起密文的全部变化,也就是类似于雪崩,雪崩前很平静,一个点变化全部崩塌。在微服务当中,如果一个服务器在高并发的场景下即大量请求的情况下,就会出现阻塞,从而导致整个服务器不能提供服务的情况称为服务雪崩。
2.如何解决这种服务雪崩?
熔断机制是一种有效的解决方案,即指定时间窗口的请求失败率达到设定阈值时,系统通过熔断器直接断开请求,通常分两种类型:预熔断、即时熔断。Hytrix是熔断的一种实现方式,Hytrix跟Feigh本身没啥关系。
3.服务降级
服务降级是一种增强用户体验的方式,即发生问题时,不是直接抛出一些用户看不懂的东西,而是用户可接受的一种方式。一般来说,发生熔断必定会发生服务降级,但降级未必时发生了熔断。服务降级两种方式:
- fallbackMethod服务降级:针对单个方法的降级处理
- fallbackFactory服务降级:针对一个类的降级处理
4.fallbackMethod案例
1)添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
2)controller中方法使用
@HystrixCommand(fallbackMethod = "getHyHandle")
@GetMapping("/get/{id}")
public Depart getHandle(@PathVariable("id") int id) {
return service.getDepartById(id);
}
/**
* 降级处理方法
*/
public Depart getHyHandle(@PathVariable("id") int id){
Depart d=new Depart();
d.setName("服务拥堵,请稍后");
d.setId(id);
return d;
}
3)启动类中开启熔断
//开启feign客户端指定接口所在包
//@EnableCircuitBreaker
@EnableFeignClients(basePackages = "com.test.zzy.service")
@SpringCloudApplication//包含@SpringBootApplication @EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4)启动feign中熔断配置可用
5)启动eureka和两个提供者服务和消费者服务
上一节介绍Ribbon已建好得两个提供者,当前消费者及eureka
访问时每次会切换到不通得提供者上,当关掉一个提供者得时候,访问会出现如下