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

news2024/11/25 1:02:37

其实吧,写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;

    @Autowired
    public 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;

    @Autowired
    public 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.coloradmin.cn/o/1292533.html

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

相关文章

Implicit Neural Representation for Cooperative Low-light Image Enhancement

GitHub - Ysz2022/NeRCo: [ICCV 2023] Implicit Neural Representation for Cooperative Low-light Image Enhancement 参考&#xff1a;ICCV2023 | 将隐式神经表征用于“低光增强”&#xff0c;北大张健团队提出NeRCo (qq.com) 以下三个因素限制了现有低光图像增强方法的应用…

状态机的练习:按键控制led灯

设计思路&#xff1a; 三个按键控制led输出。 三个按键经过滤波(消抖)&#xff0c;产生三个按键标志信号。 三个led数据的产生模块&#xff08;流水&#xff0c;跑马&#xff0c;闪烁模块&#xff09;&#xff0c;分别产生led信号。 这六路信号&#xff08;三路按键信号&am…

Java网络编程——Socket用法解析

在客户/服务器通信模式中&#xff0c;客户端需要主动创建与服务器连接的Socket&#xff0c;服务器端收到了客户的连接请求&#xff0c;也会创建与客户连接的Socket。Socket可以被看作是通信连接两端的收发器&#xff0c;服务器与客户都通过套接字来收发数据。 1、构造Socket …

企业数字化转型的七个成功案例

尽管经济形势严峻&#xff0c;但60%的企业告诉波士顿咨询公司&#xff0c;他们将在2023年增加数字化转型投资。根据Precedence Research最近的一份报告&#xff0c;到2025年&#xff0c;数字化转型市场预计将达到1.458万亿美元。 成长型股权公司PSG的董事总经理安东尼爱德华兹…

【hacker送书第10期】AI时代系列丛书(五选一)

AI时代系列丛书 AI时代程序员开发之道✨内容简介参与方式 AI时代项目经理成长之道✨内容简介参与方式 AI时代架构师修炼之道✨内容简介参与方式 AI时代产品经理升级之道✨内容简介参与方式 AI时代Python量化交易实战✨内容简介参与方式 AI时代程序员开发之道✨ 内容简介 本书是…

C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)

目录 一、创建Graphics对象 1.创建Pen对象 2.创建Brush对象 &#xff08;1&#xff09;SolidBrush类 &#xff08;2&#xff09;HatchBrush类 ​​​​​​​&#xff08;3&#xff09;LinerGradientBrush类 用户界面上的窗体和控件非常有用&#xff0c;且引人注目&#…

优雅提效:Guava的字符串处理工具

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们要聊一聊Google Guava这个超棒的Java库&#xff0c;尤其是它的字符串处理工具。对于Java程序员来说&#xff0c;字符串处理是日常工作的一部分&#xff0c;而Guava在这方面提供了非常强大的支持。使用Gu…

Unity中Batching优化的GPU实例化(3)

文章目录 前言一、UNITY_SETUP_INSTANCE_ID(v);二、在UnityInstancing.cginc文件中&#xff0c;看一下Unity这句话做了什么1、使用了该 .cginc 后&#xff0c;会自动预定义该函数2、需要满足GPU实例化条件&#xff0c;才会执行对应语句3、满足GPU实例化后&#xff0c;主要执行的…

Python Tornado 框架的终极指南!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python Tornado框架是一个高性能的异步Web框架&#xff0c;被广泛应用于构建实时Web应用和API服务。本文将深度解析Tornado框架&#xff0c;介绍其核心概念、异步特性、路由系统、模板引擎以及WebSocket支持等方…

通过Powershell远程控制windows服务器

1、被测服务器5985、5986端口开启&#xff0c;在网络设置中&#xff0c;点击“更改连接属性”。 2、网络配置文件中选择“专用”。 3、以管理员权限运行Powershell&#xff0c; 4.通过powershell命令在本地电脑上添加远端信任主机 winrm set winrm/config/client {TrustedHos…

世微 AP3266 大功率同步降压恒流芯片 过EMC 车灯驱动

产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出最大功率可达 40W&#xff0c;最大电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空载上…

如何搭建一套完整的智能安防视频监控平台?关于设备与软件选型的几点建议

安防视频监控系统主要由前端摄像机设备、视频显示设备、视频存储设备、安防应用软件/平台以及其它传输、辅助类设备组成。一般来说&#xff0c;安防监控系统具有可扩展和开放性&#xff0c;以方便未来的扩展和与其他系统的集成。今天我们就来介绍一下&#xff0c;搭建一套完整的…

JAVA全栈开发 MySql详解

一、数据库 1.数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据持久化 使用文件来进行存储&#xff0c;数据库也是一种文件&#xff0c;像excel &#xff0c;xml 这些都可以进行数据的存储&#xff0c;但大量数据操作&#x…

搜维尔科技:Varjo XR-4 系列-专为极致沉浸感而打造!

Varjo 的新一代头显将世界上最先进的混合现实技术与顶尖的图形处理能力连接起来&#xff0c;满足最高级别的视觉保真度和沉浸感至关重要的工业用例。 光学设计的根本性突破 体验全新的沉浸感。大幅扩展的视野&#xff0c;跨越 120 x 105 度&#xff0c;打破了受人尊敬的“全双眼…

跨域的多种方案详解

浏览器的同源策略是为了保护用户的安全&#xff0c;限制了跨域请求。同源策略要求请求的域名、协议和端口必须完全一致&#xff0c;只要有一个不同就会被认为是跨域请求。 本文列举了一些处理跨域请求的解决方案&#xff1a; JSONPCORS跨域资源共享http proxynginx反向代理web…

第七次作业

1&#xff0c; 给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n)&#xff0c;可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 arr input("") num [int(n) for n in arr.split()]…

嵌入式板级系统设计【课设】

笔记【嵌入式板级系统设计】 前言版权笔记【嵌入式板级系统设计】资料学习面包板焊接注意焊接教程 焊接电路板基础代码GPIO 外部中断 定时中断 三合一串口 综合实验 风扇控制系统下板三合一窗口综合实验 最后 前言 2023-11-20 08:49:57 以下内容源自《【创作模板五】》 仅供学…

通过K8S安装人大金仓数据库

1. 离线下载镜像&#xff0c;请点击 2. 官网下载镜像 https://www.kingbase.com.cn/xzzx/index.htm&#xff0c;根据自己的需求下载对应版本。 3. K8S需要的yaml清单 cat > kingbase.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata:name: kingbase-…

将图像增广应用于Mnist数据集

将图像增广应用于Mnist数据集 不用到cifar-10的原因是要下载好久。。我就直接用在Mnist上了&#xff0c;先学会用 首先我们得了解一下图像增广的基本内容&#xff0c;这是我的一张猫图片&#xff0c;以下为先导入需要的包和展示图片 import time import torch from torch im…

javaTCP协议实现一对一聊天

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…