返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloudhystrix服务降级学习笔记
  • 711
分享到

SpringCloudhystrix服务降级学习笔记

Python 官方文档:入门教程 => 点击学习

摘要

目录一、Hystrix简介1、Hystrix是什么2、Hystrix能干什么二、服务熔断1、服务熔断简介2、配置pom.xml3、配置application.yaml4、修改Cont

一、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 = "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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringCloudhystrix服务降级学习笔记

本文链接: https://lsjlt.com/news/170455.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringCloudhystrix服务降级学习笔记
    目录一、Hystrix简介1、Hystrix是什么2、Hystrix能干什么二、服务熔断1、服务熔断简介2、配置pom.xml3、配置application.yaml4、修改Cont...
    99+
    2022-11-13
    SpringCloud hystrix服务降级 SpringCloud hystrix SpringCloud 服务降级
  • SpringCloudhystrix服务降级概念介绍
    目录Hystrix初识HystrixHystrix三大概念服务降级(fallback)fallback是什么服务提供方实现服务降级服务调用方实现服务降级服务降级优化服务熔断(brea...
    99+
    2024-04-02
  • SpringCloudHystrix服务降级限流策略详解
    目录前言Hystrix简介Hystrix的使用服务降级system服务控制层System2调System降级场景服务熔断总结前言 前面说到在我们应对高并发的场景,请求量过于大的情况...
    99+
    2023-01-04
    Spring Cloud Hystrix 服务降级限流 Spring Cloud Hystrix
  • 学习笔记-TP5框架学习笔记\(路由\)
    TP5框架简单理解 (PS:只做粗略、关键知识的记录,TP程序的开始。详情请阅读官方手册) 1. 架构总览 TP程序的开始 PHP >=5.3.0, PHP7 ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方...
    99+
    2023-10-25
    学习 php 开发语言
  • Oracle数据库高级学习笔记
    学习Oracle数据库高级知识点笔记 Oracle 数据库高级 Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。 优点...
    99+
    2014-08-24
    Oracle数据库高级学习笔记
  • sqlite3 学习笔记
    #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @descrip : operate SqLite intrface # @Time : 2020/04/22 21:57 # @Au...
    99+
    2017-12-28
    sqlite3 学习笔记 数据库入门 数据库基础教程
  • 20200618_MySQL学习笔记
    加号 + Mysql中加号只能做运算符 select 100+90  ==> 190  select "100"+90 ==> 190  如果有一个是字符串,那么尝试转换成数值型,转换成功 select "ja...
    99+
    2014-11-26
    20200618_MySQL学习笔记
  • 20200619 学习笔记
    主键和唯一的区别 主键:唯一、不为空、只能有一个、可以组合但不推荐 唯一:唯一、可为空、可以多个、可以组合但不推荐 外键 要求在从表设置外键关系 从表的外键列的类型和主表的关联列的类型要求一致或兼容 主...
    99+
    2019-12-15
    20200619 学习笔记
  • 20200617学习笔记
    基数  一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好 我们可以使用 show index 方法,看到一个索引的基数 MySQL 是怎样得到索引的基数的呢? 采样...
    99+
    2022-02-22
    20200617学习笔记
  • 20200616学习笔记
    count(*) 的实现方式 在不同的 MySQL 引擎中,count(*) 有不同的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高 而 InnoDB ...
    99+
    2018-10-19
    20200616学习笔记
  • Mycat 学习笔记
    概述 1. Mycat 是什么? Mycat 是数据库中间件,连接 Java 应用程序和数据库,它的作用如下: 读写分离 数据分片:垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表) 多数据源整合 2....
    99+
    2019-10-05
    Mycat 学习笔记
  • postgres学习笔记
    将一个标识符变得受限同时也使它变成大小写敏感的,反之非受限名称总是被转换成小写形 式。例如,标识符FOO、foo和"foo"在PostgreSQL中被认为是相同的,而"Foo"和"FOO"则互 不相同且也不同于前面三个标识符(Postgr...
    99+
    2018-01-09
    postgres学习笔记
  • MySQL学习笔记
    作者: Grey 原文地址:MySQL学习笔记 说明 注:本文中的SQL语句如果用到了特定方言,都是基于MySQL数据库。 关于DDL DDL 的英文全称是 Data Definition Language,中文是数据定义语言。它定义了...
    99+
    2015-01-17
    MySQL学习笔记
  • Android学习笔记
    LinearLayoutCompat 线性布局 android:orientation=“vertical” 指定布局内控件排列方式为 垂直排...
    99+
    2022-06-06
    android学习 Android
  • AIDE 学习笔记
    参考:http://www.iamle.com/archives/1664.htmlAIDE的用法和tripwire类似。都是通过生成一份文件指纹的数据库,然后对比。所以,我们最好在刚安装完系统后,就安装这...
    99+
    2024-04-02
  • xtrabackup学习笔记
    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrab...
    99+
    2024-04-02
  • oracle学习笔记
    oracle安装1.         安装virtualbox:# yum install gcc kernel-devel ...
    99+
    2024-04-02
  • git 学习笔记
      Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。     ...
    99+
    2024-04-02
  • MySQL 学习笔记
    😀😀😀创作不易,各位看官点赞收藏. 文章目录 MySQL 学习笔记1、`DQL` 查询语句1.1、基本查询1.2、函数查询1.2.1、单行函数1...
    99+
    2023-10-01
    mysql 学习 笔记
  • Kafka 学习笔记
    😀😀😀创作不易,各位看官点赞收藏. 文章目录 Kafka 学习笔记1、消息队列 MQ2、Kafka 下载安装2.1、Zookeeper 方式启动2.2、KRaft 协议启动2.3...
    99+
    2023-08-30
    kafka 学习 笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作