在Spring Cloud使用Hystrix核心组件,并注册到Eureka注册中心去

其实吧,写Spring Cloud系列,我有时候觉得也挺难受的,因为Spring Cloud的微服务启动都需要一个一个来,并且在IDea中也需要占用比较大的内存,并且我本来可以一篇写完5大核心组件的,但是我却分了三篇,起初我交代过,这个系列,我将会慢慢来,因为我希望,将模块查分,这样我自己去理的时候也蛮清楚,别人看的时候,也轻松一点,所以我才一步一步完成微服务,这五大组件,其实都是可以聚合使用的,我只是为了把他单独划分出来讲解罢了。

并且,我写文章的时候,大多数理论先开始,然后再举例代码的,我希望通过此种方式,让我自己记忆深入一点,并且也让读者看到更加清楚,因为Spring Cloud对于微服务的理清楚,会比你学习的时候更加艰难,理清楚微服务之后再去学习,Spring Cloud会更加好一点。

好的,废话说多了,今天我们的主角是Hystrix,那么我们先了解什么是Hystrix。

Hystrix

介绍

Hystrix是Netflix开源的一款用于处理分布式系统中的延迟和容错问题的库。它提供了线程隔离、断路器、请求缓存、请求合并和服务降级等功能,以增加系统的弹性和可靠性。

Hystrix的底层实现机制主要包括以下几个关键组件:

  • 线程隔离:Hystrix使用线程池隔离每个服务调用,使得服务调用之间互不影响,提高了系统的稳定性和可靠性。
  • 断路器:Hystrix通过断路器机制来监控服务调用的状态,当服务调用失败率超过一定阈值时,断路器会打开,后续的请求将会被快速失败,避免对故障服务的连续调用。
  • 请求缓存:Hystrix可以缓存请求的结果,当相同的请求再次发生时,可以直接返回缓存的结果,减少对后端服务的调用。
  • 请求合并:Hystrix可以将多个相同类型的请求合并为一个批量请求,减少网络开销和提高性能。
  • 服务降级:Hystrix可以定义服务调用失败时的降级逻辑,返回一个备选的结果或执行备选的逻辑,保证系统的可用性。

Hystrix可以解决分布式系统中的故障和延迟问题,提供了以下几个主要的功能和优势:

  • 防止级联故障:通过断路器机制,Hystrix可以防止故障的服务调用对整个系统的影响,避免级联故障的发生。
  • 快速失败和快速恢复:Hystrix能够快速失败并快速恢复,当服务调用失败时,可以快速返回失败结果或备选结果,提高系统的响应速度。
  • 提供容错能力:Hystrix通过服务降级和备选逻辑,可以在服务不可用或出现故障时提供备选的处理方式,保证系统的可用性。
  • 监控和度量:Hystrix提供了丰富的监控和度量功能,可以实时监控服务调用的状态和性能指标,帮助开发者了解系统的运行情况。

在Spring Cloud中,Hystrix被广泛应用于微服务架构中的服务调用和容错处理。通过与Ribbon和Feign等组件的集成,Spring Cloud可以自动为服务调用添加Hystrix的功能,提供了更强大的容错能力和弹性。同时,Spring Cloud还提供了Hystrix Dashboard和Turbine等工具,用于监控和可视化Hystrix的运行状态和指标。

注意,实际上Spring Cloud的组件是可以集成使用的,我将至分开是更好的了解这五大组件的功能,以及更好的了解Spring Cloud的微服务的搭建。

老样子,搭建服务目录如下:
在这里插入图片描述

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>springCloud</artifactId><groupId>com.miaow</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><description>Hystrix熔断降级</description><artifactId>hystrix</artifactId><name>hystrix</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><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></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency></dependencies>
</project>

application.yml

server:port: 2383
spring:application:name: hystrix-demo#路由前缀
zuul:prefix: /api# eureka客户端注册到Eureka注册中心,切记需要启动eureka服务
eureka:client:service-url:defaultZone: http://localhost:1000/eureka

启动类

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

以下介绍这五个注解

@SpringBootApplication

@SpringBootApplication是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解。它的作用是标识一个Spring Boot应用程序的主类,用于启动Spring Boot应用程序。

@EnableDiscoveryClient

@EnableDiscoveryClient注解用于启用服务注册与发现功能,它可以让应用程序作为一个Eureka客户端来注册到Eureka Server,并从Eureka Server中获取其他服务的信息。

@EnableCircuitBreaker

@EnableCircuitBreaker注解用于启用断路器功能,它可以让应用程序使用Hystrix来实现断路器模式,当服务调用失败时,自动熔断服务,避免服务雪崩。

@EnableHystrix

