SpringCloud hystrix服务降级学习笔记

目录
  • 一、Hystrix简介
    • 1、Hystrix是什么
    • 2、Hystrix能干什么
  • 二、服务熔断
    • 1、服务熔断简介
    • 2、配置pom.xml
    • 3、配置application.yaml
    • 4、修改Controller
    • 5、修改启动类
    • 6、效果图
  • 三、服务降级
    • 1、什么是服务降级
    • 2、DeptClientFailBackFactory类
    • 3、添加注解
    • 4、修改application.yaml
    • 5、效果图
  • 四、DashBorder
    • 1、新建一个module
    • 2、pom.xml配置
    • 3、配置application.yml
    • 4、配置启动类
    • 5、添加被监控的类
    • 6、效果图

一、Hystrix简介

1、Hystrix是什么

 流量高峰时,一个单节点的宕机或延迟,会迅速导致所有服务负载达到饱和。应用中任何一个可能通过网络访问其他服务的节点,都有可能成为造成潜在故障的来源。更严重的是,还可能导致服务之间的延迟增加,占用队列、线程等系统资源,从而导致多系统之间的级联故障。

简单的说,当服务器依次请求A->P->H->I时,如果其中一个发生了故障,都有可能导致整个流程失败,或者降低整个流程的效率。

更严重的是,当网络请求是通过第三方的一个黑盒客户端来发起时,实现细节都被隐藏起来了,而且还可能频繁变动,这样发生问题时就很难监控和改动。如果这个第三方还是通过传递依赖的,主应用程序中根本没有显示地写出调用的代码,那就更难了。

网络连接失败或者有延迟,服务将会产生故障或者响应变慢,最终反应成为一个 bug。

所有上述表现出来的故障或延迟,都需要一套管理机制,将节点变得相对独立,这样任何一个单节点故障,都至少不会拖垮整个系统的可用性。

  所以Hystrix就是为了解决请求序列中请求出现问题的情况,核心原则就是丢车保帅,如果一个请求出现问题,常见的有两种方案:

一种是按照原来的方案再来一次,这是有成功的可能的。

一种是只是反馈给用户这个请求有问题,出故障的请求不会影响到序列中其他的请求。

2、Hystrix能干什么

1、服务熔断

2、服务降级

3、数据监控

二、服务熔断

1、服务熔断简介

熔断机制是赌赢雪崩效应的一种微服务链路保护机制。

当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阀值缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是:@HystrixCommand。

服务熔断解决如下问题:

  • 当所依赖的对象不稳定时,能够起到快速失败的目的;
  • 快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。

2、配置pom.xml

首先新建一个module,和springcloud-provider-dept-8001一模一样(名字除外),修改一下application.yaml,一个是端口(也可以不改,最好修改一下,避免端口冲突),另一个是instance-id,这样在尤里卡中可以分辨出来。

需要引入hystrix的依赖,和feign一样,只是把feign换成hystrix

 <!--引入hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

3、配置application.yaml

和springcloud-provider-dept-8001一样,只需要修改一下端口号和instance-id

#端口号
server:
  port: 8001

#配置数据库
spring:
  datasource:
    url: jdbc:mysql:///dp80?serverTimezone=UTC
    username: root
    password: 200201203332
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: springcloud-provider-dept
debug: true

#配置Eureka的配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: springcloud-provider-8001

info:  #autuator监控信息
  app.name: rainhey-springcloud
  company.name: www.rainhey.com

4、修改Controller

@HystrixCommand注解

用来处理服务熔断和服务降级,属性和方法可以点进去查看。

@HystrixCommand注解通常放到方法之上,当这个方法抛出异常的时候,系统不会立刻停止处理异常,而是先找Hystrix里面绑定的备用方法,然后去执行备用方法。

那么@HystrixCommand如何绑定备用方法呢?见下图

@HystrixCommand注释通过内部属性fallbackMethod绑定方法,具体步骤是@HystrixCommand(fallbackMethod = “备用方法名”)

