1.服务降级
1.1 简介
服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。比如电商平台,在针对618、双11等高峰情形下采用部分服务不出现或者延时出现的情形。
Hystrix服务降级:Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回托底数据. fallback方法的返回值一般是设置的默认值或者来自缓存.告知后面的请求服务不可用了,不要再来了
1.2 实现
1.2.1. 接前文的eureka服务端和客户端,在客户端添加Hystrix的依赖(我这里直接在前文的consumer01项目中进行修改了)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
或重新创建eureka客户端,选择Hystrix组件
1.2.2. 启用Hystrix,添加@EnableHystrix注解
package com.productconsumer.consumer;
import com.netflix.loadbalancer.BestAvailableRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
*
* @date 2020/7/27 16:56
* @author wei.heng
*/
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ConsumerApplication {
/**
*
* 初始化 RestTemplate - @LoadBalanced做多节点负载均衡
* @return org.springframework.web.client.RestTemplate
* @date 2020/7/27 16:57
* @author wei.heng
*/
@LoadBalanced
@Bean(name = "restTemplate")
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
/**
*
* 配置消费端的负载均衡策略
* @return com.netflix.loadbalancer.RandomRule
* @date 2020/7/27 17:38
* @author wei.heng
*/
@Bean
public RandomRule randomRule() {
return new RandomRule();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
1.2.3. 对需要做托底返回的方法,添加@HystrixCommand注解,实现defaultFallback里定义的方法
@HystrixCommand(defaultFallback="fallBack01")
@Override
public Product getProduct(Long id) {
return restTemplate.getForObject("http://PRODUCT-PROVIDER/product/"+id, Product.class);
}
private Product fallBack01() {
Product product = new Product();
product.setId(-1111L);
product.setNote("系统繁忙稍后再试......");
return product;
}
1.2.4. 测试
期望结果:当业务方法调用失败/异常时,直接返回托底数据(fallBack01返回值)
我这儿直接将服务提供者停掉,然后调用消费者服务接口
当然,真实场景中,业务层与控制层的交互,还需要包装一下,这里仅作为测试的学习参考
1.2.5. 触发fallback调用时机
- 方法抛出非 HystrixBadRequestException 异常。
- 方法调用超时
- 熔断器开启拦截调用
- 线程池/队列/信号量是否跑满