《SpringCloud專題17》-Hystrix熔斷器案例
1.高併發測試
上章在非高併發情形下,還能勉強滿足,但是在搞併發的情況下有些問題
1.1.Jmeter壓測測試
開啟Jmeter,來20000個併發壓死8001,20000個請求都去訪問paymentInfo_TimeOut服務
再來一個訪問
http://localhost:8001//payment/hystrix/ok/31
1.2.看演示結果
兩個都在轉圈圈
為什麼會被卡死
tomcat的預設工作執行緒數被打滿了,沒有多餘的執行緒來分解壓力和處理
1.3.Jmeter壓測結論
上面還只是服務提供者8001自己測試,假如此時外部的消費者80也來訪問,那消費者只能乾等,最終導致消費端80不滿意,服務端8001直接被拖死
2.看熱鬧不嫌棄事大,80新建加入
新建cloud-consumer-feign-hystrix-order80
POM
<?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>springcloud2020</artifactId>
<groupId>com.itxiongmao.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-comsumer-feign-hystrix-order80</artifactId>
<dependencies>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>com.itxiongmao.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--監控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
YML
server:
port: 80
spring:
application:
name: cloud-comsumer-feign-hystrix-order80
eureka:
client:
service-url:
# 叢集版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
主啟動
package com.itxiongmao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @BelongsProject: springcloud2020
* @BelongsPackage: com.itxiongmao
* @CreateTime: 2020-11-22 13:01
* @Description: TODO
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderHystrixMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrixMain80.class, args);
}
}
業務類
package com.itxiongmao.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @BelongsProject: springcloud2020
* @BelongsPackage: com.itxiongmao.service
* @CreateTime: 2020-11-22 13:02
* @Description: TODO
*/
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {
/**
* 正常訪問
*
* @param id
* @return
*/
@GetMapping("/payment/hystrix/ok/{id}")
String paymentInfo_OK(@PathVariable("id") Integer id);
/**
* 超時訪問
*
* @param id
* @return
*/
@GetMapping("/payment/hystrix/timeout/{id}")
String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}
package com.itxiongmao.controller;
import com.itxiongmao.service.PaymentHystrixService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("order")
public class OrderHyrixController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("info/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id){
String res = paymentHystrixService.paymentInfo_OK(id);
System.out.println(res);
return res;
};
@GetMapping("info/timeout/{id}")
public String paymentInfo_timeout(@PathVariable("id") Integer id){
String res = paymentHystrixService.paymentInfo_OK(id);
System.out.println(res);
return res;
};
}
正常測試
http://localhost/order/info/ok/32
3.高併發測試
2w個執行緒壓8001,消費者80微服務再去訪問的OK服務8001地址: http://localhost/order/info/ok/32
消費者80,o(╥﹏╥)o
要麼轉圈圈
要麼消費端報超時錯誤
3.1.故障和導致現象
8001同一層次的其他介面被困死,因為tomcat執行緒池裡面的工作執行緒已經被擠佔完畢,80此時呼叫8001,客戶端訪問響應緩慢,轉圈圈
正因為有上述故障或不佳表現 才有我們的降級/容錯/限流等技術誕生
3.2.如何解決?解決的要求
超時導致伺服器變慢(轉圈)
超時不再等待
出錯(當機或程式執行出錯)
出錯要有兜底
解決
對方服務(8001)超時了,呼叫者(80)不能一直卡死等待,必須有服務降級
對方服務(8001)down機了,呼叫者(80)不能一直卡死等待,必須有服務降級
對方服務(8001)ok,呼叫者(80)自己有故障或有自我要求(自己的等待時間小於服務提供者)
相關文章
- springcloud之Hystrix熔斷器SpringGCCloud
- springcloud(四):熔斷器HystrixSpringGCCloud
- SpringCloud原始碼學習之Hystrix熔斷器SpringGCCloud原始碼
- SpringCloud學習筆記:熔斷器Hystrix(5)SpringGCCloud筆記
- 跟我學SpringCloud | 第四篇:熔斷器HystrixSpringGCCloud
- (24)SpringCloud-Hystrix(熔斷器)介紹及使用SpringGCCloud
- springcloud(五):熔斷監控Hystrix DashboardSpringGCCloud
- springcloud之hystrix熔斷器-Finchley.SR2版SpringGCCloud
- SpringCloud-Hystrix 服務降級、熔斷SpringGCCloud
- springcloud(五):熔斷監控Hystrix Dashboard和TurbineSpringGCCloud
- 熔斷器 Hystrix 原始碼解析 —— 斷路器 HystrixCircuitBreaker原始碼UI
- 微服務SpringCloud之熔斷監控Hystrix Dashboard和Turbine微服務SpringGCCloud
- SpringCloud(三)Hystrix斷路器SpringGCCloud
- 微服務SpringCloud之熔斷器微服務SpringGCCloud
- Spring cloud(4)-熔斷(Hystrix)SpringCloud
- SpringCloud Netflix (五) : Hystrix 服務熔斷和服務降級SpringGCCloud
- 熔斷器 Hystrix 原始碼解析 —— 執行命令方式原始碼
- Spring Cloud實戰系列(四) - 熔斷器HystrixSpringCloud
- 跟我學SpringCloud | 第五篇:熔斷監控Hystrix Dashboard和TurbineSpringGCCloud
- 微服務熔斷限流Hystrix之流聚合微服務
- 微服務熔斷限流Hystrix之Dashboard微服務
- 熔斷器 Hystrix 原始碼解析 —— 除錯環境搭建原始碼除錯
- 熔斷器 Hystrix 原始碼解析 —— 執行結果快取原始碼快取
- SpringCloud之斷路器聚合監控(Hystrix Turbine)SpringGCCloud
- Java springcloud B2B2C o2o多使用者商城 springcloud架構(四):熔斷器HystrixJavaSpringGCCloud架構
- 分散式服務防雪崩熔斷器,Hystrix理論+實戰。分散式
- 使用springcloud gateway搭建閘道器(分流,限流,熔斷)SpringGCCloudGateway
- springcloud(六):熔斷監控TurbineSpringGCCloud
- SpringCloud微服務系列(5): 服務容錯斷路器HystrixSpringGCCloud微服務
- 五. SpringCloud服務降級與熔斷SpringGCCloud
- java spring cloud 版b2b2c社交電商-熔斷器HystrixJavaSpringCloud
- 熔斷器 Hystrix 原始碼解析 —— 命令執行(二)之執行隔離策略原始碼
- 熔斷器 Hystrix 原始碼解析 —— 命令執行(一)之正常執行邏輯原始碼
- 熔斷器設計模式設計模式
- 微服務11:熔斷、降級的Hystrix實現(附原始碼)微服務原始碼
- 史上最簡單的 SpringCloud 教程 | 第四篇: 斷路器(Hystrix)SpringGCCloud
- SpringCloud之HystrixSpringGCCloud
- 業餘草 SpringCloud教程 | 第四篇:斷路器(Hystrix)(Finchley版本)SpringGCCloud