微服务 熔断器Hystrix

熔断器Hystrix简介

  • (1)熔断器是什么?
    熔断器(fuse)是指当电流超过规定值时,以本身产生的热量使熔体熔断,断开电路的一种电器,如(空气开关)
  • (2)什么是Hystrix
    美[hɪst’rɪks]
    Hystrix是一个延迟和容错库
  • (3)Hystrix有什么作用?
    使用服务降级,线程隔离解决雪崩问题
    在这里插入图片描述

雪崩问题

  • (1) 微服务I 发生异常,请求阻塞,用户请求就不会得到响应,则tomcat的这个线程不会释放,于是越来越多的用户请求到来,越来越多的线程会阻塞,会导致服务器资源耗尽,从而导致所有其它服务都不可用,形成雪崩效应。
  • (2)Hystrix解决雪崩问题的手段主要是服务降级
    》线程隔离
    》服务熔断
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

线程隔离

  • (1) 线程隔离是什么?
    Hystrix为每个依赖服务调用分配一个小的线程池
    如果线程池已满调用将被立即拒绝,默认不采用排队,加速失败判定时间。
    在这里插入图片描述

服务降级

  • (1)服务降级
    优先保证核心服务,而非核心服务不可用或弱可用。用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息) 。
    服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。

熔断实践

  • (1)读音
    circuit 美[ˈsɜːrkɪt]
  • (2)服务熔断配置
    》1 配置依赖
    》2 开启熔断
    在启动类上添加注解:@EnableCircuitBreaker
    》3 编写降级方法 myFallBack
    》4 设置Controller方法的降级方法为 myFallBack
    @HystrixCommand(fallbackMethod = “myFallBack”)

parent pom.xml

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                <version>2.2.6.RELEASE</version>
            </dependency>
        </dependencies>

comsumer pom.xml

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>

启动器类

@SpringCloudApplication
public class Demo02ConsumerUser81Application`
在这里插入图片描述

CumtomerController

》1:未使用统一的 退路方法

@HystrixCommand(fallbackMethod = "fallback")
@RequestMapping(path = "/{id}", method = RequestMethod.GET)
    public Object get(@PathVariable long id)
 //退路
    public Object fallback(long id){
    
    
        return "不好意思,网络卡,十分卡";
    }
    //只是让请求的数据返回,让线程被释放掉```2:使用统一的 退路方法

```java
@DefaultProperties(defaultFallback = "defaultFallback")
@Slf4j
public class CustomerController

 @HystrixCommand
    public Object get(@PathVariable long id)
 public Object defaultFallback(){
    
    
        return "出现问题了,不要慌,程序员正在拼命修改bug";
    }

@HystrixCommand 找@DefaultProperties(defaultFallback = “defaultFallback”) ,再找到defaultFallback方法

@DefaultProperties

  • (1)DefaultProperties注解 用来指定 默认的降级方法
    标记在类上
  • (2)属性defaultFallback
    设置降级方法
  • (3)与@HystrixCommand 配合使用
@Slf4j
@DefaultProperties(defaultFallback = "defaultFallback")
public class CustomerController {
    
    
//@HystrixCommand(fallbackMethod = "fallback")
    @HystrixCommand
    @RequestMapping(path = "/{id}", method = RequestMethod.GET)
    public Object get(@PathVariable long id){
    
    
          if(id==1){
    
    
            throw new RuntimeException();
          }
        //3:此处不能写死 provider的 ip,port ,只能写服务名。不能使用_,替换成-
        String url = "http://demo01-provider-user/users/"+id;//参1 地址
        String json = rt.getForObject(url, String.class);//参2:数据要转换成什么类型
        return json;
    }
    //退路
    public Object fallback(long id){
    
    
        return "不好意思,网络卡,十分卡";
    }
    //只是让请求的数据返回,让线程被释放掉
    public Object defaultFallback(){
    
    
        return "出现问题了,不要慌,程序员正在拼命修改bug";
    }

Guess you like

Origin blog.csdn.net/qq_40711092/article/details/110130758