Hystrix-断路器

Hystrix-断路器

1.什么是断路器

断路器,就是微服务架构的保险丝

2.为什么需要Hystrix(保险丝)?

在微服务架构中,根据业务会拆分成一个一个微服务,服务与服务之间可以相互调用,为了保证高可用性,单个微服务通常会集群部署,但是由于网络等原因,不能保证服务100%可用,如果单个服务出现问题,调用的这个服务的服务就有可能出现线程阻塞,刚好这个时候又有大量的请求在访问当前服务,就会导致当前服务的线程资源不足,从而导致服务瘫痪,形成故障转移,导致服务雪崩

3.Hystrix是如何解决服务间调用问题的

资源隔离:鸡蛋不要放在一个篮子里(线程池隔离,信号量隔离)

服务降级:当调用目标服务出问题(超时,报错)时,会自动的调用一个本地方法,返回一个默认值

请求熔断:一旦确定目标服务出现问题(失败比例),Hystrix的熔断器会自动打开,拦截后续的所有请求,立刻判定失败,进行服务降级,过了单位的时间之后,熔断器就会变成半开状态,放行一个请求,如果还是失败,继续全开,拦截请求,否则熔断器关闭

4.Ribbon整合hystix

4.1 在Ribbon工程中,添加Hystix的依赖

      <!--添加hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

4.2 在启动类上添加注解

@EnableHystrix

4.3 在使用RestTemplate的地方,通过注解实现资源隔离

//    使用注解,隔离其他服务的调用资源,被该注解标记的方法会被Hystrix提供的线程调用(线程池隔离)
//    myFallBack就是降级方法的名字,当资源不足或者服务报错时,会走降级方法
//    熔断器默认已经开启
    @HystrixCommand(fallbackMethod = "myFallBack")
    @GetMapping("findStuById")
    public String findStudent( @RequestParam("sid")Integer sid){......}

  	/**
     * 降级方法,这里的返回值类型与参数列表与被注解 @HystrixCommand标记的方法相同
     * @param sid
     * @return
     */
    public String myFallBack( @RequestParam("sid")Integer sid){
        return "调用班级服务发生意外,走降级方法";
    }

5. Feign整合Hystrix

5.1 直接通过配置,开启Hystrix(在使用Feign的微服务中配置)

# 开启Feign的熔断器功能
feign.hystrix.enabled=true

#Feign中已经整合了Hysrix,所以不需要添加任何依赖,Feign中的Hystrix功能默认关闭

5.2 配置Feign接口,编写降级的实现类

//注解里面value表示的是微服务的名称 fallback表示的是微服务调用出现问题,走的降级方法
@FeignClient(value = "spring-teacher",fallback = TeacherFallBack.class)
public interface ITeacherFeign {
//    声明方法和请求路径,方法名可以随便起,但是为了后期管理方便,使用要调用的方法名
    @RequestMapping(value = "findTeaById",method = RequestMethod.GET)
     String getTeacherName( @RequestParam("tid")Integer tid);
}

// 接口的实现类
@Component
public class TeacherFallBack implements ITeacherFeign {
    @Override
    public String getTeacherName ( Integer tid ) {
        return "班级微服务调用教师微服务,走的降级方法";
    }
}

//Feign整合Hystrix,如果调用的微服务出现问题,只是调用的微服务方法走降级方法,而Ribbon整合eHysrix则会全部走降级方法

5.3 Hysrtix的配置

# 配置Hystrix的常用属性
# 配置隔离策略 默认是线程池隔离策略 信号量隔离(SEMAPHORE)
hystrix.command.default.execution.isolation.strategy=THREAD
# 配置hystix的超时时间 hystix的默认超时时间为1s,这里配置500ms
# Fiegn的超时时间和hystrix的超时时间,哪个短哪个就起作用
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=500
#是否开启hysrix的超时时间,默认为true,如果设置为false,意为不超时,但是Feign的超时任然起作用
hystrix.command.default.execution.timeout.enabled=true

#熔断器的相关配置
# 熔断器的相关配置,默认开启熔断器
hystrix.command.default.circuitBreaker.enabled=true
# 单位时间内,失败的次数,如果达到了这个阈值,那熔断器就会打开,默认是20次
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
# 多久之后,熔断器进入半开状态,默认是5s
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000

6.Hystrix的仪表盘

1. 创建一个独立的springboot项目,作为hystrix的仪表盘工程,添加依赖

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

2. 在hystrix仪表盘工程的启动类上加入注解

@EnableHystrixDashboard

3. 在全局配置文件中修改端口号

4. 在浏览器端输入http://localhost:4000/hystrix

localhost:是指本机 4000:表示的是该工程的端口号

在这里插入图片描述

5.去到需要监控的微服务,进行配置

5.1 导入依赖
       <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-metrics-event-stream</artifactId>
            <version>1.5.18</version>
            <scope>compile</scope>
        </dependency>
5.2 在启动类上加入如下配置
   @Bean
    public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet(){
        HystrixMetricsStreamServlet hystrixMetricsStreamServlet
                = new HystrixMetricsStreamServlet();
        ServletRegistrationBean<HystrixMetricsStreamServlet>
                servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(hystrixMetricsStreamServlet);
        servletRegistrationBean.addUrlMappings("/hystrix.stream");
        servletRegistrationBean.setName("HystrixMetricsStreamServlet");
        return servletRegistrationBean;
    }

6. 去到仪表盘工程,配置监控地址即可

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值