Sentinel:微服務架構下的高可用流量防衛兵

一、引言:為什么需要Sentinel?

在分布式系統架構中,隨著業務復雜度的提升和微服務架構的普及,服務之間的依賴關系變得越來越復雜。一個服務的不可用或異常可能會在整個系統中產生連鎖反應,導致整個系統崩潰。這就是所謂的"雪崩效應"。

傳統的解決方案可能包括:

  • 使用超時機制防止長時間等待

  • 實施限流策略控制請求數量

  • 通過熔斷機制避免調用不穩定服務

  • 服務降級保證核心功能可用

然而,這些方案往往需要開發者手動實現,缺乏統一的管理和可視化監控。Sentinel作為阿里巴巴開源的流量控制組件,正是為了解決這些問題而生。它提供了流量控制、熔斷降級、系統負載保護等多種功能,幫助開發者保障微服務的穩定性。

二、Sentinel核心概念解析

2.1 資源(Resource)

資源是Sentinel中的核心概念,它可以是Java應用程序中的任何內容,例如:

  • 一個服務接口

  • 一段代碼塊

  • 一個URL地址

java

// 定義資源示例
try (Entry entry = SphU.entry("getUserInfo")) {// 被保護的業務邏輯return userService.getUserById(userId);
} catch (BlockException e) {// 處理被流控的邏輯return "請求過于頻繁,請稍后重試";
}

2.2 規則(Rule)

Sentinel通過各種規則來定義資源的行為,主要包括:

  • 流量控制規則

  • 熔斷降級規則

  • 系統保護規則

  • 熱點參數規則

  • 授權規則

2.3 指標(Metric)

Sentinel通過滑動窗口算法實時收集資源的運行指標,包括:

  • QPS(每秒查詢率)

  • 響應時間

  • 異常比例

  • 線程數

  • 系統負載等

三、快速開始:Sentinel入門示例

3.1 添加Maven依賴

xml

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
</dependency><!-- Sentinel注解支持 -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.6</version>
</dependency><!-- Sentinel傳輸層 -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version>
</dependency>

3.2 基礎流量控制示例

java

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import java.util.ArrayList;
import java.util.List;public class SentinelDemo {// 定義資源private static final String RESOURCE_NAME = "getUserInfo";public static void main(String[] args) {// 初始化規則initFlowRules();// 模擬請求for (int i = 0; i < 10; i++) {new Thread(() -> {while (true) {// 資源調用try (Entry entry = SphU.entry(RESOURCE_NAME)) {// 模擬業務邏輯System.out.println("訪問資源: " + RESOURCE_NAME + " 時間: " + System.currentTimeMillis());Thread.sleep(100);} catch (BlockException e) {System.out.println("資源被限流: " + RESOURCE_NAME + " 時間: " + System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}).start();}}// 初始化流量控制規則private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource(RESOURCE_NAME);// 設置QPS閾值為2rule.setCount(2);// 設置流控模式:QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 設置流控效果:直接拒絕rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rules.add(rule);FlowRuleManager.loadRules(rules);}
}

3.3 使用注解簡化開發

java

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;@Service
public class UserService {// 定義資源并指定降級方法@SentinelResource(value = "getUserById", blockHandler = "handleBlock", fallback = "getUserFallback")public User getUserById(String userId) {// 模擬數據庫查詢if ("error".equals(userId)) {throw new RuntimeException("模擬異常");}return new User(userId, "用戶" + userId);}// 限流處理方法public User handleBlock(String userId, BlockException ex) {return new User("0", "系統繁忙,請稍后重試");}// 異常降級方法public User getUserFallback(String userId, Throwable throwable) {return new User("0", "服務暫時不可用");}
}

四、Sentinel核心功能詳解

4.1 流量控制

流量控制是Sentinel最核心的功能,它通過多種規則和策略來控制資源的訪問量。

4.1.1 流量控制規則配置

java