package com.you.Controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.you.mapper.DeptMapper;
import com.you.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@ResponseBody
@Component
public class DeptController {
    @Autowired
    DeptMapper deptMapper;
    @GetMapping("/dept/aDept/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGetDeptOfId")
    public Dept getDeptOfId(@PathVariable("id") Long id)
    {
        System.out.println("进来了,id是:"+id);
        Dept dept = deptMapper.finaDeptOfId(id);
        if(dept==null)
        {
            throw new RuntimeException("id=>"+id+"不存在该用户,或者信息没有找到!");
        }
        return dept;
    }
    /* 备用方案 */
    public Dept hystrixGetDeptOfId(@PathVariable("id") Long id)
    {
            Dept dept = new Dept();
            dept.setDeptno(id);
            dept.setDeptname("id=>"+id+"不存在该用户,或信息没有找到!@Hystrix");
            dept.setDb_source("no info in datebase");
            System.out.println("dept的值是:"+dept);
            return dept;
    }
}

5、修改启动类

从前面的4篇文章里我们了解到,每次用到新的技术,启动类里都会增加一个新的注解,那么?Hystrix的注解是什么呢?@EnableCircuitBreaker,只要把这个注解加在主启动类上,那么主启动类就可以处理服务熔断了。

6、效果图

不开熔断机制

开了熔断机制

三、服务降级

1、什么是服务降级

服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。说白了,就是尽可能的把系统资源让给优先级高的服务。

例如假设有三个服务器ABC,在某一段时间,访问A的用户特别多,导致A服务器快要崩溃了,这时候访问B、C的用户很少,那么我暂时先把B、C停掉,用来处理A。

服务降级主要用于什么场景呢?当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。

降级的方式可以根据业务来,可以延迟服务,比如延迟给用户增加积分,只是放到一个缓存中,等服务平稳之后再执行 ;或者在粒度范围内关闭服务,比如关闭相关文章的推荐。

2、DeptClientFailBackFactory类

在springcloud-api模块下的service包中新建降级配置,DeptClientServiceFallBackFactory.java。同时实现其方法,他的返回类型就是我们写服务的接口。

package com.you.service;
import com.you.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
/*!!!降级!!!*/
@Component  //注册到容器里面去
public class DeptClientFailBackFactory implements FallbackFactory {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public Dept getDeptOfId(Long id) {
                Dept dept = new Dept();
                dept.setDeptno(id);
                dept.setDeptname("id=>"+id+"没有对应的信息,客户端提供了降级的信息,这个服务现在被关闭了!");
                dept.setDb_source("没有数据");
                return dept;
            }
        };
    }
}

3、添加注解

在DeptClientService中指定降级配置:DeptClientServiceFallBackFactory

package com.you.service;
import com.you.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Component
/*@FeignClient:value的值即为 服务的名字,fallbackFactory的值即为 实现FallbackFactory类的名字 */
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientFailBackFactory.class)
public interface DeptClientService {
    @GetMapping("/dept/aDept/{id}")
    public Dept getDeptOfId(@PathVariable("id") Long id);
}

4、修改application.yaml

为的是开启服务,但切记此处修改的application是springcloud-consumer-dept-feign下的application.yaml,添加如下代码

#开启降级 feign-hystrix
feign:
  hystrix:
    enabled: true

5、效果图

依次启动springcloud-eureka-7001、springcloud-consumer-dept-feign、springcloud-provider-dept-8001,访问服务

正确打开服务

现在,停掉这个springcloud-provider-dept-8001,模拟服务降级中暂时关闭的一些端口。

8001端口的服务被停掉了,这时候刷新页面。

端口是可以访问的,只是显示了我们设计的文字

四、DashBorder

1、新建一个module

新建一个名为springcloud-consumer-hystrix-dashborder的module

2、pom.xml配置

将springcloud-provider-dept-8001的依赖如复制过来,并且增加上dashborder的依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.you</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--引入Eureka的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入DashBorder-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <!--引入hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
    </dependencies>

3、配置application.yml

只需要配置端口号

server:
  port: 9001

4、配置启动类

创建一个名为DeptConsumerDashBorder_9001的JAVA类

package com.you;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumerDashBorder_9001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerDashBorder_9001.class,args);
    }
}

5、添加被监控的类

给springcloud-provider-dept-hystrix-8001模块下的主启动类添加如下代码,添加监控

package com.you;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
/*对熔断的支持*/
@EnableCircuitBreaker
public class DeptApplication_Hystrix_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptApplication_Hystrix_8001.class,args);
    }
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        //访问该页面就是监控页面
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        return registrationBean;
    }
}

6、效果图

启动springcloud-eureka-7001、springcloud-consumer-hystrix-dashborder、springcloud-provider-dept-hystrix-8001

在7001尤里卡界面,看到springcloud-provider-dept-hystrix-8001被注册进来。

