Hystrix是用于服务熔断,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。消费者端和服务提供者端都可以配置。服务降级一般使用在服务提供者端。
服务降级维度
- 超时服务器变慢
- 程序出错(服务器宕机,程序编写错误等)
服务降级配置
①搭建项目
- 以consul为注册中心搭建spring cloud项目
- 用OpenFeign实现服务调用
②服务提供者端导入依赖
org.springframework.cloud spring-cloud-starter-netflix-hystrix ③启动类添加注解,激活hystrix组件
@EnableHystrix @EnableDiscoveryClient @SpringBootApplication public class ProviderConsul8001{public static void main(String[] args) {SpringApplication.run(ProviderConsul8001.class, args);} }④编写业务,方法上添加@HystrixCommand,实现降级
@RestController @RequestMapping("provider") public class ProviderController {@Value("${server.port}")private String port;@GetMapping("getUUID")//业务处理时间超过2500毫秒 或者 该代码块发生错误 就调用自定义降级方法@HystrixCommand(fallbackMethod = "getUUIDFallback", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2500")})public String getUUID() {try {//沉睡3秒钟TimeUnit.SECONDS.sleep(3);} catch (Exception e) {}return port + " : " + UUID.randomUUID();}//自定义降级方法public String getUUIDFallback() {return port;} }⑤测试
全局服务降级配置
①编写业务,类上添加@DefaultProperties,方法上添加@HystrixCommand,实现降级
@RestController @RequestMapping("provider") //业务处理时间超过2500毫秒 或者 该代码块发生错误 就调用自定义降级方法 @DefaultProperties(defaultFallback = "defaultFallback", commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2500") }) public class ProviderController {@Value("${server.port}")private String port;@GetMapping("getUUID")@HystrixCommandpublic String getUUID() {int i = 10 / 0;try {TimeUnit.SECONDS.sleep(3);} catch (Exception e) {}return port + " : " + UUID.randomUUID();}//自定义全局降级方法public String defaultFallback() {return port;} }②测试
FeignFallback服务降级
①消费端导入依赖
org.springframework.cloud spring-cloud-starter-netflix-hystrix ②编辑application.yml配置文件,添加以下配置
feign:#允许fallbackhystrix:enabled: true③创建Service的实现类,添加@Component注解。用Service的实现类来服务降级
@Component public class ConsumerServiceImpl implements IConsumerService {@Overridepublic String getUUID() {return "fallback";} }④Service接口的@FeignClient注解增加fallback 属性,
@Component @FeignClient(value = "cloud-provider",fallback = ConsumerServiceImpl.class) public interface IConsumerService {//服务提供者访问路径@GetMapping("/provider/getUUID")public String getUUID(); }⑤只启动注册中心,启动消费者,访问http://localhost/consumer/getUUID