?Kubernetes的演變:從etcd到分布式SQL的過渡

DevRel領域專家Denis Magda表示,他偶然發現了一篇解釋如何用PostgreSQL無縫替換etcd的文章。該文章指出,Kine項目作為外部etcd端點,可以將Kubernetes etcd請求轉換為底層關系數據庫的SQL查詢。

受到這種方法的啟發,Magda決定進一步探索Kine的潛力,從etcd切換到YugabyteDB。YugabyteDB是一個基于PostgreSQL構建的分布式SQL數據庫。

etcd有什么問題?

etcd是Kubernetes用來存放所有集群數據的鍵值庫。

在Kubernetes集群遇到可擴展性或高可用性(HA)問題之前,它通常不會引起人們的注意。以可擴展和高可用性(HA)的方式管理etcd對于大型Kubernetes部署來說尤其具有挑戰性。

此外,Kubernetes社區對etcd項目的未來開發也有越來越多的擔憂。它的社區規模正在縮小,只有少數維護人員有興趣和能力支持和推進這個項目。

這些問題催生了Kine,這是一個etcd API到SQL的轉換層。Kine正式支持SQLite、PostgreSQL和MySQL,這些系統的使用量正在不斷增長,并且擁有強大的社區。

為什么選擇分布式SQL數據庫?

雖然PostgreSQL、SQLite和MySQL是Kubernetes的理想選擇,但它們是為單一服務器部署而設計和優化的。這意味著它們可能會帶來一些挑戰,特別是對于具有更嚴格的可擴展性和可用性要求的大型Kubernetes部署。

如果開發人員的Kubernetes集群要求RPO(恢復點目標)為零,RTO(恢復時間目標)以秒為單位測量,那么MySQL或PostgreSQL部署的架構和維護將是一個挑戰。如果人們有興趣深入研究這個話題,可以探索PostgreSQL的高可用性選項。

分布式SQL數據庫作為一個相互連接的節點集群,可以跨多個機架、可用區或區域部署。通過設計,它們具有高可用性和可擴展性,因此可以為Kubernetes改進相同的特性。

在YugabyteDB上啟動Kine

而決定使用YugabyteDB作為Kubernetes的分布式SQL數據庫是受到PostgreSQL的影響。YugabyteDB建立在PostgreSQL源代碼的基礎上,在提供自己的分布式存儲實現的同時,重用了PostgreSQL的上半部分(查詢引擎)。

YugabyteDB和PostgreSQL之間的緊密聯系允許開發人員為YugabyteDB重新設計PostgreSQL的Kine實現。然而需要繼續關注,這不會是一個簡單的提升和轉移的故事。

現在,將這些想法轉化為行動,并在YugabyteDB上啟動Kine。為此,使用了一個配備了8個CPU和32GB內存的Ubuntu22.04虛擬機。

首先,在虛擬機上啟動一個三個節點的YugabyteDB集群。在進行分布式之前,可以在單個服務器上對分布式SQL數據庫進行試驗。有多種方法可以在本地啟動YugabyteDB,但作者更喜歡的方法是通過Docker:

Shell mkdir ~/yb_docker_datadocker network create custom-networkdocker run -d --name yugabytedb_node1 --net custom-network \-p 15433:15433 -p 7001:7000 -p 9000:9000 -p 5433:5433 \-v ~/yb_docker_data/node1:/home/yugabyte/yb_data --restart unless-stopped \yugabytedb/yugabyte:latest \bin/yugabyted start --tserver_flags="ysql_sequence_cache_minval=1" \--base_dir=/home/yugabyte/yb_data --daemon=falsedocker run -d --name yugabytedb_node2 --net custom-network \-p 15434:15433 -p 7002:7000 -p 9002:9000 -p 5434:5433 \-v ~/yb_docker_data/node2:/home/yugabyte/yb_data --restart unless-stopped \yugabytedb/yugabyte:latest \bin/yugabyted start --join=yugabytedb_node1 --tserver_flags="ysql_sequence_cache_minval=1" \--base_dir=/home/yugabyte/yb_data --daemon=falsedocker run -d --name yugabytedb_node3 --net custom-network \-p 15435:15433 -p 7003:7000 -p 9003:9000 -p 5435:5433 \-v ~/yb_docker_data/node3:/home/yugabyte/yb_data --restart unless-stopped \yugabytedb/yugabyte:latest \bin/yugabyted start --join=yugabytedb_node1 --tserver_flags="ysql_sequence_cache_minval=1" \--base_dir=/home/yugabyte/yb_data --daemon=false

