springCould中的Hystrix【上】-从小白开始【7】

目录

1.简单介绍❤️❤️❤️

2.主要功能 ❤️❤️❤️

3.正确案例❤️❤️❤️

4.使用jmeter压测 ❤️❤️❤️

5.建模块 80❤️❤️❤️

6.如何解决上面问题 ❤️❤️❤️

7.对8001进行服务降级❤️❤️❤️

8.对80进行服务降级 ❤️❤️❤️

9.通用降级方法❤️❤️❤️

10.在Feign接口实现降级 ❤️❤️❤️


1.简单介绍❤️❤️❤️

Hystrix是一个用于处理分布式系统延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

2.主要功能 ❤️❤️❤️

  • 服务隔离:通过将不同的依赖服务调用分配给不同的线程池来隔离服务之间的调用,防止一个服务的故障导致整个系统的崩溃。
  • 服务降级当依赖服务出现延迟故障Hystrix可以提供一个备用的响应,避免用户等待超时或出现错误。
  • 服务熔断Hystrix可以根据依赖服务的错误率和延迟来决定是否打开断路器,当断路器打开时所有的请求将直接返回,避免对依赖服务的继续调用。
  • 服务限流Hystrix可以限制对依赖服务的并发调用数量,避免因过多的请求导致依赖服务的崩溃。
  • 实时监控和报警:Hystrix提供了实时的监控仪表盘,可以监控依赖服务的调用情况和错误率,并提供报警机制。

3.正确案例❤️❤️❤️

1.建模块

在父工程下创建,注意jdk和maven版本

2.写pom

1.springboot依赖

2.mysql依赖

3.mybatis依赖

4.eureka依赖

5.hystrix依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</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>

        <!--引入自己的api-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--eureka的client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

3.写yml

1.服务端口

2.服务名称

3.数据库连接池

4.mybatis配置

5.入住到服务注册中心(eureka)

server:
  port: 8001

spring:
  application:
    name: cloud-provider-hystrix-payment
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud
    username: root
    password: 123456
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.xz.springcloud.entity

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka


4.主启动类

@SpringBootApplication
@EnableEurekaClient
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class);
    }
}

5.编写业务

创建两个方法:

1.正常方法没有延迟

2.错误方法有延时,Thread.sleep()模拟程序执行时间

@RestController
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;


    @GetMapping("/payment/hystrix/ok/{id}")
    public CommonResult paymentInfo_Ok(@PathVariable("id") Integer id) {
        Payment result = paymentService.getById_Ok(id);
        if (result != null) {
            return new CommonResult(200, "查寻成功,端口:" + serverPort+",线程池:"+Thread.currentThread().getName(), result);
        } else {
            return new CommonResult(404, "查询失败,端口:" + serverPort+",线程池:"+Thread.currentThread().getName());
        }
    }

    @GetMapping("/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id) throws InterruptedException {
        int timeOut = 3;
        Payment result = paymentService.getById_TimeOut(id);
        if (result != null) {
            TimeUnit.SECONDS.sleep(3);
            return new CommonResult(200, "查寻成功,端口:"+ serverPort+",线程池:"+Thread.currentThread().getName()  + ",超时时间:" + timeOut, result);
        } else {
            return new CommonResult(404, "查询失败,端口:"+ serverPort+",线程池:"+Thread.currentThread().getName()  + ",超时时间:" + timeOut);
        }
    }
}

 6.测试:

1.paymentInfo_ok,没有延迟,直接查询到

2.paymentInfo_TimeOut,有延迟,三秒后查询到

4.使用jmeter压测 ❤️❤️❤️

  • 1.创建线程组-取样器-HTTP请求

  • 2.设置压测数据 

 

  • 3.启动压测,同时刷新正常的请求Ok 

 

发现之前没有设置延迟的接口,访问时也变得十分缓慢。。。 

原因:tomcat的默认的工作线程数被打满了,没有多余的线程来分解压力和处理。

这就导致,我们访问同一服务下的其他接口地址也变得缓慢

5.建模块 80❤️❤️❤️

