服务容错保护(2、Hystrix服务降级)

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 异常。
  • 方法调用超时
  • 熔断器开启拦截调用
  • 线程池/队列/信号量是否跑满
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值