注:在啟動YugabyteDB節點時設置ysql_sequence_cache_minval=1,以確保數據庫序列可以按順序遞增1。如果沒有這個選項,一個Kine連接到YugabyteDB將緩存序列的下一個100個ID。這可能導致在Kubernetes集群引導期間出現“版本不匹配”錯誤,因為一個Kine連接可能插入ID范圍從1到100的記錄,而另一個Kine連接可能插入ID范圍從101到200的記錄。

接下來,使用PostgreSQL實現啟動一個連接到YugabyteDB的Kine實例:

(1)克隆Kine庫:

Shell 
1 git clone https://github.com/k3s-io/kine.git && cd kine

(2)啟動一個連接到本地YugabyteDB集群的Kine實例:

Shell 
1 go run . --endpoint postgres://yugabyte:yugabyte@127.0.0.1:5433/yugabyte

(3)連接YugabyteDB,確認Kine架構已準備就緒:

SQL psql -h 127.0.0.1 -p 5433 -U yugabyteyugabyte=# \dList of relationsSchema |    Name     |   Type   |  Owner--------+-------------+----------+----------public | kine        | table    | yugabytepublic | kine_id_seq | sequence | yugabyte
(2 rows)

很好,第一次測試成功了。Kine將YugabyteDB視為PostgreSQL,并且啟動時沒有任何問題。現在進入下一個階段:使用YugabyteDB在Kine之上啟動Kubernetes。

使用YugabyteDB在Kine上啟動Kubernetes

Kine可以被各種Kubernetes引擎使用,包括標準的Kubernetes部署、Rancher Kubernetes引擎(RKE)或K3?(一種輕量級的Kubernetes引擎)。為簡單起見,將使用后者。

K3s集群可以通過一個簡單的命令啟動:

(1)停止上一節中啟動的Kine實例。

(2)啟動連接到相同本地YugabyteDB集群的K3s(K3s可執行文件隨Kine提供):

Shell 
curl -sfL https://get.k3s.io | sh -s - server --write-kubeconfig-mode=644 \--token=sample_secret_token \
--datastore-endpoint="postgres://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

(3)Kubernetes啟動時應該沒有問題,可以通過運行以下命令來確認:

Shell k3s kubectl get nodesNAME STATUS ROLES AGE VERSIONubuntu-vm Ready control-plane,master 7m13s v1.27.3+k3s1

Kubernetes在YugabyteDB上無縫運行。這要歸功于YugabyteDB很好的特性和與PostgreSQL的運行時兼容性。這意味著可以重用為PostgreSQL創建的大多數庫、驅動程序和框架。

這可能標志著這一旅程的結束,可以回顧一下K3s日志。在Kubernetes引導期間,日志可能會報告緩慢的查詢,如下所示:

SQL INFO[0015] Slow SQL(total time: 3s) :SELECT*FROM (SELECT(SELECTMAX(rkv.id) AS idFROMkine AS rkv),(SELECTMAX(crkv.prev_revision) AS prev_revisionFROMkine AS crkvWHEREcrkv.name = 'compact_rev_key'), kv.id AS theid, kv.name, kv.created, kv.deleted, kv.create_revision, kv.prev_revision, kv.lease, kv.value, kv.old_valueFROMkine AS kvJOIN (SELECTMAX(mkv.id) AS idFROMkine AS mkvWHEREmkv.name LIKE $1GROUP BYmkv.name) AS maxkv ON maxkv.id = kv.idWHEREkv.deleted = 0OR $2) AS lkvORDER BYlkv.theid ASCLIMIT 10001

