springcloud——hystrix


什麼是Spring Boot

Spring Boot簡化了基於Spring的應用開發,通過少量的代碼就能創建一個獨立的、產品級別的Spring應用。 Spring Boot爲Spring平臺及第三方庫提供開箱即用的設置,這樣你就可以有條不紊地開始。多數Spring Boot應用只需要很少的Spring配置。

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。用我的話來理解,就是Spring Boot其實不是什麼新的框架,它默認配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架(不知道這樣比喻是否合適)。

Spring Boot的核心思想就是約定大於配置,一切自動完成。採用Spring Boot可以大大的簡化你的開發模式,所有你想集成的常用框架,它都有對應的組件支持。

什麼是Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啓動和部署。Spring並沒有重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。

微服務是可以獨立部署、水平擴展、獨立訪問(或者有獨立的數據庫)的服務單元,Spring Cloud就是這些微服務的大管家,採用了微服務這種架構之後,項目的數量會非常多,Spring Cloud做爲大管家就需要提供各種方案來維護整個生態。

Spring Cloud就是一套分佈式服務治理的框架,既然它是一套服務治理的框架,那麼它本身不會提供具體功能性的操作,更專注於服務之間的通訊、熔斷、監控等。因此就需要很多的組件來支持一套功能

Spring Boot和Spring Cloud的關係

Spring Boot 是 Spring 的一套快速配置腳手架,可以基於Spring Boot 快速開發單個微服務,Spring Cloud是一個基於Spring Boot實現的雲應用開發工具;Spring Boot專注於快速、方便集成的單個微服務個體,Spring Cloud關注全局的服務治理框架;Spring Boot使用了默認大於配置的理念,很多集成方案已經幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基於Spring Boot來實現,可以不基於Spring Boot嗎?不可以。

Spring Boot可以離開Spring Cloud獨立使用開發項目,但是Spring Cloud離不開Spring Boot,屬於依賴的關係。

Spring -> Spring Boot > Spring Cloud 這樣的關係。

hystrix

1.1.簡介

Hystix,即熔斷器。

Hystix是Netflix開源的一個延遲和容錯庫,用於隔離訪問遠程服務、第三方庫,防止出現級聯失敗。

1.2.熔斷器的工作機制:

正常工作的情況下,客戶端請求調用服務API接口:

當有服務出現異常時,直接進行失敗回滾,服務降級處理:

當服務繁忙時,如果服務出現異常,不是粗暴的直接報錯,而是返回一個友好的提示,雖然拒絕了用戶的訪問,但是會返回一個結果。

這就好比去買魚,平常超市買魚會額外贈送殺魚的服務。等到逢年過節,超時繁忙時,可能就不提供殺魚服務了,這就是服務的降級。

系統特別繁忙時,一些次要服務暫時中斷,優先保證主要服務的暢通,一切資源優先讓給主要服務來使用,在雙十一、618時,京東天貓都會採用這樣的策略。

1.3雪崩問題

微服務中,服務間調用關係錯綜複雜,一個請求,可能需要滴啊用多個微服務接口才能實現,會形成非常複雜的調用鏈路:一次業務請求,需要調用多個服務,這些服務可能調用其他服務,如果此時,某個服務出現異常:請求阻塞,用戶不會得到相應,tomcat的這個線程不會釋放,於是越來越多的請求到來,越來越多的請求阻塞。

Hystrix解決雪崩問題的手段:

1.線程隔離:hystrix爲每個依賴服務調用分配一個小的線程池,如果線程池已經滿了調用被立即拒絕,默認不採用排隊,加速失敗判定時間####

2.服務降級: 優先保證核心服務,而非核心服務不可用或者弱可用####

觸發hystrix服務降級的情況:

  • 線程池已滿
  • 請求超時

引入依賴

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

Hystix的超時時間默認也是1000ms
我們可以通過hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds來設置Hystrix超時時間。

hystrix:
command:
  default:
    execution:
      isolation:
        thread:
          timeoutInMillisecond: 6000 # 設置hystrix的超時時間爲6000ms

hystrix小demo

1、啓動服務註冊中心

啓動服務註冊中心spring-cloud-discovery-eureka

2、修改服務提供者

創建服務提供者spring-cloud-provider

a、在Controller中增加一個方法sayHello,代碼如下:

@GetMapping("/sayHello")
public String sayHello() {
	return "Hello this is provider";
}

b、運行maven命令install,將項目jar包放到maven庫中,並運行兩個服務提供者,方法如下:

使用命令行窗口進入jar包所在的路徑 執行命令:

java -jar spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=8081

再啓動一個命令行窗口進入jar包所在的路徑執行命令:

java -jar spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=8082

這樣就啓動了兩個服務提供者,端口號分別問8081和8082。
3、修改服務消費者
創建服務消費者spring-cloud-consumer,參照:Spring Cloud 服務消費者

a、在POM文件中加入依賴spring-cloud-starter-hystrix

org.springframework.cloud spring-cloud-starter-hystrix

b、在spring boot 啓動文件增加註解@EnableCircuitBreaker,開啓熔斷器功能

@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsumerApplication {

/**
 * 實例化RestTemplate,通過@LoadBalanced註解開啓均衡負載能力.
 * @return restTemplate
 */
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

public static void main(String[] args) {
    SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
}

c、在ConsumerService中增加sayHello方法和回掉方法sayHelloFallBack,使用註解@HystrixCommand(fallbackMethod = “sayHelloFallBack”)指定回調函數,回調函數的返回值和參數必須和正式方法相同,不然會報錯

@HystrixCommand(fallbackMethod = "sayHelloFallBack")
public String sayHello() {
return this.restTemplate.getForObject("http://spring-cloud-provider/sayHello", String.class);
}

public String sayHelloFallBack() {
return "error";
}

d、在ConsumerController中增加方法調用ConsumerService中的sayHello方法

@RestController 
public class ConsumerController {

@Autowired
private ConsumerService consumerService;

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

e、啓動該工程,服務註冊中心顯示該服務信息

4、測試

訪問服務消費者的方法:http://localhost:8010/sayHello,返回:Hello this is provider信息。
關閉服務提供者8082,再訪問該路徑,返回error信息。
這說明Hystrix 已經生效了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章