private void initComplexFlowRules() {List<FlowRule> rules = new ArrayList<>();// 規則1:QPS流量控制FlowRule qpsRule = new FlowRule();qpsRule.setResource("qpsResource");qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);qpsRule.setCount(10); // 每秒最多10個請求rules.add(qpsRule);// 規則2:線程數流量控制FlowRule threadRule = new FlowRule();threadRule.setResource("threadResource");threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);threadRule.setCount(5); // 同時最多5個線程訪問rules.add(threadRule);// 規則3:關聯流量控制FlowRule refRule = new FlowRule();refRule.setResource("refResource");refRule.setGrade(RuleConstant.FLOW_GRADE_QPS);refRule.setCount(20);refRule.setRefResource("relatedResource"); // 關聯資源rules.add(refRule);FlowRuleManager.loadRules(rules);
}
4.1.2 流量控制效果

Sentinel提供了三種流量控制效果:

  1. 直接拒絕(CONTROL_BEHAVIOR_DEFAULT):直接拋出BlockException

  2. ** Warm Up**(CONTROL_BEHAVIOR_WARM_UP):冷啟動模式,讓流量緩慢增加

  3. 勻速排隊(CONTROL_BEHAVIOR_RATE_LIMITER):讓請求以均勻的速度通過

java

// Warm Up示例
private void initWarmUpRule() {FlowRule rule = new FlowRule();rule.setResource("warmUpResource");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(100); // 最終閾值// 設置為Warm Up模式,冷啟動因子為3,預熱時長10秒rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);rule.setWarmUpPeriodSec(10);List<FlowRule> rules = new ArrayList<>();rules.add(rule);FlowRuleManager.loadRules(rules);
}

4.2 熔斷降級

熔斷降級是當資源不穩定時(如響應時間變長、異常比例增加),自動切斷請求,避免系統雪崩。

4.2.1 熔斷策略

Sentinel提供三種熔斷策略:

  1. 慢調用比例(SLOW_REQUEST_RATIO)

  2. 異常比例(ERROR_RATIO)

  3. 異常數(ERROR_COUNT)

java

private void initDegradeRules() {List<DegradeRule> rules = new ArrayList<>();// 慢調用比例熔斷DegradeRule slowRule = new DegradeRule();slowRule.setResource("slowResource");slowRule.setGrade(RuleConstant.DEGRADE_GRADE_RT); // 慢調用比例slowRule.setCount(500); // 響應時間閾值500msslowRule.setTimeWindow(10); // 熔斷時間10秒slowRule.setRtSlowRequestAmount(5); // 最小請求數slowRule.setMinRequestAmount(5); // 觸發熔斷的最小請求數slowRule.setStatIntervalMs(1000); // 統計間隔1秒rules.add(slowRule);// 異常比例熔斷DegradeRule errorRatioRule = new DegradeRule();errorRatioRule.setResource("errorRatioResource");errorRatioRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);errorRatioRule.setCount(0.5); // 異常比例閾值50%errorRatioRule.setTimeWindow(10);errorRatioRule.setMinRequestAmount(10);errorRatioRule.setStatIntervalMs(1000);rules.add(errorRatioRule);DegradeRuleManager.loadRules(rules);
}

4.3 系統自適應保護

Sentinel能夠從系統級別保護應用,防止系統被壓垮。

java

private void initSystemRules() {List<SystemRule> rules = new ArrayList<>();// CPU使用率保護SystemRule cpuRule = new SystemRule();cpuRule.setHighestCpuUsage(0.8); // CPU使用率閾值80%rules.add(cpuRule);// 負載保護SystemRule loadRule = new SystemRule();loadRule.setHighestSystemLoad(4.0); // 系統負載閾值loadRule.setAvgRt(100); // 平均響應時間loadRule.setQps(50); // 所有入口QPSrules.add(loadRule);// 線程數保護SystemRule threadRule = new SystemRule();threadRule.setMaxThread(1000); // 最大線程數rules.add(threadRule);SystemRuleManager.loadRules(rules);
}

4.4 熱點參數限流

熱點參數限流能夠對頻繁訪問的熱點參數實施特殊限流策略。

java