在一臺機器上運行YugabyteDB時,這可能不是一個重要的問題,但是一旦切換到分布式設置,這樣的查詢就會成為熱點并產生瓶頸。

因此克隆了Kine源代碼,并開始探索PostgreSQL實現,尋找潛在的優化機會。

YugabyteDB的Kine優化

在這里,Magda與Franck Pachot合作,Pachot是一位精通SQL層優化的數據庫專家,對應用程序邏輯沒有或只有很少的更改。

在檢查了Kine生成的數據庫模式并將EXPLAIN ANALYZE用于某些查詢之后,Franck提出了對任何分布式SQL數據庫都有利的基本優化。

幸運的是,優化不需要對Kine應用程序邏輯進行任何更改。所要做的就是引入一些SQL級別的增強。因此,創建了一個直接支持YugabyteDB的Kine fork。

與此同時,與PostgreSQL相比,YugabyteDB的實現有三個優化:

(1)kine表的主索引已從primary index(id)更改為primary INCEX(id asc)。在默認情況下,YugabyteDB使用哈希分片在集群中均勻分布記錄。然而,Kubernetes在id列上運行了許多范圍查詢,這使得切換到范圍分片是合理的。

(2)通過在索引定義中包括id列,kine_name_prev_revision_uindex索引已被更新為覆蓋索引:

CREATE UNIQUE INDEX IF NOT EXISTS kine_name_prev_revision_uindex ON kine (name asc, prev_revision asc) INCLUDE(id);

YugabyteDB的索引分布類似于表記錄。因此,索引條目可能引用存儲在不同YugabyteDB節點上的id。為了避免節點之間額外的網絡往返,可以將id包含在二級索引中。

(3)Kine在完成Kubernetes請求的同時執行許多連接。如果查詢規劃器/優化器決定使用嵌套循環連接,那么在默認情況下,YugabyteDB查詢層將每次讀取和連接一條記錄。為了加快這個過程,可以啟用批處理嵌套循環連接。YugabyteDB的Kine實現通過在啟動時執行以下語句來實現:

ALTER DATABASE " + dbName + " set yb_bnl_batch_size=1024;

嘗試一下這個優化的YugabyteDB實現。

首先,停止之前的K3s服務,并從YugabyteDB集群中刪除Kine模式:

(1)停止并刪除K3s服務:

Shell sudo /usr/local/bin/k3s-uninstall.shsudo rm -r /etc/rancher

(2)刪除模式:

SQL psql -h 127.0.0.1 -p 5433 -U yugabytedrop table kine cascade;

接下來,啟動一個為YugabyteDB提供優化版本的Kine實例:

(1)克隆fork:

Shell git clone https://github.com/dmagda/kine-yugabytedb.git && cd kine-yugabytedb

(2)啟動Kine:

Shell go run . --endpoint "yugabytedb://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

Kine的啟動沒有任何問題。現在唯一的區別是,不是在連接字符串中指定“postgres”,而是指示“yugabytedb”以啟用優化的YugabyteDB實現。關于Kine和YugabyteDB之間的實際通信,Kine繼續使用Go的標準PostgreSQL驅動程序。

在Kine的優化版本上構建Kubernetes

最后,在這個優化版本的Kine上啟動k3。

要做到這一點,首先需要從資源中構建k3:

(1)停止上一節中啟動的Kine實例。

(2)克隆K3s存儲庫:

Shell git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s

(3)打開go.mod文件,并在replace(..)部分的末尾添加以下行:

Go github.com/k3s-io/kine => github.com/dmagda/kine-yugabytedb v0.2.0

這條指令告訴Go使用帶有YugabyteDB實現的最新版本的Kinefork。

(4)啟用對私有倉庫和模塊的支持:

Shell go env -w GOPRIVATE=github.com/dmagda/kine-yugabytedb

(5)確保更改生效:

Shell go mod tidy

(6)準備構建K3s的完整版本:

Shell mkdir -p build/data && make download && make generate

(7)構建完整版本:

