首页 > 其他分享 >hystrix的熔断降级

hystrix的熔断降级

时间:2023-03-19 23:46:45浏览次数:34  
标签:降级 name hystrix 熔断 调方 断路器 public

hystrix的熔断降级

结合Feign 使用

1.A服务通过B服务的唯—标识,从Nacos获取到可调用列表。

2.使用feigh中的Http发起远程请求。

3.超过默认配置的时限,抛出异常,结束该线程。

调用方

依赖
        <!-- 熔断降级的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
在调用方的启动类中
//开启断路器的界面(调用方)
@EnableCircuitBreaker
对Feign 中的clients文件的ProducerController进行改造
package com.james.clients;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * name: 被调方的唯一标识
 * path: 被调方的controller层的路径
 */
@FeignClient(name = "dashan-first",path = "/user",fallback = ConsumerClientFallback.class)
public interface ConsumerClient {

    /**
     * feignClient中的方法与被调方要保持完全一致
     * 返回值,注解,路径,参数,方法名 一致
     * @return
     */
    @RequestMapping("/first")
    public String first();
}
在clients创建 ConsumerClientFallback 自定义的fallback处理类
import org.springframework.stereotype.Component;

@Component
public class ConsumerClientFallback implements ConsumerClient {
    @Override
    public String first() {
        return "被调方不可以用了,请稍后再次尝试";
    }
}

yml

ribbon:
  #设置超时时间为5秒
  ConnectTimeout: 5000
  ReadTimeout: 5000

#feign开启熔断 默认是 false
feign:
  hystrix:
    enabled: true

#配置hystrix的默认超时时长.默认为1秒,当1秒钟被调方没有返回结果内容,则直接进行熔断处理
hystrix:
  command:
    default:  #default全局有效,service id指定应用有效
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
#            被调方最大超时的时间
            timeoutInMilliseconds: 5000

断路器

1、针对于被调方的服务已经出现了问题,例如调用了10词,8都出现了问题。那么我们认为被调方的接口是不稳定的,后续请求我们应该直接降级掉,不在尝试继续请求真正的接口。注这个时候我们就可以开启断路器,后续的请求不再真正的访问:口,而是直接降级。注意断路器开启后,是可以进行自动状态变换。断路器有三种状态:

1.close.

2.open。

3.halfopen(半开)

被调方

1.添加依赖
 <!-- 断路器的管理界面-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
2.配置文件更改
#允许dashboard访问的内容 注意 hystrix 2.0版本以上进行开放
hystrix:
  dashboard:
    proxy-stream-allow-list: "*"
#配置允许访问所有的接口路径内容
management:
  endpoints:
    web:
      exposure:
        include: "*"
3.对于某个接口进行断路器的配置
    @RequestMapping("/first")
    //1.当该接口出现异常,走的降级方法 注意:降级方法要与本方法的返回值以及参数保持一致
    //2. 当该接口的处理速度过慢,也需要走预定好的退路方法。使用的是tomcat的信号量来进行管理每个线程的超时时间
    @HystrixCommand(fallbackMethod = "firstFallback",
            commandProperties = {
                    //开启tomcat的线程
                    @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),
                    //设置每个线程的最大的超时时间
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
                    //配置开启断路器
                    @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
                    //代表该接口如果出现异常的次数达到10次,则开启断路器
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "4"),
                    //代表总请求数达到50%的请求出现异常,则开启断路器
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),
                    //代表断路器多少秒后更改我们的断路器的状态,由 open状态改为halfopen状态
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000")
            })
    public String first() throws InterruptedException {
        //休眠时间
//        Thread.sleep(2990);
        return  "成功" + name +":"+port;
    }

    public String firstFallback(){
        return name +":"+port+"接口异常!";
    }
4.在config文件中配置hystrix.straem流
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;

import javax.servlet.annotation.WebServlet;

@WebServlet("/hystrix.stream")
public class HystrixServlet extends HystrixMetricsStreamServlet {
}
5.在启动类中加入注解
@SpringBootApplication
@EnableDiscoveryClient

//被调方的降级处理
@EnableHystrix
//开启断路器的界面
@EnableHystrixDashboard
//扫描我们自己配置的servlet路径
@ServletComponentScan("com.qf.config")
public class SpringCloudConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConsumerApplication.class);
    }
}

 

标签:降级,name,hystrix,熔断,调方,断路器,public
From: https://www.cnblogs.com/xbinbin/p/17234860.html

相关文章

  • 第三方接口的熔断方案(openresty)
    背景很多项目都需要调用到第三方的接口,曾经就有调用第三方接口慢,大量超时响应的请求不断堆积,造成服务不可用,间接堵塞了我司服务的整条依赖链,最后导致整个业务系统雪崩。不......
  • Ocelot的限流、熔断和负载均衡
     一、限流 想要在Ocelot中设置限流,需要在设置如下绿色所示:{"GlobalConfiguration":{"RateLimitOptions":{"DisableRateLimitHeaders":false,......
  • node多版本控制及node版本升降级
    nvm的简介、安装、使用一、nvm的安装默认安装到C盘,之后就不用配置环境变量了;如果安装到D盘,则需要配置相对应的环境二、配置找到nvm文件位置,点开setting在它后面输入......
  • 服务降级&熔断&限流
    服务降级&熔断&限流一、高并发&高可用其实我们讲过所有的SpringCloud知识,都为了解决两个问题:一个是高并发,一个是高可用。解决高并发&高可用问题的方法有很多,比如:从应......
  • Hystrix服务降级fallback
    Hystrix服务降级fallback 通过前面章节的讲解,我们都知道当服务熔断被触发之后,我们再次访问会返回如下结果:这样的响应结果,提供给用户显然是不够友好的。上面的提示信......
  • hystrix学习(一)之Command Properties之Execution
        一、HystrixCommand.run执行时会用到isolation.strategy:有两个选项二选一:1、线程:在单独的线程上执行,并发请求受线程池中线程数的限制2、信号量:在......
  • 【Sentinel】隔离和降级
    目录​​1.FeignClient整合Sentinel​​​​1.1.修改配置,开启sentinel功能​​​​1.2.编写失败降级逻辑​​​​1.3.总结​​​​2.线程隔离(舱壁模式)​​​​2.1.线程隔离......
  • Springcloud~openfeign开启hystrix基于线程池熔断的传值问题
    我们都知道,在hystrix默认情况下,采用线程池的熔断方式,每个openfeign都有自己的线程,而这使得它无法获取主线程上的变量;现在有个现实的问题就是,当前端登录后,把token经过gatewa......
  • Hystrix核⼼源码剖析
    springboot装配、⾯向切⾯编程、RxJava响应式编程的知识等等,我们剖析下主体脉络。 分析⼊⼝:@EnableCircuitBreaker注解激活了熔断功能,那么该注解就是Hystrix源码追踪的......
  • 面试官:熔断和降级有什么区别?
    熔断和降级都是系统自我保护的一种机制,但二者又有所不同,它们的区别主要体现在以下几点:概念不同触发条件不同归属关系不同1.概念不同1.1熔断概念“熔断”一词早期......