在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.rhkb.cn/news/212149.html

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

相关文章

探索 Linux Namespace:Docker 隔离的神奇背后

来自&#xff1a;探索云原生 https://www.lixueduan.com 原文&#xff1a;https://www.lixueduan.com/posts/docker/03-container-core/ 在 深入理解 Docker 核心原理&#xff1a;Namespace、Cgroups 和 Rootfs 一文中我们分析了 Docker 是由三大核心技术实现的。 今天就一起分…

万界星空科技MES---制造企业的加工生产模式

在现代制造业中&#xff0c;加工生产模式是制造企业组织和管理生产过程的重要方面。不同的加工模式适用于不同的生产需求和产品类型。其中流水型、离散型和混合型是三种常见的加工生产模式。1. 流水型加工模式 流水型加工模式是一种高度自动化的生产方式&#xff0c;适用于…

JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存

目录 1.HTML模板 2.获取DOM元素和定义变量 3.创建两个canvas元素&#xff0c;并设置它们的宽度和高度 4.绑定触摸事件&#xff1a;touchstart, touchmove, touchend和click 5.实现触摸事件回调函数&#xff1a;startDrawing, draw和stopDrawing 6.实现绘制线段的函数&…

【PyTorch】模型选择、欠拟合和过拟合

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 完整代码2.2.2. 输出结果 1. 理论介绍 将模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合&#xff0c; 用于对抗过拟合的技术称为正则化。训练误差和验证误差都很严重&#xff0c; 但它们之间差…

Java程序员,你掌握了多线程吗?(文末送书)

目录 01、多线程对于Java的意义02、为什么Java工程师必须掌握多线程03、Java多线程使用方式04、如何学好Java多线程送书规则 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流…

@德人合科技 | 数据透明加密防泄密系统\文件文档加密\设计图纸加密|源代码加密防泄密软件系统,——防止内部办公终端核心文件数据/资料外泄!

一款专业的数据防泄密管理系统&#xff0c;它采用了多种加密模式&#xff0c;包括透明加密、半透明加密和落地加密等&#xff0c;可以有效地保护企业的核心数据安全。 PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee …

验证码的多种生成策略

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 第一种 a.导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

NAS外网访问方案

基础流程 路由器开启端口映射&#xff08;如果有猫则要配置猫为转发模式&#xff0c;由路由器直接拨号即可使用第三方程序让内网ip发布到公网上&#xff08;如果有云服务器&#xff09;需要开启防火墙端口 好用的第三方程序 FRP穿透 优点&#xff1a;开源免费&#xff0c;速…

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

Ubuntu宝塔面板本地部署轻论坛系统HadSky并远程访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

C++多态(详解)

一、多态的概念 1.1、多态的概念 多态&#xff1a;多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&am…

百度推送收录工具-免费的各大搜索引擎推送工具

在互联网时代&#xff0c;网站收录是网站建设的重要一环。百度推送工具作为一种提高网站收录速度的方式备受关注。在这个信息爆炸的时代&#xff0c;对于网站管理员和站长们来说&#xff0c;了解并使用一些百度推送工具是非常重要的。本文将重点分享百度批量域名推送工具和百度…

深入理解JVM内存空间的担保策略

Java虚拟机&#xff08;JVM&#xff09;的内存管理是Java性能调优中最重要的方面之一&#xff0c;特别是在处理大型应用和服务时。JVM内存管理的一个关键组成部分是垃圾回收&#xff08;GC&#xff09;。在GC过程中&#xff0c;JVM需要确保有足够的内存来创建新对象&#xff0c…

景联文科技解读《2023人工智能基础数据服务产业发展白皮书》,助力解决数据标注挑战

前段时间&#xff0c;国家工业信息安全发展研究中心发布《2023人工智能基础数据服务产业发展白皮书》&#xff08;以下简称“白皮书”&#xff09;。 《白皮书》指出&#xff0c;2022年&#xff0c;中国人工智能基础数据服务产业的市场规模为45亿元&#xff0c;预计今年将达到5…

一步解决 java.io.FileNotFoundException: 找不到文件异常

1.问题描述 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\localhost\uploads\image\20231206\2843cb16-9654-4e52-a757-76e3ca1f80ff.png (系统找不到指定的路径。) 2.原因分析 文件路径中的文件目录不存在 3.解决方案 方案一&#xff1a;如果…

最优化方法复习——线性规划之对偶问题

一、线性规划对偶问题定义 原问题&#xff1a; 对偶问题&#xff1a; &#xff08;1&#xff09;若一个模型为目标求 “极大”&#xff0c;约束为“小于等于” 的不等式&#xff0c;则它的对偶模型为目标求“极小”&#xff0c;约束是“大于等于”的不等式。即“Max&#xff0…

docker基本管理和概念

1、定义&#xff1a;一个开源的应用容器引擎&#xff0c;基于go语言开发&#xff0c;运行在liunx系统中的开源的、轻量级的“虚拟机” docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器 docker的宿主机是liunx系统&#xff0c;集…

Maven——使用Nexus创建私服

私服不是Maven的核心概念&#xff0c;它仅仅是一种衍生出来的特殊的Maven仓库。通过建立自己的私服&#xff0c;就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等&#xff0c;从而高效地使用Maven。 有三种专门的Maven仓库管理软件可以用来帮助大家建立…

六个自媒体写作方法,提升自媒体创作收益

在自媒体时代&#xff0c;写作成为了一个不可或缺的技能。特别是对于新手来说&#xff0c;掌握一些有效的写作方法&#xff0c;可以事半功倍&#xff0c;更好地展现个人创意和观点。在这里&#xff0c;我将分享六个适合新手的自媒体写作方法&#xff0c;希望能够为你在写作之路…