Shell SKIP_VALIDATE=true make

完成構建大約需要五分鐘。

注意:一旦停止使用這個自定義K3s構建,可以按照說明卸載它。

在優化的Kubernetes版本上運行示例工作負載

在構建完成后,可以使用Kine的優化版本啟動K3s。

(1)導航到包含構建構件的目錄:

Shell cd dist/artifacts/

(2)通過連接到本地YugabyteDB集群啟動K3s:

Shell sudo ./k3s server \--token=sample_secret_token \--datastore-endpoint="yugabytedb://yugabyte:yugabyte@127.0.0.1:5433/yugabyte"

(3)確認Kubernetes啟動成功:

Shell sudo ./k3s kubectl get nodesNAME STATUS ROLES AGE VERSIONubuntu-vm Ready control-plane,master 4m33s v1.27.4+k3s-36645e73

現在,部署一個示例應用程序,以確保Kubernetes集群不僅僅能夠自我引導:

(1)采用Kubernetes克隆一個庫的例子:

Shell git clone https://github.com/digitalocean/kubernetes-sample-apps.git

(2)部署Emojivoto應用:

Shell sudo ./k3s kubectl apply -k ./kubernetes-sample-apps/emojivoto-example/kustomize

(3)確保所有部署和服務成功啟動:

Shell sudo ./k3s kubectl get all -n emojivotoNAME READY STATUS RESTARTS AGEpod/vote-bot-565bd6bcd8-rnb6x    1/1 Running 0 25spod/web-75b9df87d6-wrznp  1/1 Running 0 24spod/voting-f5ddc8ff6-69z6v   1/1 Running 0 25spod/emoji-66658f4b4c-wl4pt  1/1 Running 0 25sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/emoji-svc   ClusterIP 10.43.106.87 <none> 8080/TCP,8801/TCP 27sservice/voting-svc   ClusterIP 10.43.14.118 <none> 8080/TCP,8801/TCP 27sservice/web-svc   ClusterIP 10.43.110.237 <none> 80/TCP 27sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/vote-bot  1/1 1 1 26sdeployment.apps/web   1/1 1 1 25sdeployment.apps/voting 1/1 1 1 26sdeployment.apps/emoji 1/1 1 1 26sNAME DESIRED CURRENT READY AGEreplicaset.apps/vote-bot-565bd6bcd8  1 1 1 26sreplicaset.apps/web-75b9df87d6 1 1 1 25sreplicaset.apps/voting-f5ddc8ff6  1 1 1 26sreplicaset.apps/emoji-66658f4b4c  1  1   1   26s

(4)使用CLUSTER_IP:80調用服務/web svc以觸發應用程序邏輯:

Shell curl 10.43.110.237:80

應用程序將使用以下HTML進行響應:

HTML <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Emoji Vote</title><link rel="icon" href="/img/favicon.ico"><script async src="https://www.googletagmanager.com/gtag/js?id=UA-60040560-4"></script><script>window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'UA-60040560-4');</script></head><body><div id="main" class="main"></div></body><script type="text/javascript" src="/js" async></script></html>

結語

完成工作!Kubernetes現在可以使用YugabyteDB作為其所有數據的分布式和高可用性SQL數據庫。

現在可以進入下一階段:在跨多個可用性區域和區域的真正云計算環境中部署Kubernetes和YugabyteDB,并測試解決方案如何處理各種中斷。

軟件開發構建工具

JNPF快速開發平臺是一款基于SpringBoot+Vue3的全棧開發平臺,采用微服務、前后端分離架構,基于可視化流程建模、表單建模、報表建模工具,快速構建業務應用,平臺即可本地化部署,也支持K8S部署。

應用體驗地址:https://www.jnpfsoft.com/?csdn,操作一下試試吧!

引擎式軟件快速開發模式,除了上述功能,還配置了圖表引擎、接口引擎、門戶引擎、組織用戶引擎等可視化功能引擎,基本實現頁面UI的可視化搭建。內置有百種功能控件及使用模板,使得在拖拉拽的簡單操作下,也能大限度滿足用戶個性化需求。由于JNPF平臺的功能比較完善,本文選擇這項工具進行展開,使你更加直觀看到低代碼的優勢

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

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

