服务降级是指,当请求超时、资源不足、系统面临高并发、高负载等情况时,为了保障核心业务的正常运行和系统的稳定性,对一些非核心功能或服务进行限制、暂停或简化处理的一种技术手段。
服务降级将不会调用真实服务,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。
确保核心业务的可用性和性能不受影响,优先满足核心业务的资源需求,使核心业务能够稳定运行,避免因系统过载而导致整个系统崩溃或核心业务无法正常提供服务。
通过降低非核心功能的负载,减少系统的资源消耗和压力,从而提高系统的整体稳定性和可靠性,降低系统出现故障的风险。
当系统出现部分故障或资源不足时,能够快速地对非关键服务进行降级处理,避免故障的扩散和影响范围的扩大,使系统能够在有限的资源下尽可能地保持正常运行状态,为故障修复争取时间。
第一步:使用 Maven 引入 Hystrix 的依赖,请参考“Netflix Hystrix 入门实例”
第二步:在 Spring Boot 项目的启动类上添加 @EnableCircuitBreaker 注解,开启 Hystrix 的断路器功能。
第三步:定义服务降级方法
创建一个类,在其中定义服务降级的方法。该方法的返回值类型和参数列表需要与被降级的服务方法一致。例如,假设我们有一个获取用户信息的服务方法,其定义如下:
package com.hxstrive.hystrix_demo.controller; import com.hxstrive.hystrix_demo.dto.CommonReturn; import com.hxstrive.hystrix_demo.entity.User; import com.hxstrive.hystrix_demo.service.UserService; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * Hystrix 降级 * @author hxstrive.com */ @RestController @RequestMapping("/demo2") public class Demo2Controller { @Autowired private UserService userService; @GetMapping("/getUserById") @HystrixCommand(fallbackMethod = "fallback") public CommonReturn<User> getUserById(@RequestParam Long id) { return userService.getUserById(id); } /** * 当服务调用失败时,调用此方法 */ private CommonReturn<User> fallback(Long id) { return CommonReturn.fail("网络出现问题,调用 fallback 方法,id=" + id); } }
启动服务,使用浏览器访问 http://localhost:8080/demo2/getUserById?id=1 地址,输出如下图:
通过上图可知,成功触发了我们定义的 fallback 降级方法。
注意:
要触发降级,需要将目标 USER 服务停掉。
服务降级及当调用服务出现错误时,返回托底数据。