1.建模块

在父工程下创建,注意jdk版本和maven版本

2.写pom

1.springboot依赖

2.通用依赖

3.eureka依赖

4.OpenFeign依赖

5.Hystri依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--eureka的Client端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

3.加yml

1.服务端口

2.入住eureka配置信息

server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

4.主启动

使用OpenFeign,添加@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
public class OrderHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class);
    }

}

5.@FeignClient接口

1.使用@Component,交给spring管理

2.添加@FeignClient(value="要访问服务的名称")

3.要访问服务的哪个接口

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {

    @GetMapping("/payment/hystrix/ok/{id}")
    public CommonResult paymentInfo_Ok(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id);

}

6.编写业务

@RestController
public class OrderHystrixController {

    @Autowired
    private PaymentHystrixService paymentHystrixService;


    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public CommonResult paymentInfo_Ok(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_Ok(id);
    }

    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
}

7.压测

当正常访问ok方法时,浏览器返回基本是刹那间

当我们压测timeout方法时,再去使用80访问ok方法,结果发现直接返回错误页面。

8001同一层次的其它接口服务被困死,因为tomcat线程池里面的工作线程已经被挤占完毕

6.如何解决上面问题 ❤️❤️❤️

  • 对方服务(8001)超时了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)down机了,调用者(80)不能一直卡死等待,必须有服务降级
  • 对方服务(8001)OK,调用者(80)自己出故障或有自我要求(自己的等待时间小于服务提供者)自己处理降级

7.对8001进行服务降级❤️❤️❤️

1.添加@HystrixCommand注解

属性:

1.fallbackMethod:当超时后,要返回的兜底方法

2.@HystrixProperty:设置多少秒没有响应,返回兜底方法

@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    @GetMapping("/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id) throws InterruptedException {

        int timeOut = 5;
        Payment result = paymentService.getById_TimeOut(id);
        if (result != null) {
            TimeUnit.SECONDS.sleep(3);
            return new CommonResult(200, "查寻成功,端口:"+ serverPort+",线程池:"+Thread.currentThread().getName()  + ",超时时间:" + timeOut, result);
        } else {
            return new CommonResult(404, "查询失败,端口:"+ serverPort+",线程池:"+Thread.currentThread().getName()  + ",超时时间:" + timeOut);
        }
    }

2.创建兜底方法

  public CommonResult paymentInfo_TimeOutHandler(@PathVariable("id") Integer id){
        Payment result = paymentService.getById_TimeOut(id);
        if (result != null) {
            return new CommonResult(200, "系统繁忙!稍后重试~");
        } else {
            return new CommonResult(404, "备用~查询失败,端口:" + serverPort+",线程池:"+Thread.currentThread().getName());
        }
    }

3.主启动类添加@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixMain8001.class);
    }
}

4.测试

1.当调用的接口超时,返回兜底数据

2.放调用的接口中存在运行时错误,也会返回兜底数据

8.对80进行服务降级 ❤️❤️❤️

1.改yml

启用Hystrix作为Feign的断路器

feign:
  hystrix:
    enabled: true

2.添加@HystrixCommand注解 

   @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }

3.创建兜底方法

注意方法的返回值类型必须原方法一致!

 public CommonResult  paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
        return new CommonResult(200,"我是消费80,系统繁忙,稍后重试~");
    }

4.主启动添加@Enablehystrix

@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderHystrixMain80.class);
    }

}

5.测试

1.当使用feign调用的方法超时,返回兜底数据

2.当feign调用的方法存在运行时错误,返回兜底数据

9.通用降级方法❤️❤️❤️

1.问题

配置降级服务时,每个方法都要有降级的方法。显然代码膨胀,不好管理

 @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
           @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
    })

