spring cloud搭建(hystrix)

news2024/7/4 4:48:13

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

spring cloud搭建(hystrix)

  • 一、Hystrix
    • 1. Hystrix概念
    • 2. 服务雪崩
    • 3. 服务熔断
    • 4. 服务降级
    • 5. Hytrix的作用:
  • 二、开发环境
  • 三、Hystrix的应用
    • 1. 服务提供者熔断器的使用
      • 1.1 hystrix依赖
      • 1.2 请求控制类加注解配置
      • 1.3 开启熔断功能
      • 1.4 测试熔断功能
    • 2. 服务调用者熔断器的使用
      • 2.1 hystrix依赖
      • 2.2 配置文件
      • 2.3 请求控制类加注解配置
      • 2.4 开启熔断器功能
      • 2.5 测试熔断功能


spring cloud 相关组件搭建(建议顺序):

  • eureka(注册中心服务)spring cloud搭建(eureka)
  • P-C service(服务提供者和服务调用者)spring cloud搭建(P-C service)
  • feign(接口调用)spring cloud搭建(feign)
  • hystrix(熔断器)本篇
  • zuul(网关服务)spring cloud搭建(zuul)

注:本篇基于前三篇编写


一、Hystrix

1. Hystrix概念

Hystrix是一种实现服务熔断的机制,当某个服务不可用时可以阻断故障传播。
说到hystrix需要先了解以下几个概念。

2. 服务雪崩

在微服务中各个服务互相调用时,某一个服务出现故障导致多个服务出现故障继而导致整个系统故障。
解决服务雪崩的方式有两种,服务熔断和服务降级。

3. 服务熔断

服务出现不可用或响应超时时,为防止服务雪崩,暂停对该服务的调用,直接返回一个结果,释放资源。
检测到服务恢复后再继续对服务调用。

4. 服务降级

防止核心业务负荷过载或响应过慢,对非核心服务进行降级,暂时关闭或延迟使用非核心服务,保证核心服务正常有效运行。

5. Hytrix的作用:

Hystrix监控服务之间的调用情况,连续调用多次失败时进行熔断保护,此时会开启熔断机制,返回一个开发者设置的退路信息。
Hystrix会定期检查故障服务,若故障恢复则可继续使用服务。


二、开发环境

JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.7.3 springboot搭建传送门spring cloud 版本为 2021.0.5

三、Hystrix的应用

使用前请参考前三篇整合eureka、服务提供者service1、服务调用者service2

1. 服务提供者熔断器的使用

这里以service1服务为例使用熔断器,熔断器的使用分两步,引入熔断器依赖,配置文件开启参数(这一步这里不需要配置,在远程调用时的服务调用者service2中配置),请求控制类的方法上使用注解配置熔断参数,服务启动类添加注解开启。

1.1 hystrix依赖

service1服务的pom.xml中引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring_cloud_demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring_cloud_service1</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
            <version>2.2.10.RELEASE</version>
        </dependency>
    </dependencies>

</project>

1.2 请求控制类加注解配置

在请求方法上添加注解,配置参数,这里将方法睡眠3秒,熔断配置的参数为2秒
然后编写fallbackMethod对应的返回函数,返回自己设置的结果

package com.service1.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.service1.service.Impl.Service1ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * @ClassDescription: crud请求控制类
 * @Author:李白
 * @Date:2023/5/31 17:07
 */
@RestController
@RequestMapping("/crud")
public class Service1Controller {

    @Autowired
    Service1ServiceImpl service1ServiceImpl;

