Spring Cloud構建微服務斷路器介紹

dc373ab1c3c247f8804cd34eb53f5e85.gif什么是斷路器

?

?

斷路器模式源于Martin Fowler的Circuit Breaker一文。“斷路器”本身是一種開關裝置,用于在電路上保護線路過載,當線路中有電器發生短路時,“斷路器”能夠及時的切斷故障電路,防止發生過載、發熱、甚至起火等嚴重后果。

?

在分布式架構中,斷路器模式的作用也是類似的,當某個服務單元發生故障(類似用電器發生短路)之后,通過斷路器的故障監控(類似熔斷保險絲),向調用方返回一個錯誤響應,而不是長時間的等待。這樣就不會使得線程因調用故障服務被長時間占用不釋放,避免了故障在分布式系統中的蔓延。

?

Netflix Hystrix

在Spring Cloud中使用了Hystrix 來實現斷路器的功能。Hystrix是Netflix開源的微服務框架套件之一,該框架目標在于通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能。

?

下面我們來看看如何使用Hystrix。

?

準備工作

在開始加入斷路器之前,我們先拿之前構建兩個微服務為基礎進行下面的操作,主要使用下面幾個工程:

?

chapter9-1-1

eureka-server工程:服務注冊中心,端口1111

compute-service工程:服務單元,端口2222

chapter9-1-2

eureka-ribbon:通過ribbon實現的服務單元,依賴compute-service的服務,端口3333

eureka-feign:通過feign實現的服務單元,依賴compute-service的服務,端口3333

若您還沒有使用Spring Cloud的經驗,可以先閱讀《服務注冊與發現》與《服務消費者》,對Spring Cloud構建的微服務有一個初步的認識。

?

Ribbon中引入Hystrix

依次啟動eureka-server、compute-service、eureka-ribbon工程

訪問http://localhost:1111/可以看到注冊中心的狀態

訪問http://localhost:3333/add,調用eureka-ribbon的服務,該服務會去調用compute-service的服務,計算出10+20的值,頁面顯示30

關閉compute-service服務,訪問http://localhost:3333/add,我們獲得了下面的報錯信息

?

Whitelabel Error Page

?

This application has no explicit mapping for /error, so you are seeing this as a fallback.

?

Sat Jun 25 21:16:59 CST 2016

There was an unexpected error (type=Internal Server Error, status=500).

I/O error on GET request for "http://COMPUTE-SERVICE/add?a=10&b=20": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect

pom.xml中引入依賴hystrix依賴

1

2

3

4

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-hystrix</artifactId>

</dependency>

在eureka-ribbon的主類RibbonApplication中使用@EnableCircuitBreaker注解開啟斷路器功能:

?

@SpringBootApplication

@EnableDiscoveryClient

@EnableCircuitBreaker

public class RibbonApplication {

?

@Bean

@LoadBalanced

RestTemplate restTemplate() {

return new RestTemplate();

}

?

public static void main(String[] args) {

SpringApplication.run(RibbonApplication.class, args);

}

?

}

改造原來的服務消費方式,新增ComputeService類,在使用ribbon消費服務的函數上增加@HystrixCommand注解來指定回調方法。

?

@Service

public class ComputeService {

?

@Autowired

RestTemplate restTemplate;

?

@HystrixCommand(fallbackMethod = "addServiceFallback")

public String addService() {

return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();

}

?

public String addServiceFallback() {

return "error";

}

?

}

提供rest接口的Controller改為調用ComputeService的addService

?

@RestController

public class ConsumerController {

?

@Autowired

private ComputeService computeService;

?

@RequestMapping(value = "/add", method = RequestMethod.GET)

public String add() {

return computeService.addService();

}

?

}

驗證斷路器的回調

依次啟動eureka-server、compute-service、eureka-ribbon工程

訪問http://localhost:1111/可以看到注冊中心的狀態

訪問http://localhost:3333/add,頁面顯示:30

關閉compute-service服務后再訪問http://localhost:3333/add,頁面顯示:error

更多關于Hystrix的使用可參考How To Use

?

Feign使用Hystrix

注意這里說的是“使用”,沒有錯,我們不需要在Feigh工程中引入Hystix,Feign中已經依賴了Hystrix,我們可以在未做任何改造前,嘗試下面你的操作:

?

依次啟動eureka-server、compute-service、eureka-feign工程