访问8011,输入http://localhost:8011/dept/aDept/1(我设置的端口号是8011),可以看到被成功访问。

访问http://localhost:8011/actuator/hystrix.stream,看到如下效果

访问9001,地址输入http://localhost:9001/hystrix,看到如下界面

将地址填入,http://localhost:8011/actuator/hystrix.stream

刷新这个界面,下面的图像会随之变化

到此这篇关于SpringCloud hystrix服务降级学习笔记的文章就介绍到这了,更多相关SpringCloud hystrix内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud hystrix服务降级概念介绍

    目录 Hystrix 初识Hystrix Hystrix三大概念 服务降级(fallback) fallback是什么 服务提供方实现服务降级 服务调用方实现服务降级 服务降级优化 服务熔断(break) break是什么 服务提供方实现服务熔断 服务限流(flowlimit) flowlimit是什么 Hystrix图形化监控 Hystrix 初识Hystrix Hystrix是什么?   Java应用程序讲求“高内聚低耦合”,而spring cloud是一种微服务架构理念,将原来的一个应用程

  • springcloud使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这是怎么回事呢?打开后台的日志一看出现了一些RpcException和TimeOutException,原来是远程调用超时了,可能某个服务在请求的高发期访问数据库异常,IO阻塞,返回接口异常了.后来这个问题越来越频繁,如何解决这个棘手的问题呢? 一:Hystrix是什么? 1.1:基本解释 Hystr

  • SpringCloud hystrix断路器与局部降级全面介绍

    目录 服务降级 一.Hystrix的服务使用前的问题 1.ProductController 中方法异常和超时 2.访问查看效果 3.问题分析 二. 商品服务 Hystrix的 局部降级 1.降级配置 2.回调(兜底降级)方法 3.具体代码 4.主启动类激活Hstrix 5.进行测试 三. 订单服务 Hystrix的 局部降级 1.降级配置 2.回调(兜底降级)方法 3.具体代码 4.将商品服务中的超时时间为正常 5.主启动类激活Hstrix 6.进行测试 服务降级 服务压力剧增的时候,根据当前

  • springcloud 服务降级的实现方法

    1 .简介 什么是服务降级?当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作. 如果还是不理解,那么可以举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索.定时任务和详情等等.然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处

  • SpringCloud灾难性雪崩效应处理方法之降级实现流程详解

    目录 一.前言 二.代码实现 1.新建ApplicationServiceDemo 1.1配置pom.xml 1.2新建配置文件 1.3新建控制器 1.4新建启动类 2.新建DemoFallback 2.1编写pom.xml 2.2新建配置文件 2.3新建配置类 2.4新建service及实现类 2.5新建控制器 2.6新建启动类 2.7访问 3.测试降级 一.前言 解决服务雪崩效应,都是避免application client请求application service时,出现服务调用错误或网络

  • SpringCloud-Alibaba-Sentinel服务降级,热点限流,服务熔断

    前言: 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.一个服务常常会调用别的模块,可能是另外的一个远程服务.数据库,或者第三方 API 等.例如,支付的时候,可能需要远程调用银联提供的 API:查询某个商品的价格,可能需要进行数据库查询.然而,这个被依赖服务的稳定性是不能保证的.如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用 熔断策略 Sentin

  • SpringCloud Feign隔离与降级详细分析

    目录 序篇 FeignClient整合Sentinel 1.1 修改配置,开启sentinel功能 1.2 编写失败降级逻辑 1.3 总结 序篇 限流是一种预防措施,虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障. 而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了. 线程隔离:调用者在调用服务提供者时,给每个调用的请求分配独立线程池,出现故障时,最多消耗这个线程池内资源,避免把调用者的所有资源耗尽. 熔断降级:是在调用方这边加入断路器

  • 详解springcloud 基于feign的服务接口的统一hystrix降级处理

    springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个Feign服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味: Feign服务接口: @FeignClient(name="springcloud-nacos-producer", qualifier="productApiService", contextId="productApiService", fallb

  • SpringCloud hystrix服务降级学习笔记

    目录 一.Hystrix简介 1.Hystrix是什么 2.Hystrix能干什么 二.服务熔断 1.服务熔断简介 2.配置pom.xml 3.配置application.yaml 4.修改Controller 5.修改启动类 6.效果图 三.服务降级 1.什么是服务降级 2.DeptClientFailBackFactory类 3.添加注解 4.修改application.yaml 5.效果图 四.DashBorder 1.新建一个module 2.pom.xml配置 3.配置applicat

  • hystrix服务降级方法使用介绍

    当一个服务端的业务响应的时间过长的时候或者业务处理逻辑处理异常,不应该等待,应该给出一种处理方法 超时导致服务器变慢(转圈) --->超时不再等待 出错(宕机或程序运行出错) --->出错要有兜底 pom文件依赖 : <!--hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netf

  • Springcloud hystrix服务熔断和dashboard如何实现

    服务在经过一定负荷之后,如果达到一定上限之后会中断进行报错,而服务调用的方法也会报错等等,一旦整体服务停下,别的客户端再来访问就会无法调用.对此需要进行另外一种服务熔断模式. 不同于现实中的熔断保险丝,服务熔断是在系统服务达到一定错误之后,自动熔断降级,采取备用方法,但是在一定时间后客户端再次调用成功后,一定时间内成功率上去,系统的熔断机制会慢慢的关闭,恢复到正常请求的状态. 本篇接上一章直接改动. 1.主启动类加上新的注解. @EnableCircuitBreaker 2.service写入新

  • SpringCloud学习笔记之OpenFeign进行服务调用

    目录 前言 1.OpenFeign 1.1.OpenFeign概述 1.2.OpenFeign的使用步骤 1.3.超时控制 1.3.1.是什么? 1.3.2.修改代码设置超时错误 1.3.3.进行超时配置 1.4.日志打印 1.4.1.是什么? 1.4.2.日志级别 1.4.3.如何开启日志打印 总结 前言 Feign是一个声明式的Web服务客户端,是面向接口编程的.也就是说使用Feign,只需要创建一个接口并使用注解方式配置它,就可以完成对微服务提供方的接口绑定. 在使用RestTemplat

  • SpringCloud微服务之Hystrix组件实现服务熔断的方法

    一.熔断器简介 微服务架构特点就是多服务,多数据源,支撑系统应用.这样导致微服务之间存在依赖关系.如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应. 1.服务熔断 微服务架构中某个微服务发生故障时,要快速切断服务,提示用户,后续请求,不调用该服务,直接返回,释放资源,这就是服务熔断. 熔断生效后,会在指定的时间后调用请求来测试依赖是否恢复,依赖的应用恢复后关闭熔断. 2.服务降级 服务器高并发下,压力剧增的时候,根据当业务情况以及流量,对一些服务和页面有策略的降级(可以理解为关闭不必

  • SpringCloud学习笔记之SpringCloud搭建父工程的过程图解

    目录 SpringCloud和SpringBoot版本选择 更详细的版本选择 相关技术选型 创建工程 创建父工程 新建maven工程 配置父工程的pom文件 SpringCloud是分布式微服务架构的一站式解决方案,十多种微服务架构落地技术的集合体,俗称微服务全家桶 SpringCloud和SpringBoot版本选择 自2019年以后官方建议使用2.0以后的版本 官网地址 在官网的页首可以看到最新版本以及对应的springboot版本 在官网可以看到官方推荐的springcloud与sprin

  • SpringCloud学习笔记之Feign远程调用

    目录 前言 1.Feign替代RestTemplate 1.1 引入依赖 1.2 添加注释 1.3 编写Feign的客户端 1.4 测试 1.5 总结 2.自定义配置 2.1 配置文件方式 2.2 Java代码方式 3.Feign使用优化 4.最佳实践 4.1 继承方式 4.2 抽取方式 4.3 实现基于抽取的最佳实践 抽取 前言 为啥需要学Feign呢?我们先来回顾之前写的代码 先来看我们以前利用RestTemplate发起远程调用的代码: 这里就有几个问题: 代码可读性差,编程体验不统一 参

  • SpringCloud微服务熔断器Hystrix使用详解

    目录 什么是Hystrix Hystrix实战 总结 什么是Hystrix 在日常生活用电中,如果我们的电路中正确地安置了保险丝,那么在电压异常升高时,保险丝就会熔断以便切断电流,从而起到保护电路安全运行的作用. 在货船中,为了防止漏水和火灾的扩散,一般会将货仓进行分割,避免了一个货仓出事导致整艘船沉没的悲剧,这就是舱壁保护机制. Hystrix提供的熔断器也类似,在调用某个服务提供者时,当一定时间内请求总数超过配置的阈值,且窗口期内错误率过高,那Hystrix就会对调用请求熔断,后续的请求直接

随机推荐