    @PostMapping
    @HystrixCommand(fallbackMethod = "TimeOutCondition", commandProperties = {
            //超过2秒,服务熔断,返回指定方法中的值
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000")
    })
    public String addInfo() {

        try {
            //睡眠3秒
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        return service1ServiceImpl.addInfo();
    }

    @DeleteMapping
    public String remove(){
        return service1ServiceImpl.removeInfo();
    }

    @PutMapping
    public String change(){
        return service1ServiceImpl.changeInfo();
    }

    @GetMapping
    public String search(){
        return service1ServiceImpl.searchInfo();
    }


    /**
     * 熔断调用函数
     * @return
     */
    public String TimeOutCondition(){
        return "远程调用失败-超时2秒";
    }

}

1.3 开启熔断功能

在service1服务的启动类上添加@EnableHystrix注解开启熔断功能

package com.service1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

/**
 * @ClassDescription: 服务1启动项
 * @Author:李白
 * @Date:2023/5/31 14:46
 */
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
public class Service1Application {
    public static void main(String[] args) {
        SpringApplication.run(Service1Application.class, args);
    }
}

1.4 测试熔断功能

启动service1服务,postman请求接口调用
由于请求响应时间3秒超出了熔断的时间2秒,在请求执行2秒时即返回熔断结果
在这里插入图片描述

2. 服务调用者熔断器的使用

这里以service2服务为例使用熔断器,分两步,引入熔断器依赖,配置文件开启参数,请求控制类的方法上使用注解配置熔断参数,服务启动类添加注解开启。

2.1 hystrix依赖

service2服务的pom.xml中引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring_cloud_demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring_cloud_service2</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <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>
            <version>2.2.10.RELEASE</version>
        </dependency>
    </dependencies>

</project>

2.2 配置文件

service2服务中的配置文件中添加hystrix参数,开启hystrix
不在yml中配置hystrix参数功能也可正常使用,这一步可以忽略
这里是和服务提供者service1不同的地方,service1服务提供者不需要配置
service1是服务的提供者 service2是服务的调用者
application.yml

server:
  port: 8003

spring:
  application:
    name: Service2-app

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

#Feign,这里应该是默认开启,因为这里不写,功能也正常用
#feign:
#  hystrix:
#    #开启熔断器
#    enabled: true

2.3 请求控制类加注解配置

在想要熔断的请求方法上添加@HystrixCommand注解,配置参数

  • fallbackMethod参数值为熔断返回结果的方法名字符串
  • commandProperties参数为花括号抱起来的注解@HystrixProperty
  • @HystrixProperty注解的参数以键值对存在键为name值为value
  • "TimeOutCondition"是熔断结果返回的函数,自己创建设置返回值
  • "execution.isolation.thread.timeoutInMilliseconds"是指请求超时多少秒进行熔断
  • "2000"是指2秒

Service2Controller.java

package com.service2.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.service2.service.Service2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassDescription: 请求控制类(service2)
 * @Author:李白
 * @Date:2023/5/31 18:42
 */
@RestController
@RequestMapping("/caller")
public class Service2Controller {

    @Autowired
    Service2Service service2Service;

    @PostMapping
    @HystrixCommand(fallbackMethod = "TimeOutCondition", commandProperties = {
            //超过1秒,服务熔断,返回指定方法中的值
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000")
    })
    public String addInfo(){
        return service2Service.addInfo();
    }

    @DeleteMapping
    public String remove(){
        return service2Service.removeInfo();
    }

    @PutMapping
    public String change(){
        return service2Service.changeInfo();
    }

    @GetMapping
    public String search(){
        return service2Service.searchInfo();
    }

    /**
     * 熔断调用函数
     * @return
     */
    public String TimeOutCondition(){
        return "远程调用失败-超时1秒";
    }

}

2.4 开启熔断器功能

在service2的启动类上添加注解开启熔断器

package com.service2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @ClassDescription: 服务2启动项
 * 注解@EnableFeignClients开启feign功能,也可以添加参数,basePackages的值可指定使用该功能的接口所在包
 * 注解@EnableHystrix开启熔断器 也可用@EnableCircuitBreaker开启熔断器,不过后者现在已被弃用
 * @Author:李白
 * @Date:2023/5/31 14:51
 */
@EnableEurekaClient
@SpringBootApplication
//@EnableFeignClients(basePackages = "com.service2.service")
@EnableFeignClients
@EnableHystrix
public class Service2Application {
    public static void main(String[] args) {
        SpringApplication.run(Service2Application.class, args);
    }
}

2.5 测试熔断功能

启动eureka服务,service1服务,service2服务,postman请求接口调用
由于service1中的请求响应时间3秒,service1的熔断时间为2秒,service2设置的熔断时间为1秒,所以在超出1秒时,返回的是service2设置的熔断结果
在这里插入图片描述
这里可以将service2的熔断时间设置为2.5秒,可以发现结果返回的时service1设置的熔断结果,因为2.5秒大于2秒,service2的熔断机制未触发,在请求2秒时就直接返回了service1熔断返回的结果

以上就是熔断器hystrix的使用


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

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

相关文章

安装指定版本docker [centos]

在安装k8s时&#xff0c;对其docker版本有要求&#xff0c;因为在v1.4后对docker不再支持。在安装v1.36版本时&#xff0c;需要提前安装对应版本的docker&#xff0c;这里安装20.10版本 一 先卸载原来安装的docker yum remove docker-ce docker-ce-cli containerd.io 再删除对…

vivado中的Video timing controller IP核参数计算方法

一、参数的计算 直入正题&#xff0c;已知某一1024*600的LCD屏幕&#xff0c;屏幕参数大致如下&#xff1a; 如何设置IP核配置界面的参数呢&#xff1f; 细调参数几乎用不到&#xff0c;我们主要说一下水平设置和垂直设置的8个参数如何配置。取LCD屏幕的典型值作为参考值&#…

自动驾驶之行泊一体

行泊一体技术是一种集成了自动泊车和无人驾驶技术的新型汽车技术,该技术可以使汽车更加智能化和自动化,提高驾驶的安全性和便捷性。从芯片和BEV技术门槛方面来看,我们可以更好地理解这项技术的优势和挑战。 一、芯片限制 实现行泊一体技术需要依靠一些关键的芯片技术,其…

谷歌浏览器Software Reporter Tool长时间占用CPU解决办法

如下图所示&#xff0c;大家是否在使用谷歌浏览器的过程中发现CPU风扇狂转&#xff0c;打开任务管理器发现一个名为software_reporter_tool.exe的软件占用了一半的CPU资源&#xff01;这简直不能忍&#xff0c;按照下面教程&#xff0c;可以解决这个令人苦恼的问题。 什么是Sof…

【LeetCode】693. 交替位二进制数

693. 交替位二进制数&#xff08;简单&#xff09; 方法一 思路 如果一个数的二进制表示总是 0、1 交替出现&#xff0c;那么这个数字可能有两种表示情况&#xff0c;...101010 或 ...010101 &#xff0c;即对应最低位从 0 或 1 开始的两种情况。 因此&#xff0c;我们先确定…

港科夜闻|香港科大出席一流大学建设系列研讨会-2022暨中国大学校长联谊会...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大出席一流大学建设系列研讨会—2022暨中国大学校长联谊会。5月25日至26日&#xff0c;香港科技大学副校长汪扬教授出席由中国科学技术大学主办的一流大学建设系列研讨会—2022暨中国大学校长联谊会。参会代表来自…

【SpringCloud】SpringAMQP总结

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange8、消息转换器 1、AMQP Advanced Message Queuing Protocol&#xff0c;高级消息队列协议。是用于在应用程序之间传递业务…

深入理解设计原则之单一职责原则(SRP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 SRP&#xff1a;单一职责原则 系列文章目录1、单一职责原则的定义和解读2、单一职责原则案例解读2.1、违背单一职责原则反面案例2.2、违背单一职责原则反面案例 - 解决方案 3…

《嵌入式存储器架构、电路与应用》----学习记录(三)

第4章 嵌入式内存 4.1 Flash的发展背景 Flash是非易失存储器&#xff0c;具有存储密度高、容错能力强和读写速度相对较慢等特点&#xff0c;传统Flash广泛应用于外部大数据存储。为了满足微控制器芯片(MCU)高速运算的需求&#xff0c;嵌入式Flash(eFlash)往往作为MCU的内部数…

【花雕学AI】ChatGPT的四大语言处理神器:文本生成、问答、创意生成和内容优化的技巧和实例

引言&#xff1a;ChatGPT是一个人工智能聊天机器人&#xff0c;它可以理解和交流多种语言&#xff0c;例如中文、英文、日文、西班牙语、法语、德语等。它是由OpenAI开发的&#xff0c;基于GPT-3.5和GPT-4这两个大型语言模型。它不仅可以与用户进行对话&#xff0c;还可以根据用…

Centos7切换到Alibaba Cloud Linux3

通过控制台自动导入迁移源目前仅支持迁移源的类型为物理机/虚拟机/云服务器和阿里云ECS云服务器&#xff0c;若需要迁移其他类型的迁移源&#xff0c;则可以选择手动导入迁移源。 第一步&#xff0c;登录SMC客户端。 登录网址&#xff1a;阿里云登录 - 欢迎登录阿里云&#x…

MYSQL 8 Too many connections error 还在继续,这对DBA 是不公平的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

c++11 标准模板(STL)(std::bitset)(二)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssig…

qgis二次开发环境搭建(qgis-3.28.6+ubuntu22.04+qt5.15)

背景 一个Ros2项目中用到了qgis&#xff0c;特此整理一下用到的qgis二次开发代码。 linux搭建Debug环境(省事简单apt一把梭) 下载 ubuntu22.04qgis-3.28.6Qt version 5.15.3 编译 参考qgis编译文档 ubuntu22.04 使用上图jammy的安装命令上图中的apt-get安装命令安装的…

PyQt5桌面应用开发(19):事件过滤器

本文目录 PyQt5桌面应用系列再来点事件事件过滤器例子这是什么恶毒巫术?需求分析代码额外的细节知 总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 PyQt5桌面应用开…

从零到无搭建Vue项目及代码风格规范

注&#xff1a;已经有vue项目的可以跳过项目初始化 Vue项目搭建 环境搭建 安装nvm 方便后续切换不通的node版本 nvm官网 傻瓜安装就行 或者搜下自己&#xff08;非本文重点&#xff09;nvm 安装好后 安装一个Node版本 本文使用的 有了环境开始创建Vue项目 打开命令行 cmd n…

Redis底层学习(五)—存储类型-Set篇

文章目录 特点具体服务器操作命令底层结构应用场景 特点 适⽤场景&#xff1a;存储有去重需求的数据&#xff0c;⽐如&#xff1a;针对⼀篇⽂章⽤户进⾏点赞操作。 它的特点是内部元素⽆序且不重复。它的内部实现相当于⼀个特殊的字典&#xff0c;字典中所有的 value 的值都为…

这么好看的头像,岂不拿下!

❝ 如此好看的头像&#xff0c;怎么能不喜欢&#xff1f;&#xff1f;&#xff1f; ❞ 代码放在了最后 后续还会出一个工具&#xff0c;以便于随时打开下载。 看上述的头像是不是还是很不错的。看着网站还是✨✨每天都会有更新的✨✨。 所以&#xff0c;我动手了&#xff0c;下…

5.2 案例引入

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是大数据时代的到来&#xff1f; 大数据时代指的是在现代社会中&#xff0c;产生和积累的数据规模庞大、速度快、种类多样的时代。随着计算机技术…

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.4密码应用安全性评估测评过程指南

目录 概述 1.基本原则 2.风险测评控制 3.测评过程 密码应用评估方案 1.主要内容 1&#xff09;密码应用解决方案评估要点 2&#xff09;实施方案评估要点 3&#xff09;应急处置方案评估要点 2.主要任务 3.密码应用方案评估的输出文档 测评准备活动 1.测评准…