訪問http://localhost:1111/可以看到注冊中心的狀態

訪問http://localhost:3333/add,調用eureka-feign的服務,該服務會去調用compute-service的服務,計算出10+20的值,頁面顯示30

關閉compute-service服務,訪問http://localhost:3333/add,我們獲得了下面的報錯信息

?

Whitelabel Error Page

?

This application has no explicit mapping for /error, so you are seeing this as a fallback.

?

Sat Jun 25 22:10:05 CST 2016

There was an unexpected error (type=Internal Server Error, status=500).

add timed-out and no fallback available.

如果您夠仔細,會發現與在ribbon中的報錯是不同的,看到add timed-out and no fallback available這句,或許您已經猜到什么,看看我們的控制臺,可以看到報錯信息來自hystrix-core-1.5.2.jar,所以在這個工程中,我們要學習的就是如何使用Feign中集成的Hystrix。

?

使用@FeignClient注解中的fallback屬性指定回調類

?

@FeignClient(value = "compute-service", fallback = ComputeClientHystrix.class)

public interface ComputeClient {

?

@RequestMapping(method = RequestMethod.GET, value = "/add")

Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);

?

}

創建回調類ComputeClientHystrix,實現@FeignClient的接口,此時實現的方法就是對應@FeignClient接口中映射的fallback函數。

?

@Component

public class ComputeClientHystrix implements ComputeClient {

?

@Override

public Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b) {

return -9999;

}

?

}

再用之前的方法驗證一下,是否在compute-service服務不可用的情況下,頁面返回了-9999。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36300.shtml

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

相關文章

【Redis】使用Docker鏡像配置集群時的Operation timed out問題

不知道有沒有小伙伴跟我一樣是使用的Docker鏡像進行Redis集群案例模擬的&#xff08;三臺虛擬機確實帶不動 &#xff09;&#xff0c;然后我遇到了一個問題&#xff1a;Could not connect to Redis at 172.17.0.2:6379: Operation timed out 172.17.0.2是我其中一個Redis實例的…

如何測試Linux磁盤的讀寫速度

在Linux系統中也有很多命令可以測試硬盤的讀寫速度指標。以下是幾個常用命令&#xff08;注意&#xff1a;在執行測試命令之前&#xff0c;請務必備份數據以避免數據丟失&#xff01; 1、dd 命令 首先掛載磁盤 mount /dev/sdb /testdd 命令可用于進行硬盤讀寫速度測試。 例…

uniapp踩坑之項目:判斷字符串長度自動調整選項卡寬度

利用動態:class來判斷字長調整選項卡uni-data-select 寬度 //html <view><view style"width:100%" :class"checkLength(text)>4 ? textexplode:textshrink"><uni-data-select v-model"value" :localdata"rangeTag"…

android 開發中常用命令

1.反編譯 命令&#xff1a;apktool d <test.apk> -o <folderdir> 其中&#xff1a;test.apk是待反編譯文件的路徑&#xff0c;folderdir是反編譯后的文件的存儲位置。 apktool d -f <test.apk> -o <folderdir> 注意&#xff1a;如果dir已經存在&am…

從零學算法34

34.給你一個按照非遞減順序排列的整數數組 nums&#xff0c;和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。 你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。 示例 1&#xff1…

React Native 在高IOS版本下無法顯示圖片的問題處理

圖片在低ios版本下可以看到圖片&#xff0c;在高版本ios下顯示不了圖片 直接上解決方法 找文件 /node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m 修改源碼 原代碼 if (_currentFrame) {layer.contentsScale self.animatedImageScale;layer.contents…

php中nts和ts

PHP語言解析器:官方提供了2種類型的版本&#xff0c;線程安全(TS)版和非線程安全(NTS)版 TS: TS(Thread-Safety)即線程安全&#xff0c;多線程訪問時&#xff0c;采用了加鎖機制&#xff0c;當一個線程訪問該類的某個數據時進行數據加鎖保護&#xff0c;其他線程不能同時進行訪…

您的網站不應該只提供一套通用 API

后端應該提供兩套 API&#xff0c;一套是外部使用的通用 API&#xff0c;服務特定的數據&#xff0c;另一套是自家使用的應用 API&#xff0c;服務特定的頁面。 在當今的web開發中&#xff0c;構建一個提供JSON服務的后端和一個渲染應用程序的前端是很流行的。我不太喜歡&…

