@TOC
問題背景
從零開始學springcloud微服務項目
注意事項:
- 約定 > 配置 > 編碼
- IDEA版本2021.1
- 這個項目雕拼,我分了很多篇章曼尊,每篇文章一個操作步驟菲盾,目的是顯得更簡單明了
- controller調(diào)service昏兆,service調(diào)dao
- 默認安裝nginx
- 項目源碼以及sentinel安裝包
sentinel
1 登錄github下載:https://github.com/alibaba/Sentinel/releases
2 在文件夾輸入cmd,啟動sentinel
java -jar sentinel-dashboard-1.8.4.jar
由于默認8080端口报强,可能被占用灸姊,可以自己更改端口
java -jar sentinel-dashboard-1.8.4.jar --server.port=8081
3 登錄sentinel:http://localhost:8080/ ,登錄賬號:sentinel 密碼:sentinel
4 新建cloudalibaba-sentinel-service8401微服務
5 選擇jdk1.8
6 輸入服務名:cloudalibaba-sentinel-service8401
7 引入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>springcloud2022</artifactId>
<groupId>com.yg</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-sentinel-service8401</artifactId>
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后續(xù)做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- SpringBoot整合Web組件+actuator -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</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>
8 添加application.yml文件
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
#Nacos服務注冊中心地址
server-addr: localhost:8848
sentinel:
transport:
#配置Sentinel dashboard地址
dashboard: localhost:8080
#默認8719端口秉溉,假如被占用會自動從8719開始依次+1掃描,直至找到未被占用的端口
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
9 添加啟動類
package com.yg.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author suolong
* @Date 2022/6/21 16:08
* @Version 2.0
*/
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
10 添加controller類
package com.yg.springcloud.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author suolong
* @Date 2022/6/21 16:10
* @Version 2.0
*/
@RestController
public class FlowLimitController {
@GetMapping("/testA")
public String testA()
{
return "------testA";
}
@GetMapping("/testB")
public String testB()
{
return "------testB";
}
}
11 啟動微服務力惯,打開postman調(diào)用:http://localhost:8401/testA http://localhost:8401/testB
12 查看sentinel:http://localhost:8080/
13 基本概念
14 添加流控的兩種方式
-
第一種碗誉,使用簇點鏈路
-
第二種,流控規(guī)則
15 測試qps限流夯膀,超過一秒一次就進行限流
16 測試線程限流诗充,超過線程數(shù)就進行限流
更改controller代碼
@GetMapping("/testA")
public String testA()
{
try {
TimeUnit.SECONDS.sleep(3);
}catch (InterruptedException e) {
e.printStackTrace();
}
return "------testA";
}
連續(xù)點兩次
17 當與A關(guān)聯(lián)的資源B達到閥值后,就限流A自己
postman模擬并發(fā)密集訪問testB诱建,新建collections
保存http://localhost:8401/testB 到集合
點擊Run
運行了B之后,去訪問A碟绑,可以看見A被限流了
18 預熱:閾值除以coldFactor(默認值為3),經(jīng)過預熱時長后才會達到閾值
-
默認coldFactor為3俺猿,即請求 QPS 從 threshold / 3 開始,經(jīng)預熱時長逐漸升至設(shè)定的 QPS 閾值
- 預熱意思就是格仲,系統(tǒng)初始化的閥值為5 / 3 約等于1, 即閥值剛開始為1押袍;然后過了3秒后閥值才慢慢升高恢復到5
19 勻速排隊,閾值必須設(shè)置為QPS
- 勻速排隊凯肋,讓請求以均勻的速度通過谊惭,閥值類型必須設(shè)成QPS,否則無效
-
設(shè)置含義:/testA每秒1次請求侮东,超過的話就排隊等待圈盔,等待的超時時間為20000毫秒
sentinel熔斷降級
1 Sentinel 熔斷降級會在調(diào)用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調(diào)用超時或異常比例升高),對這個資源的調(diào)用進行限制悄雅,讓請求快速失敗驱敲,避免影響到其它的資源而導致級聯(lián)錯誤
2 當資源被降級后,在接下來的降級時間窗口之內(nèi)宽闲,對該資源的調(diào)用都自動熔斷(默認行為是拋出 DegradeException)
3 參數(shù)說明
RT(平均響應時間众眨,秒級)
平均響應時間 超出閾值 且 在時間窗口內(nèi)通過的請求>=5,兩個條件同時滿足后觸發(fā)降級
窗口期過后關(guān)閉斷路器
RT最大4900(更大的需要通過-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)異常比列(秒級)
QPS >= 5 且異常比例(秒級統(tǒng)計)超過閾值時容诬,觸發(fā)降級娩梨;時間窗口結(jié)束后,關(guān)閉降級異常數(shù)(分鐘級)
異常數(shù)(分鐘統(tǒng)計)超過閾值時览徒,觸發(fā)降級狈定;時間窗口結(jié)束后,關(guān)閉降級
4 平均響應時間
5 添加測試testD方法
@GetMapping("/testD")
public String testD()
{
//暫停幾秒鐘線程
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
log.info("testD 測試RT");
return "------testD";
}
6 使用jmeter壓測
- 永遠一秒鐘打進來10個線程(大于5個了)調(diào)用testD吱殉,希望200毫秒處理完本次任務掸冤,如果超過200毫秒還沒處理完,在未來1秒鐘的時間窗口內(nèi)友雳,斷路器打開(保險絲跳閘)微服務不可用稿湿,保險絲跳閘斷電了
- 后續(xù)停止jmeter,沒有這么大的訪問量了押赊,斷路器關(guān)閉(保險絲恢復)饺藤,微服務恢復OK
7 異常比例包斑,同時滿足QPS和異常比例兩個條件
8 異常測試代碼
@GetMapping("/testD")
public String testD()
{
log.info("testD 測試RT");
int age = 10/0;
return "------testD";
}
10 設(shè)置熔斷
11 jmeter測試
- 單獨訪問一次,必然來一次報錯一次(int age = 10/0)涕俗,調(diào)一次錯一次
- 開啟jmeter后罗丰,直接高并發(fā)發(fā)送請求,多次調(diào)用達到我們的配置條件了再姑。斷路器開啟(保險絲跳閘)萌抵,微服務不可用了,不再報錯error而是服務降級了元镀。
12 異常數(shù)绍填,時間窗口一定要大于等于60秒
13 新增測試代碼
@GetMapping("/testE")
public String testE()
{
log.info("testE 測試異常比例");
int age = 10/0;
return "------testE 測試異常比例";
}
14 設(shè)置熔斷降級
- 使用postman:http://localhost:8401/testE,第一次訪問絕對報錯栖疑,因為除數(shù)不能為零讨永,可以看到error窗口,但是達到5次報錯后遇革,進入熔斷后降級
SpringCloud無介紹快使用卿闹,Seata處理分布式事務(二十五)
SpringCloud無介紹快使用,sentinel服務熔斷功能(二十四)
SpringCloud無介紹快使用萝快,sentinel注解@SentinelResource的基本使用(二十三)
SpringCloud無介紹快使用锻霎,sentinel熱點key限流與系統(tǒng)規(guī)則的基本使用(二十二)
SpringCloud無介紹快使用,sentinel熔斷降級和限流的基本使用(二十一)
SpringCloud無介紹快使用杠巡,Nacos集群和Nginx代理(二十)
SpringCloud無介紹快使用量窘,nacos配置中心的基本使用(十九)
SpringCloud無介紹快使用,nacos注冊中心的基本使用(十八)
SpringCloud無介紹快使用氢拥,gateway通過微服務名實現(xiàn)動態(tài)路由(十七)
SpringCloud無介紹快使用蚌铜,gateway的基本使用(十六)
SpringCloud無介紹快使用,Ribbon負載均衡工具與OpenFeign的使用(十五)
SpringCloud無介紹快使用嫩海,使用Zookeeper替換Eureka服務注冊與發(fā)現(xiàn)(十四)
SpringCloud無介紹快使用冬殃,服務發(fā)現(xiàn)Discovery和Eureka自我保護(十三)
SpringCloud無介紹快使用,集群cloud-provider-payment8002搭建(十二)
SpringCloud無介紹快使用叁怪,集群Eureka服務注冊中心cloud-eureka-server7002搭建(十一)
SpringCloud無介紹快使用审葬,單機Eureka服務注冊中心cloud-eureka-server7001搭建(十)
SpringCloud無介紹快使用,新建cloud-api-commons公共模塊module(九)
SpringCloud無介紹快使用奕谭,新建子module消費者訂單模塊(八)
SpringCloud無介紹快使用涣觉,熱部署devtools配置(七)
SpringCloud無介紹快使用,子module提供者支付微服務業(yè)務開發(fā)(六)
SpringCloud無介紹快使用血柳,新建子module提供者支付微服務yml整合和新建啟動類(五)
SpringCloud無介紹快使用官册,新建子module提供者支付微服務pom整合(四)
SpringCloud無介紹快使用,springcloud父工程pom文件整理(三)
SpringCloud無介紹快使用难捌,IDEA新建springcloud父工程(二)
SpringCloud無介紹快使用膝宁,與Spingboot之間的兼容版本選擇(一)
作為程序員第 188 篇文章鸦难,每次寫一句歌詞記錄一下,看看人生有幾首歌的時間员淫,wahahaha ...