相關文章

軟件測試技術之如何編寫測試用例(6)

四、客戶端兼容性測試 1、平臺測試 市場上有很多不同的操作系統類型&#xff0c;最常見的有Windows、Unix、Macintosh、Linux等。Web應用系統的最終用戶究竟使用哪一種操作系統&#xff0c;取決于用戶系統的配置。這樣&#xff0c;就可能會發生兼容性問題&#xff0c;同一個應…

求Win11系統virtualbox+vagrant安裝MacOS虛擬機

文章目錄 一、背景二、素材2.1、virtualboxvagrant 三、問題3.1、安裝失敗3.2、第二個失敗3.3、網絡說 四、求助 一、背景 題主&#xff0c;主要是窮&#xff0c;沒錢買mac筆記本或相關系統的蘋果產品&#xff0c;哈哈&#xff0c;偶爾也有用過MacOS系統&#xff0c;只是還沒有…

actuator/prometheus使用pushgateway上傳jvm監控數據

場景 準備 prometheus已經部署pushgateway服務&#xff0c;訪問{pushgateway.server:9091}可以看到面板 實現 基于springboot引入支持組件&#xff0c;版本可以 <!--監控檢查--><dependency><groupId>org.springframework.boot</groupId><artifa…

H3C交換機如何配置本地端口鏡像并在PC上使用Wireshake抓包

環境: H3C S6520-26Q-SI version 7.1.070, Release 6326 Win 10 專業版 Wireshake Version 4.0.3 問題描述: H3C交換機如何配置本地端口鏡像并在PC上使用Wireshake抓包 解決方案: 配置交換機本地端口鏡像 1.進入系統視圖,并創建本地鏡像組1 <H3C>system-vie…

高效反編譯luac文件

對于游戲開發人員,有時候希望從一些游戲apk中反編譯出源代碼,進行學習,但是如果你觸碰到法律邊緣,那么你要非常小心。 這篇文章,我針對一些用lua寫客戶端或者服務器的編譯過的luac文件進行反編譯,獲取其源代碼的過程。 這里我不贅述如何反編譯解壓apk包的過程了,只說重點…

【【STM32之GPIO】】

STM32之GPIO 學完了正點原子自帶的視頻課之后感覺仍然一知半解現在更新一下來自其他版本的STM32學習 GPIO 就是 General Purpose Input Output 中文名叫通用輸入輸出口 可配置8種輸入輸出模式 引腳電平 0V~3.3V 部分引腳可容忍5V 輸出模式下可控制端口輸出高低電平&#xff…

ubuntu bind dns服務配置

sudo apt-get install bind9 內網搭建DNS服務器&#xff0c;大多數是解析純內網地址使用。但是偶爾也需要解析外網的地址&#xff0c;所以我們可以配置DNS沒有添加A記錄的URL時&#xff0c;forward到外網DNS服務器或者內網的其他DNS服務器解析。 打開配置文件&#xff1a; sud…

Leetcode 動態規劃

動態規劃&#xff1a; 72. Edit Distance class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1, 0));for (int i 0; i < word1.size(); i) dp[i][0] i;for …

grafana-zabbix基礎操作篇------導入數據源

文章目錄 一、grafana的安裝1.1、下載地址1.2、下載后導入所安裝機器1.3、yum安裝解決依賴1.4、啟動grafana1.5、查看端口是否啟用&#xff08;端口默認3000&#xff09;1.6、瀏覽器訪問 二、添加zabbix數據源2.1、導入數據源 **下一篇 我們講講構建儀表板的操作** 今天&#x…

如何在工作中利用AIGC提質增效?

引言 人工智能技術快速發展&#xff0c;以 ChatGPT 為代表的新的人工智能語言模型的出現與更迭&#xff0c;引發人們極大的興奮和關注。越來越多的企業開始將 AI 技術應用到生產流程&#xff0c;以提高工作效率和生產力。AIGC&#xff08;AI Generated Content&#xff09;是人…