private void initHotParamRules() {ParamFlowRule rule = new ParamFlowRule("hotParamResource").setParamIdx(0) // 參數索引.setCount(5); // 單機閾值// 針對特定參數值設置限流ParamFlowItem item = new ParamFlowItem().setObject("criticalValue").setClassType(String.class.getName()).setCount(1); // 該參數值的閾值為1rule.setParamFlowItemList(Collections.singletonList(item));ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}

五、Sentinel與Spring Cloud整合

5.1 添加Spring Cloud Alibaba依賴

xml

<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></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>
</dependencies>

5.2 配置Sentinel Dashboard

yaml

spring:application:name: sentinel-democloud:sentinel:transport:dashboard: localhost:8080 # Sentinel控制臺地址port: 8719 # 本地啟動的http服務,用于與Sentinel控制臺通信eager: true # 立即初始化filter:enabled: false # 關閉Servlet的Filter# 暴露端點用于監控
management:endpoints:web:exposure:include: '*'

5.3 使用RestTemplate進行服務調用保護

java

@Configuration
public class SentinelConfig {@Bean@SentinelRestTemplate(blockHandler = "handleBlock", fallback = "handleFallback")public RestTemplate restTemplate() {return new RestTemplate();}// 限流處理public ClientHttpResponse handleBlock(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {return new HttpResponse("服務限流");}// 降級處理public ClientHttpResponse handleFallback(HttpRequest request, byte[] body, ClientHttpRequestExecution execution, BlockException ex) {return new HttpResponse("服務降級");}
}@Service
public class UserService {@Autowiredprivate RestTemplate restTemplate;public User getUserWithOrder(String userId) {// 自動受到Sentinel保護return restTemplate.getForObject("http://order-service/orders?userId=" + userId, User.class);}
}

5.4 Feign整合Sentinel

yaml

feign:sentinel:enabled: true # 開啟Feign對Sentinel的支持

java

// 定義Feign客戶端
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserServiceFeign {@GetMapping("/users/{id}")User getUserById(@PathVariable("id") String id);
}// 降級實現
@Component
public class UserServiceFallback implements UserServiceFeign {@Overridepublic User getUserById(String id) {return new User("0", "服務降級用戶");}
}

六、Sentinel控制臺使用指南

6.1 控制臺安裝與啟動

  1. 下載Sentinel控制臺jar包

  2. 運行命令啟動:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar

  3. 訪問http://localhost:8080,默認賬號密碼均為sentinel

6.2 主要功能界面

  1. 實時監控:查看資源的實時QPS、響應時間等信息

  2. 集群限流:管理集群流控規則

  3. 機器列表:查看接入Sentinel的客戶端機器

  4. 規則管理:配置各種規則(流量、降級、系統、授權等)

6.3 規則配置示例

通過控制臺配置流控規則:

  1. 在"流控規則"頁面點擊"新增流控規則"

  2. 填寫資源名、QPS閾值、流控模式等

  3. 設置流控效果(直接拒絕、Warm Up、勻速排隊)

  4. 點擊"新增"完成規則創建

七、Sentinel高級特性

7.1 集群流控

集群流控能夠解決單機流量不均勻的問題,在集群級別控制總流量。

java

private void initClusterFlowRules() {FlowRule rule = new FlowRule();rule.setResource("clusterResource");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(100);// 設置為集群流控模式rule.setClusterMode(true);rule.setClusterConfig(new ClusterFlowConfig().setFlowId(12345L) // 全局唯一ID.setThresholdType(ClusterRuleConstant.FLOW_THRESHOLD_GLOBAL) // 全局閾值.setFallbackToLocalWhenFail(true) // 失敗時降級到本地流控);FlowRuleManager.loadRules(Collections.singletonList(rule));
}

7.2 動態規則擴展

Sentinel支持多種動態規則數據源,如Nacos、ZooKeeper、Apollo等。

java

@Configuration
public class DataSourceConfig {@Beanpublic DataSource nacosDataSource() {// 從Nacos讀取規則配置ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>("localhost:8848", "sentinel-demo", "sentinel.flowRules",source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));FlowRuleManager.register2Property(flowRuleDataSource.getProperty());return flowRuleDataSource;}
}

7.3 自適應保護算法

Sentinel使用令牌桶算法和漏桶算法相結合的方式實現流量控制,能夠平滑處理突發流量。

八、生產環境最佳實踐

8.1 規則管理策略

  1. 規則持久化:將規則配置到配置中心(如Nacos),避免重啟丟失

  2. 灰度發布:先在小范圍機器上測試規則效果

  3. 監控告警:設置合理的監控指標和告警閾值

8.2 性能優化建議

  1. 資源定義優化:避免創建過多資源,合理使用參數熱點

  2. 異步處理:對非關鍵路徑使用異步調用,減少線程阻塞

  3. 緩存優化:合理使用緩存,減少重復計算和數據庫訪問

8.3 故障排查技巧

  1. 日志分析:關注BlockException日志,識別被限流的資源

  2. 監控指標:通過控制臺查看資源監控指標,定位瓶頸

  3. 鏈路追蹤:結合SkyWalking等工具進行全鏈路分析

九、Sentinel與Hystrix對比

特性SentinelHystrix
流量控制支持QPS、線程數等多種維度主要支持線程池和信號量
熔斷降級基于響應時間、異常比例、異常數基于錯誤百分比
實時監控提供豐富的實時監控界面需結合Hystrix Dashboard
系統保護支持系統負載、CPU使用率等不支持
擴展性支持多種數據源和SPI擴展擴展性相對較弱
規則配置支持動態配置和持久化主要依賴代碼配置

十、總結

Sentinel作為一款強大的流量控制組件,為Java微服務架構提供了全方位的保護。通過靈活的規則配置、實時的監控告警和易于擴展的架構,Sentinel能夠有效防止服務雪崩,保證系統的高可用性。

在實際項目中,我們應該根據業務特點合理配置Sentinel規則,結合監控系統及時發現和處理問題,從而構建穩定可靠的微服務架構。隨著云原生技術的發展,Sentinel也在不斷演進,未來將會提供更多強大的功能和更好的用戶體驗。

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

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

相關文章

詳解 new 和 delete

目錄 一、簡要描述兩者的作用 二、實例解析 1. 淺層區別 2. 深層區別 三、拓展&#xff08;operator new 的妙用&#xff09; 一、簡要描述兩者的作用 new : 是c推崇的 內存申請 方式&#xff0c;擁有比 malloc 更先進的機制 delete :是 對應的 內存釋放方式&#xff0c;…

fMoE論文閱讀筆記

原文鏈接&#xff1a;https://arxiv.org/pdf/2502.05370v1 在混合專家&#xff08;MoE&#xff09;架構中&#xff0c;初始階段涉及輸入樣本通過GateNet進行多分類的鑒別過程&#xff0c;目的是確定最適合處理輸入的專家模型。這個步驟被稱為“experts selection”&#xff0c;…

Linux 禪道開源版安裝

1、下載安裝包安裝wget https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gz tar zxf ZenTaoPMS.18.5.zbox_64.tar.gz/opt/zbox/zbox -ap 81 -mp 3307 # 指定apache服務端口 、 mysql服務端口 /opt/zbox/zbox start #啟動禪道服務( 其他命令 /opt/zbox/…

PySpark基礎知識(python)

PySpark 是 Apache Spark 的 Python API&#xff0c;它允許開發者使用 Python 語言編寫 Spark 應用程序&#xff0c;結合了 Python 的易用性和 Spark 的分布式計算能力&#xff0c;是處理大規模數據的強大工具。 一、安裝與環境配置 安裝方式&#xff1a; 通過 pip 安裝&#…

基于python大數據的電影數據分析可視化系統設計與應用

標題:基于python大數據的電影數據分析可視化系統設計與應用內容:1.摘要 本研究旨在設計并實現一個基于Python的大數據電影數據分析與可視化系統&#xff0c;以解決當前電影行業數據分散、分析效率低及可視化能力不足的問題。系統采用Python語言結合Pandas、NumPy進行數據清洗與…

【PyTorch】圖像多分類

多類圖像分類的目標是為一組固定類別中的圖像分配標簽。目錄 加載和處理數據 搭建模型 定義損失函數 定義優化器 訓練和遷移學習 用隨機權重進行訓練 用預訓練權重進行訓練 加載和處理數據 將使用 PyTorch torchvision 包中提供的 STL-10 數據集&#xff0c;數據集中有…

計算機視覺----opencv實戰----指紋識別的案例

一、數據準備src2.BMPsrc1.BMPsrc.bmpmodel.BMP二、識別原理講解&#xff08;sift特征提取&#xff09;SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不變特征變換&#xff09;是一種經典的圖像特征提取算法&#xff0c;核心優勢是不受圖像尺度縮放、旋轉…

npm 發布流程——從創建組件到發布到 npm 倉庫

1. 準備組件 1.1 創建一個 Vue 組件 假設我們要創建一個簡單的按鈕組件&#xff1a; src/MyButton.vue <template><button class"my-btn" click"$emit(click)"><slot /></button> </template><script setup lang"ts…

MySQL入門基礎指南

目錄 一、什么是數據庫&#xff1f; 僅依靠文件存儲數據存在以下幾個明顯缺點&#xff1a; 數據庫的存儲介質通常包括&#xff1a; 二、主流數據庫介紹 三、客戶端 VS 服務器 四、推薦看的MySQL安裝技術博客 五、數據庫的存儲介質 數據庫的存儲介質主要分為以下兩類&am…

【實戰中提升自己完結篇】分支篇之分支之無線、內網安全與QOS部署(完結)

1 1拓撲 「模擬器、工具合集」復制整段內容 鏈接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支無線部署 說明&#xff1a;分支無線用瘦AP部署&#xff0c;通過VPN直接注冊到總部的AC上面&#xff0c;實現無線的業務提供&…

帶你了解STM32:GPIO通用輸入輸出口

目錄 3.1 GPIO簡介 3.2 GPIO基本結構 3.3 GPIO位結構 輸入部分&#xff1a; 二極管的保護作用&#xff1a; 施密特觸發器&#xff1a; 片上外設端口 輸出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉輸入 3.4.2 模擬輸入 3.4.3 開漏/推挽輸出 3.4.…

Http(自寫)

作為一個程序員&#xff0c;假設我們要在a電腦的進程里發一段數據到b電腦&#xff0c;一般使用socket編程&#xff0c;可選項也就tcp&#xff0c;udp二選一socket本質上就是一個代碼庫tcp有粘包問題&#xff08;字節流&#xff09;&#xff0c;純裸tcp不能之際拿來使用所以我們…

C#使用OpenVinoSharp和PP-Human進行行人檢測

效果 項目依賴 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代碼 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向對象:類、對象與伴生關系

在前幾節中&#xff0c;我們學習了 Scala 的基礎語法和流程控制。現在&#xff0c;我們將深入探索 Scala 作為一門純粹的面向對象語言的核心。在 Scala 中&#xff0c;萬物皆對象&#xff0c;沒有像 Java 那樣的原始類型和靜態成員的區分。本節將重點介紹如何定義對象的藍圖&am…

【大語言模型 58】分布式文件系統:訓練數據高效存儲

分布式文件系統&#xff1a;訓練數據高效存儲 關鍵詞&#xff1a;分布式文件系統、HDFS、Lustre、GlusterFS、數據本地性、I/O優化、存儲架構、大數據存儲、訓練數據管理、存儲性能調優 摘要&#xff1a;本文深入探討大語言模型訓練中的分布式文件系統技術&#xff0c;從存儲架…

【科研繪圖系列】R語言繪制散點圖以及線性回歸擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 數據導入 代碼的開始部分涉及多個數據集的導入,這些數據集涵蓋了不同類型的生態學數據,包括實驗室培養…

SQL 數據庫操作語言詳解

1. SQL 語言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言&#xff0c;主要分為以下幾個子語言&#xff1a;- DQL&#xff08;數據查詢語言&#xff09;&#xff1a;SELECT - 用于數據查詢 - DML&#xff08;數據操作語言&#x…

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法&#xff1a;時域經典法&#xff1b;頻域變換法&#xff1b;“積分變換”最初并不是為了解微分方程&#xff0c;而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題&#xff0c;以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一個由 Google 開發的命令行參數解析庫&#xff0c;主要用于在 C&#xff08;也支持其他語言&#xff09;程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項&#xff0c;避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析&#xff0c;確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…