Openfeign+Ribbon+Hystrix断路器(服务降级)

news2024/11/24 7:43:08

热部署对于Hystrix的热不是不是很明显  所以最好修改代码之后重启服务

简介

在微服务架构中存在多个可直接调用的服务,这些服务若在调用时出现故障会导致连锁效应,也就是可能让整个系统变得不可用,这种情况我们称之为服务雪崩效应.

服务雪崩效应通常发生在微服务架构中,当一个服务发生故障时,由于服务间的依赖关系,这个故障可能会导致依赖它的其他服务也跟着出现问题,从而形成连锁反应。例如,如果一个用户认证服务突然宕机,所有依赖这个认证服务来验证用户身份的服务都无法正常工作,最终导致整个系统变得不可用。这就好比一张网,当网中的一个节点被割断时,与这个节点直接连接的其他节点也会受到影响,进而可能影响整个网的稳定性。

Hystrix是一个用于处理分布式系统的延迟和容错的库,旨在隔离访问远程服务、第三方库,防止级联失败,提供回退机制以及近实时的监控。它能保护系统在某个服务失败时不会导致整个系统的瘫痪,通过断路器模式来实现。当某个服务的失败率超过一定阈值时,Hystrix会自动切断调用,防止这个故障扩散到其他服务。除Hystrix外,相似功能的有Resilience4j、Sentinel等。Hystrix目前已进入维护模式,Netflix推荐使用Resilience4j作为替代。

“维护模式”意味着Hystrix已经停止了主动开发,不再添加新功能。它只接受必要的安全更新或错误修复。这种状态通常会导致推荐使用新的、活跃开发的替代品用于生产环境。

总体而言:为了避免级联故障蔓延,导致服务雪崩,一种提高分布式弹性的,高可用自救措施

作用:1.服务降级         2服务熔断        3接近实时的监控.

服务降级   fallback   对方系统不可用了,你需要给我一个兜底的解决办法

哪些情况会发出降级:

1.程序运行异常

2.超时

3.服务熔断触发服务降级

4.线程池/信号量打满也会导致服务降级

服务熔断(服务降级的升级版本哈哈哈)   break  好比保险丝,达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法再返回友好提示兜底

服务限流   flowlimit   秒杀高并发等操作,严禁一窝蜂的拥挤,大家排队,一秒钟N个,有序进行

看样子都是自救措施  需要采取诸如服务降级、熔断、限流等自救措施来防止雪崩效应的发生。

https://github.com/Netflix/Hystrix/wikiicon-default.png?t=N7T8https://github.com/Netflix/Hystrix/wiki

构建Cloud

父项目只做依赖版本管理,不引入依赖

pom.xml

  <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>cloud</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.2.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

构建生产者模块

pom.xml

hystrix依赖

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

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zookeeper-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

application.yml

server:
  port: 8081

spring:
  application:
    name: cloud-provider-hystrix-payment
  cloud:
    zookeeper:
      connect-string: 222.22.22.22:2181

业务类

启动类

测试

localhost:8081/pay/hystrix/ok/1

下面稍微慢点

两个接口都OK

IP:8888//commands/stat   

用JMeter压测

Apache JMeter - Apache JMeter™icon-default.png?t=N7T8https://jmeter.apache.org/

解压之后  bin

不知为何重影很卡  下面有解决方式

可以看到  当大规模并发打进来的时候

后端出现明显卡顿

JMeter重影问题

在高分辨率显示器上使用 JMeter 时出现重影或界面显示不清晰的问题,通常是由于 Java 应用程序在高 DPI 设置下的缩放问题导致的。这个问题比较常见于4K或更高分辨率的显示器,尤其是在Windows系统上。以下是一些可能帮助解决这个问题的解决方案:

在bin目录下创建 setenv.bat文件

编辑

@echo off
rem Set custom JVM arguments for JMeter

rem Disable DirectDraw to potentially fix high DPI rendering issues
set JVM_ARGS=-Dsun.java2d.noddraw=true

rem Optionally, you can add more JVM arguments here
rem For example, to disable DirectDraw offscreen surfaces acceleration
rem set JVM_ARGS=%JVM_ARGS% -Dsun.java2d.ddoffscreen=false

rem To enable hardware-accelerated scaling
rem set JVM_ARGS=%JVM_ARGS% -Dsun.java2d.ddscale=true

rem Set the maximum heap size and other memory settings if needed
rem set JVM_ARGS=%JVM_ARGS% -Xmx1g -Xms256m
 

构建消费者模块

pom.xml    openfeign带有Ribbon依赖

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

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zookeeper-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

