目录

一、服务熔断概述

1.雪崩效应

2.Hystrix

3.服务熔断

4.使用

二、服务降级


一、服务熔断概述

1.雪崩效应

分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。

2.Hystrix

通过断路监控,处理一些无法处理的异常

  • 提供保护并控制通过第三方客户端库(通常是通过网络)访问的依赖项的延迟和失败。
  • 停止复杂的分布式系统中的级联故障。
  • 快速失败,迅速恢复。
  • 回退并在可能的情况下正常降级。
  • 启用近乎实时的监视,警报和操作控制。

3.服务熔断

熔断机制是应对雪崩效应的一种微服务保护机制

4.使用

1.导入依赖

<!-- hystrix -->
	<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-hystrix</artifactId>
		<version>1.4.7.RELEASE</version>
	</dependency>

2.修改yaml文件

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: spring-provider

3.编写controller层

@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    @GetMapping("/queryDeptById/{id}")
    // 这个注解就是开始熔断机制,fallbackMethod 后的值就是下面备选方法的方法名
    @HystrixCommand(fallbackMethod = "hystrixQueryDeptById")
    public Dept queryDeptById(@PathVariable("id") Long id){
        Dept dept = deptService.queryDeptById(id);

        //处理异常
        if (dept == null) {
            throw new RuntimeException("id =>【" + id + "】 无法获取改用户,或不存在!");
        }
        return dept;
    }
    public Dept hystrixQueryDeptById(@PathVariable("id") Long id){
        return new Dept(id,"【Hystrix】id =>【" + id + "】 无法获取改用户,或不存在!");
    }
}

4.主类上添加注解

//对熔断的支持

@EnableCircuitBreaker

二、服务降级

  • 根据实际业务情况以及流量,对一些服务喝页面有策略的不处理或换简单的方式处理,从而释放服务器资源以保证核心服务正常运作或高效运作
  • 使用场景:
  • 当负载超过了预设的阀值或流量超出预计,保证重要的服务能正常运行,将不紧急,不重要的服务延迟使用或暂停使用
  • 核心设计
  • 服务降级-分布式开关
  • 超时降级:设定超时重试次数和机制,使用异步机制探测恢复情况
  • 失败次数降级:一些不稳定的API,当失败次数达到一定阀值,自动降级,使用异步机制探测回复情况
  • 故障降级:调用的远程服务挂掉(网络故障,DNS故障,Http服务返回错误的状态码和RPC服务抛出异常)可以直接降级
  • 限流降级:触发了限流超额,可以使用暂时屏蔽的方式来进行短暂的屏蔽
     

操作:实现FallbackFactory接口

修改FeignClient增加服务降级功能fallbackFactory

开启服务降级

@Component
public class DeptConsumerFallbackFactory implements FallbackFactory {
    @Override
    public FeignService create(Throwable throwable) {
        return new FeignService() {
            @Override
            public String test() {
                return "FallbackFactory ==================test";
            }

            @Override
            public String Test(int id) {
                return "FallbackFactory ==================Test "+id;
            }
        };
    }
}
@Component
@FeignClient(value = "PROVIDER-8001" ,fallbackFactory = DeptConsumerFallbackFactory.class)
public interface FeignService {

    @RequestMapping(method = RequestMethod.GET ,value = "/test")
    String test();

    @RequestMapping(method = RequestMethod.GET ,value = "/hystrix/{id}")
    String Test(@PathVariable(value = "id")int  id);
}

FeignClient加入实现服务降级注入的bean

feign.hystrix.enabled=true