在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.pswp.cn/news/212522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單的圖像分類任務全流程示例(內含代碼)

以下是一個簡單的示例&#xff0c;展示了如何使用 PyTorch 處理自定義圖像分類數據集&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoad…

erlang實現用ets做一級緩存

一、Erlang中的ETS表和DETS表 ETS表是Erlang中的一種數據結構&#xff0c;它允許我們在內存中存儲數據。ETS表有許多用途&#xff0c;其中包括作為緩存的一種實現方式。ETS表的特點是它們在內存中以表的形式存儲數據&#xff0c;這使得訪問和操作數據非常快。 DETS表是Erlang…

【求職】外企德科-網易游戲測試面試記錄

前面的話&#xff1a;本來沒想寫&#xff0c;但是竟然收到了一面通過的通知&#xff0c;那就來回顧一下一面&#xff0c;為終面做做準備。 這次面試基本沒有做什么準備&#xff0c;本來也就是抱著試一試的心態做的筆試&#xff0c;結果筆試通過了&#xff0c;由于筆試的內容很…

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;簡單摘錄…

激活函數數學詳解以及應用場景解釋

文章目錄 激活函數1. Sigmoid 激活函數例子及推導過程代碼 2. ReLU 激活函數例子及推導過程 3. Tanh 激活函數例子及推導過程代碼 4. Softmax 激活函數例子及推導過程代碼 CNN 中的卷積層工作原理卷積計算過程卷積后的輸出及 ReLU 應用 激活函數 激活函數在神經網絡中扮演著至…

IPSec 協議

在 TCP/IP 協議中&#xff0c;對 IP 數據包沒有提供任何安全保護&#xff0c;攻擊者可以通過網絡嗅探、 IP 欺騙、連接截獲等方法來攻擊正常的 TCP/IP 通信。因此&#xff0c;通信過程中會存在以下危險&#xff1a;數據并非來自合法的發送者、數據在傳輸過程中被非法篡改、信息…

前端知識(十七)——入口函數和特定函數的區別

入口函數和特定函數是編程中常見的兩種函數類型&#xff0c;它們在功能和使用場景上有所不同。下面我將通過Python代碼示例來解釋它們的區別。 1.入口函數&#xff1a;入口函數通常是一個程序或模塊的起始點&#xff0c;它負責接收用戶輸入或外部數據&#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;圖論題目中比較常見的環路…

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock項目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文網 (vitejs.cn) vite.config.ts import { defineConfig } from vite …

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;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

Flask筆記三之連接使用數據庫

本文首發于公眾號&#xff1a;Hunter后端 原文鏈接&#xff1a;Flask筆記三之連接使用數據庫 這一節介紹 Flask 與數據庫的連接&#xff0c;以及接口里查詢數據的操作。 這里使用的是 SQLAlchemy pymysql 實現與數據庫的連接&#xff0c;SQLAlchemy 的詳細介紹見之前的筆記有…

藍橋杯2021年5月青少組Python程序設計國賽真題

30 個人在一條船上,超載&#xff0c;需要 15 人下船于是人們排成一隊&#xff0c;排隊的位置即為他們的編號。報數,從1開始,數到9的人下船。如此循環,直到船上僅剩15 人為止&#xff0c;問都有哪些編號的人下船了呢? 2】判斷101-200之間有多少個素數&#xff0c;并輸出所有素數…

Maven上傳Jar到Nexus遠程倉庫的兩種方式

Maven上傳Jar到Nexus遠程倉庫的兩種方式 文章目錄 前言通過mvn clean deploy指令上傳第一步 配置maven的setting.xml文件第二步 配置pom文件第三步 執行打包指令 手動上傳 jar到遠程倉庫第一步 配置setting文件第二步 執行上傳命令 前言 各個公司在開發項目時&#xff0c;一般…

Linux C/C++并發編程實戰(8)CAS機制的ABA問題

文章目錄 無鎖隊列中的ABA問題ABA問題解決方案 ABA問題&#xff1a;CAS在操作的時候會檢查變量的值是否被更改過&#xff0c;如果沒有則更新值&#xff0c;但是帶來一個問題&#xff0c;最開始的值是A&#xff0c;接著變成B&#xff0c;最后又變成了A。經過檢查這個值確實沒有修…

Leetcode每日一題

https://leetcode.cn/problems/binary-tree-preorder-traversal/ 這道題目需要我們自行進行創建一個數組&#xff0c;題目也給出我們需要自己malloc一個數組來存放&#xff0c;這樣能達到我們遍歷的效果&#xff0c;我們來看看他的接口函數給的是什么。 可以看到的是這個接口函…

說說webpack中常見的loader?解決了什么問題?

在Webpack中&#xff0c;Loader是用于處理各種文件類型的模塊加載器&#xff0c;它們用于對文件進行轉換、處理和加載。常見的Loader解決了以下問題&#xff1a; 處理 JavaScript 文件&#xff1a;Babel Loader用于將最新的JavaScript語法轉譯為瀏覽器兼容的版本&#xff0c;以…