UE4/UE5 照明構建失敗 “Lightmass crashed”解決“數組索引越界”

在構建全局光照時,經常會出現“Lightmass crashed”的錯誤,導致光照構建失敗。本文將分析這一問題的原因,并給出解決建議。 UE4 版本4.26 報錯如下&#xff1a; <None> Lightmass crashed: Assertion failed: (Index > 0) & (Index < ArrayNum) [File:d:\bu…

在 ubuntu 18.04 上使用源碼升級 OpenSSH_7.6p1到 OpenSSH_9.3p1

1、檢查系統已安裝的當前 SSH 版本 使用命令 ssh -V 查看當前 ssh 版本&#xff0c;輸出如下&#xff1a; OpenSSH_7.6p1 Ubuntu-4ubuntu0.7, OpenSSL 1.0.2n 7 Dec 20172、安裝依賴&#xff0c;依次執行以下命令 sudo apt update sudo apt install build-essential zlib1g…

linux 環境收集core文件步驟

Linux環境下進程發生異常而掛掉&#xff0c;通常很難查找原因&#xff0c;但是一般Linux內核給我們提供的核心文件&#xff0c;記錄了進程在崩潰時候的信息&#xff0c;在C語言類的大型項目中&#xff0c;有助于深入定位。其配置流程如下&#xff1a; 1 查看生成core文件開關是…

BOXTRADE-天啟量化分析平臺 主要功能介紹

BOXTRADE-天啟量化分析平臺 主要功能介紹 potato 數學 web 緣起 月暈而風&#xff0c;礎潤而雨 BOXTRADE-天啟量化 歡迎來到天啟量化&#xff01;這是一個專注于量化分析的網站。我們致力于為用戶提供市場行情技術指標和量化策略分析方面的優質內容和資源。 我們的使命是 做…

第4章 微服務框架主體搭建

mini商城第4章 微服務框架主體搭建 一、課題 框架搭建 二、回顧 1、整體業務功能分析 2、根據業務需求設計表結構及字段 三、目標 1、版本控制器的搭建使用 2、能獨立自主的搭建微服務框架 3、學會考慮一些公共的工具組件 4、網關模塊的應用 四、內容 第1章 版本控…

3D虛擬形象數字替身的制作及應用介紹

“虛擬數字人”這一詞匯已經深入人心。從虛擬偶像、虛擬代言人到虛擬主播、虛擬員工各種類型虛擬數字形象不斷進入公眾視野&#xff0c;由于其與Z世代的獨特親和力以及與新媒體平臺的高度適配性&#xff0c;虛擬數字人在各個領域都在呈崛起之勢&#xff0c;并且有著深度的融合&…

167. 兩數之和 II - 輸入有序數組

兩數之和 II - 輸入有序數組 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < inde…

萬字長文·通俗易懂·一篇包掌握——輸入/輸出·文件操作(c語言超詳細系列)(二)

前言&#xff1a;Hello&#xff0c;大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;上一節我們主要學習了格式化輸入輸出的基本內容&#xff0c;這一節我們對格式化進行更加深入的了解&#xff0c;對文件概念進行介紹&#xff0c;并且對輸入、輸出與文件讀寫的基本概念…

SpringBoot統?功能處理

前言&#x1f36d; ??????SSM專欄更新中&#xff0c;各位大佬覺得寫得不錯&#xff0c;支持一下&#xff0c;感謝了&#xff01;?????? Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 本章是講Spring Boot 統?功能處理模塊&#xff0c;也是 AOP 的實戰環節&…

18-組件化開發 根組件

組件化開發 & 根組件: 1. 組件化:一個頁面可以拆分成一個個組件&#xff0c;每個組件有著自己獨立的結構、樣式、行為. 好處:便于維護&#xff0c;利于復用->提升開發效率 組件分類: 普通組件 , 根組件 2. 根組件:整個應用最上層的組件&#xff0c;包裹所有普通小組件…