启动类 因要使用openfeign

添加@EnableFeignClients

业务类

application.yml

server:
  port: 80

spring:
  application:
    name: cloud-consumer-hystrix-order
  cloud:
    zookeeper:
      connect-string: 222.2222.222.22:2181
ribbon:
  #指定建立连接所用时间
  ReadTimeout: 8000
  #读取可用资源时间
  ConnectTimeout: 8000

如果此时用JMeter对8081测压   那么80生产者这边肯定也会出现卡顿或者报错现象

我设置了消费者的调用限时8秒     生产者那边超时时间我设置了15秒  必定报错  但是报错体验更定不好   来个兜底方法

生产者模块改造

注意  我们设置了消费者调用时间是 8秒

也是可以使用的

那么以上是在生产者做服务降低处理的保护

消费者端也可以做服务降低保护处理

application.yml

客户端启动类

生产者这边 我将服务降级代码 注释掉      

全局服务降级

每个业务方法对应一个兜底方法,代码混乱,应该统一和自定义分开

Global fallback

另外一种  

可以在openfeign调用的接口去定义

在生产者  我故意让代码报错

消费者

控制器

openfeign调用接口

实现类

概述

以上就是服务降级 程序运行异常,超时,服务熔断触发服务降级,线程池/信号量打满也会导致服务降级

服务熔断

熔断机制是应对服务雪崩效应的一种微服务链路保护机制,当某个微服务出错不可用或响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用

当检测到该节点微服务调用响应正常之后,恢复调用的链路

Hystrix可以实现SpringCloud中的熔断机制.当失败的调用达到一定阈值,默认是5秒内20次调用失败,就会启动熔断机制.熔断机制的注解是@HystrixCommand.

服务熔断的过程:服务降级->进而熔断->恢复链路

在生产者业务层   意思id正数  正常     id负数 就进入服务降级的方法

 //服务熔断
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),   //请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),  //时间范围
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(@PathVariable("id") Integer id){
        if (id < 0){
            throw new RuntimeException("*****id 不能负数");
        }
        String serialNumber = UUID.randomUUID().toString().replace("-", "");

        return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
    }
    public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
        return "id 不能负数,请稍候再试,(┬_┬)/~~     id: " +id;
    }

生产者Controller

如果我现在调用  负数  达到峰值 多次调用之后  即使我输入的数是正确的  还是到了错误的方式

这个就是服务熔断   然后慢慢恢复

限流 不会

服务监控HystrixDashboard

仪表盘,图形化监控

application.yml

pom.xml

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


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

在生产者配置

@Bean
public ServletRegistrationBean getServlet(){
    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
    registrationBean.setLoadOnStartup(1);
    registrationBean.addUrlMappings("/hystrix.stream");
    registrationBean.setName("HystrixMetricsStreamServlet");
    return registrationBean;
}

localhost:9001/hystrix

访问生产者接口

我这边都没引入

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1493755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控

作者&#xff1a;古琦 在现代软件架构中&#xff0c;微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能&#xff0c;它们共同工作以提供完整的服务。由于微服务架构的分散特性&#xff0c;监控变得至关重要&#xff0c;有效的微服务监控是…

缺陷检测:使用PatchCore训练自己的数据集

文章目录 前期准备两种方法 演示运行结果 代码详解见缺陷检测–PatchCore的代码解读 前期准备 必须包含有训练图片&#xff08;无缺陷图片&#xff09;、测试图片&#xff08;缺陷图片&#xff09;和ground_truth&#xff0c;并且ground_truth必须与对应图片的名称相同。 本文…

python_读取txt文件绘制多条曲线II

从给定的列表中来匹配txt文件对应列的数据&#xff1b; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"] ["SimHei"] # 设置显示中文字体 mpl.rcParams["axes.un…

STM32用标准库做定时器定时1秒更新OLED的计数值(Proteus仿真)

首先新建proteus工程&#xff0c;绘制电路图&#xff1a; 然后赋值我之前文章中提到的文件夹OLED屏幕显示&#xff1a;&#xff08;没有的自己去那篇文章下载去&#xff09; 然后进入文件夹&#xff1a; 新建两个文件在Mycode文件夹中&#xff1a; 文件关系如下&#xff1a; 新…

lowcode-engine接入编辑器

https://lowcode-engine.cn/site/docs/guide/create/useEditor 方案1 pnpm init pnpm add "alilc/create-elementlatest"pnpm create "alilc/element" editor-project-name选择编辑器 进入执行pnpm install命令安装包 pnpm start报错 pnpm add &qu…

springboot-异步、定时、邮件任务

