日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】

發布時間:2024/7/5 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在微服務架構中,我們將系統拆分成了一個個的服務單元,各單元應用間通過服務注冊與訂閱的方式互相依賴。由于每個單元都在不同的進程中運行,依賴通過遠程調用的方式執行,這樣就有可能因為網絡原因或是依賴服務自身問題出現調用故障或延遲,而這些問題會直接導致調用方的對外服務也出現延遲,若此時調用方的請求不斷增加,最后就會出現因等待出現故障的依賴方響應而形成任務積壓,線程資源無法釋放,最終導致自身服務的癱瘓,進一步甚至出現故障的蔓延最終導致整個系統的癱瘓。如果這樣的架構存在如此嚴重的隱患,那么相較傳統架構就更加的不穩定。為了解決這樣的問題,因此產生了斷路器等一系列的服務保護機制。

針對上述問題,在Spring Cloud Hystrix中實現了線程隔離、斷路器等一系列的服務保護功能。它也是基于Netflix的開源框架 Hystrix實現的,該框架目標在于通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、線程隔離、請求緩存、請求合并以及服務監控等強大功能。

接下來,我們就從一個簡單示例開始對Spring Cloud Hystrix的學習與使用。

動手試一試

在開始使用Spring Cloud Hystrix實現斷路器之前,我們先拿之前實現的一些內容作為基礎,其中包括:

  • eureka-server工程:服務注冊中心,端口:1001
  • eureka-client工程:服務提供者,兩個實例啟動端口分別為2001

下面我們可以復制一下之前實現的一個服務消費者:eureka-consumer-ribbon,命名為eureka-consumer-ribbon-hystrix。下面我們開始對其進行改在:

第一步:pom.xml的dependencies節點中引入spring-cloud-starter-hystrix依賴:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

第二步:在應用主類中使用@EnableCircuitBreaker或@EnableHystrix注解開啟Hystrix的使用:

@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}

}

注意:這里我們還可以使用Spring Cloud應用中的@SpringCloudApplication注解來修飾應用主類,該注解的具體定義如下所示。我們可以看到該注解中包含了上我們所引用的三個注解,這也意味著一個Spring Cloud標準應用應包含服務發現以及斷路器。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

第三步:改造服務消費方式,新增ConsumerService類,然后將在Controller中的邏輯遷移過去。最后,在為具體執行邏輯的函數上增加@HystrixCommand注解來指定服務降級方法,比如:

@RestController
public class DcController {

@Autowired
ConsumerService consumerService;

@GetMapping("/consumer")
public String dc() {
return consumerService.consumer();
}

class ConsumerService {

@Autowired
RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}

public String fallback() {
return "fallback";
}

}

}

下面我們來驗證一下上面Hystrix帶來的一些基礎功能。我們先把涉及的服務都啟動起來,然后訪問localhost:2101/consumer,此時可以獲取正常的返回,比如:Services: [eureka-consumer-ribbon-hystrix, eureka-client]。

為了觸發服務降級邏輯,我們可以將服務提供者eureka-client的邏輯加一些延遲,比如:

@GetMapping("/dc")
public String dc() throws InterruptedException {
Thread.sleep(5000L);
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}

重啟eureka-client之后,再嘗試訪問localhost:2101/consumer,此時我們將獲得的返回結果為:fallback。我們從eureka-client的控制臺中,可以看到服務提供方輸出了原本要返回的結果,但是由于返回前延遲了5秒,而服務消費方觸發了服務請求超時異常,服務消費者就通過HystrixCommand注解中指定的降級邏輯進行執行,因此該請求的結果返回了fallback。這樣的機制,對自身服務起到了基礎的保護,同時還為異常情況提供了自動的服務降級切換機制。

更多Spring Cloud內容請持續關注我的博客更新或在《Spring Cloud微服務實戰》中獲取。

代碼示例

樣例工程將沿用之前在碼云和GitHub上創建的SpringCloud-Learning項目,重新做了一下整理。通過不同目錄來區分Brixton和Dalston的示例。

  • 碼云:點擊查看
  • GitHub:點擊查看

具體工程說明如下:

  • eureka的服務注冊中心:eureka-server
  • eureka的服務提供方:eureka-client
  • eureka的服務消費者:eureka-consumer-ribbon-hystrix

相關閱讀

  • Spring Cloud構建微服務架構:服務注冊與發現(Eureka、Consul)
  • Spring Cloud構建微服務架構:服務消費者(基礎)
  • Spring Cloud構建微服務架構:服務消費者(Ribbon)
  • Spring Cloud構建微服務架構:服務消費者(Feign)
  • Spring Cloud構建微服務架構:分布式配置中心
  • Spring Cloud構建微服務架構:服務容錯保護(hystrix服務降級)
  • Spring Cloud構建微服務架構:服務容錯保護(hystrix依賴隔離)
  • Spring Cloud構建微服務架構:服務容錯保護(hystrix斷路器)
  • Spring Cloud構建微服務架構:Hystrix監控面板
  • Spring Cloud構建微服務架構:Hystrix監控數據聚合
  • 更多Spring Cloud內容…

總結

以上是生活随笔為你收集整理的Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。