【Sklearn】基于決策樹算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于決策樹算法的數據分類預測&#xff08;Excel可直接替換數據&#xff09; 1.模型原理1.1 模型原理1.2 數學模型 2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果 1.模型原理 決策樹是一種基于樹狀結構的分類和回歸模型&#xff0c;它通過一系列…

MySql(干貨)

寫這篇博客的目的不是為了將介紹原理&#xff0c;而是為了Sql中的代碼操作屬實太多了&#xff0c;在這里進行一個匯總&#xff0c;方便查閱&#xff01;&#xff01;&#xff01; Sql分類 分類全稱說明 DDL Data Definintion Language數據定義語言&#xff0c;用來定義數據庫對…

微信小程序(由淺到深)

文章目錄 一. 項目基本配置1. 項目組成2. 常見的配置文件解析3. app.json全局的五大配置4.單個頁面中的page配置5. App函數6.tabBar配置 二. 基本語法&#xff0c;事件&#xff0c;單位1. 語法2. 事件3. 單位 三. 數據響應式修改四 . 內置組件1. button2. image3. input4. 組件…

k8s常用資源管理 控制

目錄 Pod&#xff08;容器組&#xff09;&#xff1a;Pod是Kubernetes中最小的部署單元&#xff0c;可以包含一個或多個容器。Pod提供了一種邏輯上的封裝&#xff0c;使得容器可以一起共享網絡和存儲資源 1、創建一個pod 2、pod管理 pod操作 目錄 創建Pod會很慢 Pod&…

什么是事務,并發帶來的事務問題以及事務隔離級別(圖文詳解)

一、什么是事務&#xff1f; 簡單說就是邏輯上的一組操作&#xff0c;要么都執行&#xff0c;要么都不執行。 舉個例子&#xff0c;假如小明要給小紅轉賬100元&#xff0c;這個轉賬會涉及到兩個關鍵操作&#xff1a;①將小明的余額減少100元。 ②將小紅的余額增加100元 。但…

學習筆記整理-JS-04-流程控制語句

文章目錄 一、條件語句1. if語句的基本使用2. if else if多條件分支3. if語句算法題4. switch語句5. 三元運算符 二、循環語句1. for循環語句2. for循環算法題3. while循環語句4. break和continue5. do while語句 三、初識算法1. 什么是算法2. 累加器和累乘器3. 窮舉法4. 綜合算…

給大家推薦一些文本翻譯、文檔翻譯API接口

最近在項目中要接入文本翻譯和文檔翻譯功能&#xff0c;滿足在工作時使用&#xff0c;又需要了解每個人的使用情況&#xff0c;所以采用了集成翻譯API的方式&#xff0c;我再調研時也查了比較多的資料&#xff0c;總結了我感覺比較好的網站。 推薦網站 1、百度翻譯&#xff0…

設計模式(2)工廠方法模式

一、 1、介紹&#xff1a;定義一個用于創建對象的接口&#xff0c;讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷&#xff0c;根據客戶端的選擇條件動態實例化相關的類&#xff0c;對于客戶端來說…

odoo-034 float 浮點數比較

文章目錄 前提問題解決總結 前提 odoo 版本&#xff1a;13 python&#xff1a;3.6.9 問題 比較銷售訂單行中已送貨跟已開票&#xff0c;在 tree 視圖顯示搜索后的結果。發現搜索條件為已送貨 > 已開票時&#xff0c;結果中會包含已送貨已開票的。 解決 把這兩個值打印出…

LeNet中文翻譯

Gradient-Based Learning Applied to Document Recognition 基于梯度的學習應用于文檔識別 摘要 使用反向傳播算法訓練的多層神經網絡構成了成功的基于梯度的學習技術的最佳示例。給定適當的網絡架構&#xff0c;基于梯度的學習算法可用于合成復雜的決策表面&#xff0c;該決策…

【Vue-Router】使用 prams 路由傳參失效

報錯信息&#xff1a; [Vue Router warn]: Discarded invalid param(s) “name”, “price”, “id” when navigating. list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水",&quo…

node獲取微信小程序登錄用戶的openid

前提準備&#xff1a; 1、需要知道AppID(小程序ID) 2、AppSecret(小程序密鑰) 3、調wx.login成功后返回的code 代碼如下&#xff1a; const express require(express); const router express.Router(); const request require(request) const APP_URL https://api.wei…