一、异步任务 1、创建项目 2、创建一个service包 3、创建一个类AsyncService 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff…

高校的虚拟仿真实训室为何要创建数字人实训室?

随着教育信息化、数字化的不断发展&#xff0c;虚拟仿真实训室不再仅限于vr虚拟仿真实训室&#xff0c;数字人实训室也逐步应用于教育领域。 高校虚拟仿真实训室创建数字人实训室课堂&#xff0c;具有两大作用&#xff1a; 1.获得隐形实践知识 在虚拟仿真实训室环境下&#xf…

2024Java开发现状分析,字节java面试题

1. 前言 最近面试了几家公司&#xff0c;体验了一下电话面试和今年刚火起来的视频面试&#xff0c; 虽然之前就有一些公司会先通过电话面试的形式先评估下候选人的能力水平&#xff0c;但好像不多&#xff0c;至少我以前的面试形式100%都是现场面试。 面试过程中&#xff0c…

QT和OPENGL安装和集成

1.QT安装 1.1官网下载&#xff1a; 网址&#xff1a;https://download.qt.io/archive/qt/ 1.2 开始安装 点击运行 首先注册sign up 然后Login in 选择安装目录 改为D盘&#xff1a; 选择安装项&#xff1a; 准备安装 开始安装&#xff1a; 安装完成&#xff1a; 1.3测试 …

小白如何选择阿里云服务器配置?小白不怕

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月

第十五届蓝桥杯青少组STEMA测评SPIKE初级真题试卷 2024年1月 ​​​​​​​ 来自&#xff1a;6547网 http://www.6547.cn/doc/vywur8eics

2024年政府工作报告,这些重点网安人应格外注意!

2024年政府工作报告&#xff0c;制定支持数字经济高质量发展政策&#xff0c;积极推进数字产业化、产业数字化&#xff0c;促进数字技术和实体经济深度融合。深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;打造具有国际竞争力的数字产业集群。作…

算法沉淀——贪心算法一(leetcode真题剖析)

算法沉淀——贪心算法一 01.柠檬水找零02.将数组和减半的最少操作次数03.最大数04.摆动序列 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的优化算法&#xff0c;它通常用于求解最优化问题&#xff0c;每一步都选择当前状态下的最优解&#xff0c;以期…

如何提取二维码的链接?快速获取二维码链接的方法

如何提取二维码的链接&#xff1f;现在生活中有各种各样的二维码图片&#xff0c;扫码后可以展示不同内容&#xff0c;比如文本、音频、视频、文件、图片等等&#xff0c;都可以制作二维码图片来展示。但是在某些特殊情况下&#xff0c;需要将二维码转链接之后&#xff0c;通过…

使用Python访问Phoenix

需求分析 理解Phoenix的原理及应用场景&#xff0c;理解Thrift的原理及操作&#xff0c;掌握Python如何访问操作HBase。 系统实现 实验流程分析&#xff1a; 开启HBase集群 在Phoenix上创建表 启动Thrift服务 实现Python访问HBase 关闭启动的服务 开启HBase集群&#…

【软考高项】【论文专题】- 3 - 论文写作方法

目录 1、 论文构思 2、 论文背景 论点 收尾的写作 2.1 一般正文的布局 2.2 论文结构 2.2.1 结构一&#xff1a;万能通用结构 2.2.2 结构二 2.2.3 结构三 2.3 论文内容写作 2.3.1 撰写项目背景 2.3.2 撰写理论知识点应用 2.2.3 撰写经验总结(项目收尾部分) 2.3 撰…

FPGA 的 DSP:Verilog 中的简单 FIR 滤波器

本项目介绍如何用 Verilog 实现一个带有预生成系数的简单 FIR 滤波器。 Things used in this project 、 Story 简陋的 FIR 滤波器是 FPGA 数字信号处理中最基本的构建模块之一&#xff0c;因此了解如何利用给定的抽头数和相应的系数值组装一个基本模块非常重要。因此&#xf…

学生信息管理展示-h5版(uniapp+springboot+vue)

记录一下做的第一个完整的h5业务。 一、登录 二、个人中心 三、首页&#xff08;管理员&#xff09; 四、首页&#xff08;学生&#xff09; 五、视频展示 学生信息管理展示&#xff08;h5&#xff09;完整版

算法刷题day22:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法&#xff0c;主要是用来处理枚举子区间的事&#xff0c;时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PanGesture)

拖动手势事件&#xff0c;当滑动的最小距离超过设定的最小值时触发拖动手势事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 PanGesture(value?: { fingers?: number; direction?: PanDir…