2.解决(@DefaultProperties

使用@DefaultProperties(defaultFallback="全局降级的方法")

需要服务降级的方法,仍需要添加@HystrixCommand

@RestController
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {

    @HystrixCommand
    @GetMapping("/consumer/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_TimeOut(id);
    }
   //全局fallback
    public CommonResult payment_Global_FallbackMethod(){
        return new CommonResult(200,"全局配置处理,系统繁忙,稍后重试");
    }

}

3.测试

10.在Feign接口实现降级❤️❤️❤️ 

1.改yml

启用Hystrix作为Feign的断路器

feign:
  hystrix:
    enabled: true

2.创建实现Feign接口类

1.创建一个类,实现有@FeignClient标记的接口

2.添加@Component注解,交给spring管理

@Component
public class PaymentFallbackService implements PaymentHystrixService{
    @Override
    public CommonResult paymentInfo_Ok(Integer id) {
        return new CommonResult(200,"payment_ok,系统繁忙,稍后重试~");
    }

    @Override
    public CommonResult paymentInfo_TimeOut(Integer id) {
        return new CommonResult(200,"payment_TimeOut,系统繁忙,稍后重试~");
    }
}

3.在@FeignClien中添加属性:fallback

fallback:返回的兜底类(实现当前接口的类)

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {

    @GetMapping("/payment/hystrix/ok/{id}")
    public CommonResult paymentInfo_Ok(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    public CommonResult paymentInfo_TimeOut(@PathVariable("id") Integer id);

}

4.测试

当服务8001宕机之后,访问正常接口ok时,返回兜底数据

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据中台建设之路

数据中台是在政企数字化转型过程中&#xff0c;对各业务单元业务与数据的沉淀&#xff0c;构建包括数据技术、数据治理、数据运营等数据建设、管理、使用体系&#xff0c;实现数据赋能。数据中台&#xff0c;是新型信息化应用框架体系中的核心。 1、什么是数据中台 随着企业数…

被客户骂咋办?客服请看这些处理方式

客户骂人的常见类型 1.没来得及回复就辱骂 绝大多数客户都非常反感机器人自动回复。但人工回复需要一定的回复时间&#xff0c;如果自己打字速度不快&#xff0c;则建议搭配使用快捷回复软件(客服宝) 2.说我们服务态度不好 回复上可以多加一些感叹后缀词&#xff0c;如“好…

【GO语言卵细胞级别教程】01.GO基础知识

01.GO基础知识 目录 01.GO基础知识1.GO语言的发展历程2.发展历程3.Windowns安装4.VSCode配置5.基础语法5.1 第一段代码5.2 GO执行的流程5.3 语法规则5.4 代码风格5.5 学习网址 1.GO语言的发展历程 Go语言是谷歌公司于2007年开始开发的一种编程语言&#xff0c;由Robert Griese…

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…

洛谷P1024[NOIP2001 提高组] 一元三次方程求解(cpp)(二分查找)

目录 1.题目 2.思路 3.AC 1.题目 # [NOIP2001 提高组] 一元三次方程求解 ## 题目描述 有形如&#xff1a; 这样的一个一元三次方程。给出该方程中各项的系数&#xff08;a,b,c,d 均为实数&#xff09;&#xff0c;并约定该方程存在三个不同实根&#xff08;根的范围在 -…

【每日论文阅读】单目深度估计 近期进展

红外场景单目深度估计的难点 缺乏准确的深度参考标准&#xff1a;红外场景下的深度估计通常需要依赖于大量的输入图像和对应的深度值作为训练的约束。然而&#xff0c;获取准确的深度参考标准是一个挑战&#xff0c;目前常用的方法是使用红外传感器&#xff08;如Kinect&#…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

prometheus grafana redis安装配置监控

文章目录 前传安装redis-exporterredis_exporter参数配置参考配置prometheus查看promethues redis job节点grafana配置外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx&#xff0c;promethe…

T40N 君正智能处理器T40 BGA 芯片

T40N是一款智能视频应用处理器&#xff0c;适用于移动摄像机、安防等视频设备调查、视频聊天、视频分析等。该SoC引入了一种创新的体系结构满足高性能计算和高质量图像和视频编码的要求通过视频设备解决。T40N提供高速CPU计算能力&#xff0c;出色的图像信号过程中&#xff0c;…

Linux第5步_测试虚拟机网络连接

安装好VMwareTools后&#xff0c;就可以测试虚拟机网络连接了&#xff0c;目的是实现虚拟机上网。 1、打开“控制面板”&#xff0c;得到下图&#xff1a; 2、双击“网络和 Internet” &#xff0c;得到下图&#xff1a; 3、双击“网络和共享中心” 4、点击“更改适配器设置”…

云消息队列 Kafka 版生态谈第一期:无代码转储能力介绍

作者&#xff1a;娜米 云消息队列 Kafka 版为什么需要做无代码转储 云消息队列 Kafka 版本身是一个分布式流处理平台&#xff0c;具有高吞吐量、低延迟和可扩展性等特性。它被广泛应用于实时数据处理和流式数据传输的场景。然而&#xff0c;为了将云消息队列 Kafka 版与其他数…

UG/NX许可证使用效率提升新技术

UG/NX许可证使用效率提升新技术 UG&#xff08;Unigraphics NX&#xff09;是Siemens PLM Software公司出品的一个产品工程解决方案&#xff0c;它为用户的产品设计及加工过程提供了数字化造型和验证手段。近年来随着国家对知识产品保护的不断加强&#xff0c;以前使用盗版软件…

protobuf使用

Protocol Buffer是google于2008推出的一种数据交换的格式&#xff0c;它独立于语言&#xff0c;独立于平台。 google 提供了多种语言的实现&#xff0c;每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式&#xff0c;比使用 xml 和 json 进行数据交换快…

Excel技巧之【如何修改密码】

我们知道&#xff0c;Excel可以设置多种密码来保护文件&#xff0c;那想要修改密码&#xff0c;要如何操作呢&#xff1f;下面小编来分享一下Excel常用的3种密码的修改方法&#xff0c;一起来看看吧&#xff01; 1. “打开密码” 想要修改Excel表格的“打开密码”&#xff0c…

网络安全|2024年需要重点关注的10种DNS攻击类型

目前&#xff0c;针对域名系统&#xff08;DNS&#xff09;的攻击已经成为企业组织数字化发展中的一个严重问题&#xff0c;每年都有数千个网站成为此类攻击的受害者。据最近的研究数据显示&#xff0c;2023年企业组织与DNS攻击相关的损失同比增加了49%&#xff0c;这些损失不仅…

行业模型与场景落地新样本,网易有道发布多款“子曰”教育大模型落地应用与产品

距离2023年7月正式发布教育大模型“子曰”不到半年时间&#xff0c;教育科技公司网易有道近日再次分享了“子曰”教育大模型创新和落地成果&#xff0c;宣布推出国内首个教育大模型“子曰”2.0版本&#xff0c;同时还发布了基于大模型研发的三大创新应用——AI家庭教师“小P老师…

苗情生态自动监测系统-科普知识

随着科技的飞速发展&#xff0c;智能化技术在各个领域的应用越来越广泛。在农业领域&#xff0c;苗情生态自动监测系统的出现&#xff0c;为农业生产带来了革命性的变革。它不仅能够实时监测植物的生长状况&#xff0c;还能对环境因素进行全面监控&#xff0c;为农业生产提供科…

SSL证书多少钱一年

SSL证书的价格跟证书的种类&#xff0c;品牌都有很大关系。有些厂商是可以提供免费的SSL证书的&#xff0c;但是大部分证书仍然是收费项目。 永久免费SSL证书_永久免费https证书_永久免费ssl证书申请-JoySSL 1. 单域名SSL证书&#xff1a; - 功能&#xff1a; 适用于保护单…

Apollo开放平台概览 :自动驾驶的未来趋势

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

APP上线前需要通过哪些测试?如何获取专业的APP测试报告

互联网信息时代&#xff0c;人们最离不开的就是手机&#xff0c;而手机里面吸引我们的也就是APP软件里各式各样好玩的。但一款APP要想在竞争激烈的市场上留存下来&#xff0c;上线前的软件测试就必不可少&#xff0c;那么APP上线前需要通过哪些测试呢?又该如何获取专业的APP测…