@EnableHystrix注解是@EnableCircuitBreaker的一个别名,用于启用Hystrix断路器功能。

@EnableEurekaClient

@EnableEurekaClient注解用于启用Eureka客户端功能,它可以让应用程序作为一个Eureka客户端来注册到Eureka Server,并从Eureka Server中获取其他服务的信息。

在这里插入图片描述
至此,我们以及启动了6个微服务了:
在这里插入图片描述

熔断降级案例

好的,既然我们将Spring Cloud的五大核心组件已经介绍完毕了,那么我们就用熔断降级来完成一个案例吧,注意这是一个案例:
这是我的目录结构:
在这里插入图片描述
我们创建一个电影推荐服务MovieRecommendationService,该服务提供一个方法getRecommendedMovies()来获取推荐的电影列表。在这个例子中,我们假设该服务可能会出现故障或延迟。

import org.springframework.stereotype.Service;@Service
public class MovieRecommendationService {public List<String> getRecommendedMovies() {// 模拟电影推荐服务的调用// 这里可以是一个远程服务调用或者其他耗时操作// 假设这里可能会出现故障或延迟// 返回一个默认的电影列表return Arrays.asList("Movie 1", "Movie 2", "Movie 3");}
}

然后,我们使用Hystrix来包装MovieRecommendationService,实现服务降级和断路器的功能。

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class HystrixMovieRecommendationService {private final MovieRecommendationService movieRecommendationService;@Autowiredpublic HystrixMovieRecommendationService(MovieRecommendationService movieRecommendationService) {this.movieRecommendationService = movieRecommendationService;}@HystrixCommand(fallbackMethod = "getDefaultMovies")public List<String> getRecommendedMovies() {return movieRecommendationService.getRecommendedMovies();}public List<String> getDefaultMovies() {// 定义一个备选的电影列表return Arrays.asList("Default Movie 1", "Default Movie 2", "Default Movie 3");}
}

在上面的代码中,我们使用@HystrixCommand注解来标记getRecommendedMovies()方法,当调用该方法时,Hystrix会自动包装该方法,并在电影推荐服务调用失败时,调用fallbackMethod指定的方法getDefaultMovies()来返回备选的电影列表。

最后,我们可以在Spring Boot应用程序中使用HystrixMovieRecommendationService来获取推荐的电影列表。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MovieController {private final HystrixMovieRecommendationService movieRecommendationService;@Autowiredpublic MovieController(HystrixMovieRecommendationService movieRecommendationService) {this.movieRecommendationService = movieRecommendationService;}@GetMapping("/movies")public List<String> getRecommendedMovies() {return movieRecommendationService.getRecommendedMovies();}
}

在上面的代码中,我们创建了一个MovieController,其中注入了HystrixMovieRecommendationService,并提供了一个GET请求的接口/movies来获取推荐的电影列表。

这样,当调用/movies接口时,Hystrix会自动对getRecommendedMovies()方法进行包装,当电影推荐服务调用失败时,会返回getDefaultMovies()方法定义的备选电影列表。

然后我们重新启动服务,访问:

http://localhost:2383/movies

在这里插入图片描述

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

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

相关文章

LINUX-ROS集成安装MQTT库步骤注意事项

环境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步骤 安装doxygen sudo apt install doxygen 构…

Fcopy: 基于Coke实现内网大文件分发

在工作中&#xff0c;我曾与小伙伴讨论过这样一个实际问题&#xff1a;数据制作流程产生了一份需要上线的文件&#xff0c;而线上有数十台甚至上百台机器&#xff0c;有什么朴素的办法以尽可能快的速度将文件分发到指定的机器上吗&#xff1f;根据作者已有的知识&#xff0c;分…

普冉(PUYA)单片机开发笔记(5): 配置定时器PWM输出

概述 定时器的输出通道作为 PWM 驱动是 MCU 的常用功能。 PY32F003 有一个高级定时器 TIM1 和一个通用定时器 TIM3&#xff0c;这两个定时器都可以驱动4个输出通道。现在我们就利用 TIM1 的某一个通道实现可控占空比的 PWM 输出。 原理简介 看数据手册&#xff0c;简单摘录…

DM8/达梦 数据库管理员使用手册详解

1.1DM客户端存放位置 Windows&#xff1a;DM数据库安装目录中tool文件夹和bin文件夹中。 Linux&#xff1a;DM数据库安装目录中tool目录和bin目录中。 1.2DM数据库配置助手 1.2.1Windows创建数据库 打开数据库配置助手dbca 点击创建数据库实例 选择一般用途 浏览选择数据库…

图中的最长环

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是处于什么原因&#xff0c;算法学习需要持续保持&#xff0c;今天让我们一起来看看这一道题目————图中的最长环&#xff0c;图论题目中比较常见的环路…

C语言笔试例题_指针专练30题(附答案解析)

C语言笔试例题_指针专练30题(附答案解析) 指针一直是C语言的灵魂所在&#xff0c;是掌握C语言的必经之路&#xff0c;收集30道C语言指针题目分享给大家&#xff0c;测试环境位64位ubuntu18.04环境&#xff0c;如有错误&#xff0c;恳请指出&#xff0c;文明讨论&#xff01;&am…

基于SSM+JSP网上订餐管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

蓝桥杯2021年5月青少组Python程序设计国赛真题

30 个人在一条船上,超载&#xff0c;需要 15 人下船于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数,从1开始,数到9的人下船。如此循环,直到船上仅剩15 人为止&#xff0c;问都有哪些编号的人下船了呢? 2】判断101-200之间有多少个素数&#xff0c;并输出所有素数…

Leetcode每日一题

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 这道题目需要我们自行进行创建一个数组&#xff0c;题目也给出我们需要自己malloc一个数组来存放&#xff0c;这样能达到我们遍历的效果&#xff0c;我们来看看他的接口函数给的是什么。 可以看到的是这个接口函…

5_CSS三大特性盒子模型

第5章-盒子模型【比屋教育】 本课目标&#xff08;Objective&#xff09; 掌握CSS三大特性理解什么是盒子模型掌握内边距padding的用法掌握外边距margin的用法 1. CSS的层叠&#xff0c;继承&#xff0c;优先级 1.1 CSS层叠 层叠&#xff1a;是指多个CSS样式叠加到同一个元…

Web(8)SQL注入

Web网站&#xff08;对外门户&#xff09; 原理&#xff1a;not>and>or(优先级) 一.低级注入 order by的作用是对字段进行排序&#xff0c;如order by 5&#xff0c;根据第五个字段 进行排序&#xff0c;如果一共有4个字段&#xff0c;输入order by 5系统就会报错不 …

详细介绍开源固件-TF-A

什么是TF-A&#xff1f; TF-A&#xff08;Trusted Firmware-A&#xff09;是一种用于嵌入式系统的开源固件&#xff0c;而不是Linux的一部分。TF-A主要用于ARM架构的处理器和设备&#xff0c;它提供了一组安全和可信任的软件组件&#xff0c;用于引导和初始化系统。 如下是其…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中&#xff0c;可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元&#xff0c;当合理地划分任务并正确地执行时&#xff0c;这…

qt可以详细写的项目或技术

1.QT 图形视图框架 2.QT 模型视图结构 3.QT列表显示大量信息 4.QT播放器 5.QT 编解码 6.QT opencv

Bypass open_basedir

讲解 open_basedir是php.ini中的一个配置选项&#xff0c;可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/&#xff0c;那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…

洛谷 P8674 [蓝桥杯 2018 国 B] 调手表

文章目录 [蓝桥杯 2018 国 B] 调手表题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题意解析CODE分析一下复杂度 [蓝桥杯 2018 国 B] 调手表 题目描述 小明买了块高端大气上档次的电子手表&#xff0c;他正准备调时间呢。 在 M78 星云&#xff0c;时间的计量…

JVM虚拟机:命令行查看JVM垃圾回收器的执行信息

在eclipse中打开命令行窗口 window->show view->Terminal 这样就打开了Terminal窗口&#xff0c;效果如下所示&#xff1a; java -XX:PrintCommandLineFlags -version 这个命令可以查看一些配置信息&#xff0c;其中最重要的配置信息就是&#xff0c;当前使用的G1回收器…

键盘打字盲打练习系列之成为大师——5

一.欢迎来到我的酒馆 盲打&#xff0c;成为大师&#xff01; 目录 一.欢迎来到我的酒馆二.关于盲打你需要知道三.值得收藏的练习打字网站 二.关于盲打你需要知道 盲打系列教程&#xff0c;终于写到终章了。。。一开始在看网上视频&#xff0c;看到up主熟练的打字技巧&#xff…

LabVIEW与Tektronix示波器实现电源测试自动化

LabVIEW与Tektronix示波器实现电源测试自动化 在现代电子测试与测量领域&#xff0c;自动化测试系统的构建是提高效率和精确度的关键。本案例介绍了如何利用LabVIEW软件结合Tektronix MDO MSO DPO2000/3000/4000系列示波器&#xff0c;开发一个自动化测试项目。该项目旨在自动…

MYSQL练题笔记-高级查询和连接-指定日期的产品价格

这依旧是中等题&#xff0c;想了好久&#xff0c;终于理解了很开心&#xff01; 一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 题目是找出2019-08-16 时全部产品的价格&#xff0c;所以…