SpringCloud Hystrix初体验

2024-06-24 04:32

本文主要是介绍SpringCloud Hystrix初体验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 简介
  • 实验步骤
    • bookstore应用
      • 初始化应用
      • 主程序
      • 应用配置
      • 访问应用
    • reading应用
      • 初始化应用
      • 主程序
      • BookService
      • 应用配置
      • 运行应用
  • 参考资料

简介

Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电路熔断器)模式原理 。
实际上SpringCloud支持多种Circuit Breaker实现,如:

  • Netfix Hystrix
  • Resilience4J
  • Sentinel
  • Spring Retry

本文主要介绍Netfix Hystrix的用法。

实验步骤

我们需要两个应用,分别为bookstore和reading,bookstore作为被访问的应用,reading为应用了Hystrix的应用,reading应用的/to-readendpoint回去调用bookstore的/recommended,当访问bookstore的/recommended失败时,会触发熔断,转而调用一个fallback方法。

bookstore应用

初始化应用

利用Spring Initializr初始化我们的应用,在这里后端服务只要是一个普通的Web服务就可以了,所以添加一个Spring Web依赖即可:
在这里插入图片描述
将得到的压缩包解压后导入到idea中。

主程序

主程序提供了一个/recommendedendpoint,完整代码如下:

package com.example.hystrixcircuitbreakerbookstore;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;@RestController
@SpringBootApplication
public class HystrixCircuitBreakerBookstoreApplication {@RequestMapping(value = "/recommended")public String readingList(){return "Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)";}public static void main(String[] args) {SpringApplication.run(HystrixCircuitBreakerBookstoreApplication.class, args);}
}

应用配置

src\main\resources\application.properties中为应用指定一个可用的端口,如下:

server.port=8300

完成以上步骤以后就可以把应用运行起来了。

访问应用

打开浏览器,输入地址http://localhost:8300/recommended,出现类似以下界面则表示应用正常运行:
在这里插入图片描述

reading应用

初始化应用

利用Spring Initializr初始化我们的应用,这里我们添加如下两个依赖:
在这里插入图片描述

主程序

主程序提供一个/to-readendpoint,该endpoint会尝试去bookstore应用中获取数据(见下文),完整代码如下:

package com.example.hystrixcircuitbreakerreading;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.web.client.RestTemplate;@EnableCircuitBreaker
@RestController
@SpringBootApplication
public class HystrixCircuitBreakerReadingApplication {@Autowiredprivate BookService bookService;@Beanpublic RestTemplate rest(RestTemplateBuilder builder) {return builder.build();}@RequestMapping("/to-read")public String toRead() {return bookService.readingList();}public static void main(String[] args) {SpringApplication.run(HystrixCircuitBreakerReadingApplication.class, args);}
}

BookService

Spring Cloud Netflix Hystrix会找到标记了注解@HystrixCommand的方法,并把这些方法代理起来,从而让Hystrix能够监控它。Hystrix只会监控@Component@Service类中的方法,当监控到某个方法的失败调用次数达到一定阈值的时候,就会断开电路,后续对该方法的调用都会立即失败,并把对该方法的调用重定向到一个fallback方法中。在BookService类中,我们把readingList方法带上@HystrixCommand添加到Hystrix的监控中,当该方法执行失败时会被熔断,熔断后对该方法的调用会被重定向到fallback方法reliable中,完整代码如下:

package com.example.hystrixcircuitbreakerreading;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.net.URI;@Service
public class BookService {private final RestTemplate restTemplate;public BookService(RestTemplate rest) {this.restTemplate = rest;}@HystrixCommand(fallbackMethod = "reliable")public String readingList() {URI uri = URI.create("http://localhost:8300/recommended");return this.restTemplate.getForObject(uri, String.class);}public String reliable() {return "Cloud Native Java (O'Reilly)";}
}

应用配置

src\main\resources\application.properties中为应用指定一个可用的端口,如下:

server.port=8301

完成以上步骤以后就可以把应用运行起来了。

运行应用

打开浏览器,输入地址http://localhost:8301/to-read,此时bookstore应用正常运作,因此能从bookstore中拿到数据,显示出来:
在这里插入图片描述
将bookstore应用关掉,此时再访问该接口,发现该接口已经被熔断,显示的结果的fallback方法reliable的输出:
在这里插入图片描述

参考资料

Circuit Breaker(电路熔断器)模式原理
https://spring.io/guides/gs/circuit-breaker/

这篇关于SpringCloud Hystrix初体验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089175

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis