Spring Cloud Hystrix快速入门demo

1.什么是Spring Cloud Hystrix?

Spring Cloud Hystrix 是一个用于处理分布式系统中故障的库。它实现了熔断器模式,可以防止由于故障服务的连锁反应而导致整个系统崩溃。Spring Cloud Hystrix 提供了丰富的功能,如熔断、降级、限流、缓存等,可以帮助开发人员更好地处理分布式系统中的故障。

2.原理

在使用 Spring Cloud Hystrix 时,通常会对服务进行监控,当服务出现故障时,熔断器会迅速断开与该服务的连接,从而防止该服务对整个系统造成影响。Hystrix 的原理可以简单分为以下几个步骤:

  1. 监控服务:Hystrix 会监控服务的调用情况,例如调用次数、成功率、响应时间等。
  2. 判断服务是否故障:Hystrix 会根据监控数据判断服务是否出现故障。例如,如果服务的响应时间超过了阈值,或者服务的成功率低于阈值,熔断器就会认为该服务出现了故障。
  3. 断开服务连接:当熔断器认为服务出现了故障时,它会迅速断开与该服务的连接,从而防止该服务对整个系统造成影响。
  4. 提供降级方案:当熔断器断开与服务的连接时,它会提供一个降级的方案,例如返回一个缓存的结果或者一个默认值。
  5. 定期重试:熔断器会定期重试与服务的连接,以检测服务是否已经恢复正常。

3.代码工程

实验目的

使用hystrix实现断路器功能

pom.xml

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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>springcloud-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.et</groupId>
    <artifactId>hystrix</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>
    <dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>


    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

controller

人为模拟超时异常,实现断路器功能,走默认的保护方法

typescript 复制代码
package com.et.hystrix.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    @HystrixCommand(fallbackMethod = "fallback_hello", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
    })
    public Map<String, Object> showHelloWorld() throws InterruptedException {
        Thread.sleep(3000);
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }

    private Map<String, Object> fallback_hello() {
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "Request fails. It takes long time to response");
        return map;
    }
}

DemoApplication.java

typescript 复制代码
package com.et.hystrix;

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


@SpringBootApplication
@EnableHystrix
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

application.yaml

yaml 复制代码
server:
  port: 8088

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

4.测试

启动Spring Boot应用程序

验证断路器

访问

arduino 复制代码
http://127.0.0.1:8088/hello

返回

json 复制代码
{"msg":"Request fails. It takes long time to response"}

5.引用

相关推荐
程序员爱钓鱼8 分钟前
Go语言实战案例-开发一个Markdown转HTML工具
前端·后端·go
小小菜鸡ing24 分钟前
pymysql
java·服务器·数据库
getapi27 分钟前
shareId 的产生与传递链路
java
桦说编程37 分钟前
爆赞!完全认同!《软件设计的哲学》这本书深得我心
后端
thinktik1 小时前
还在手把手教AI写代码么? 让你的AWS Kiro AI IDE直接读飞书需求文档给你打工吧!
后端·serverless·aws
我没想到原来他们都是一堆坏人1 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民2 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
上官浩仁2 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存
小小工匠2 小时前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils