本文最初發(fā)布于 sergiuoltean.com 網(wǎng)站, 經(jīng)原作者授權(quán)由 InfoQ 中文站翻譯并分享。
眾所周知,架構(gòu)特點(diǎn)多以"ility"結(jié)尾(例如 scalability、deployability),也被稱(chēng)為 NFR(非功能需求)、質(zhì)量屬性。架構(gòu)的特點(diǎn)沒(méi)有固定清單,但標(biāo)準(zhǔn)是有的,就是 ISO25010:
我們從業(yè)務(wù)需求(業(yè)務(wù)特征)、我們期望的系統(tǒng)運(yùn)營(yíng)方式(運(yùn)營(yíng)特征)中總結(jié)出這些特點(diǎn),它們是隱式的、貫穿各領(lǐng)域,是架構(gòu)師在字里行間能看出來(lái)的特點(diǎn)?!盾浖軜?gòu)基礎(chǔ)》書(shū)中的這張表是隱藏特點(diǎn)的一個(gè)例子。
《實(shí)踐中的軟件架構(gòu)》一書(shū)中對(duì)架構(gòu)特點(diǎn)解釋得很清楚。
刺激的來(lái)源 (Source of Stiumulus)可以是角色、觸發(fā)事件的東西等。刺激 (Stimulus)是實(shí)際產(chǎn)生的事件。環(huán)境(Environment)代表事件發(fā)生的系統(tǒng)條件。工件 (Artifact)是系統(tǒng)中正在被刺激的部分。響應(yīng) (Response)就是工件在我們應(yīng)該度量(measure)的刺激下的行為方式。背景了解完畢,讓我們來(lái)看具體的特點(diǎn)。
1. 性能
根據(jù) Smith 所說(shuō),“性能是指響應(yīng)能力:響應(yīng)特定事件所需的時(shí)間,或給定時(shí)間間隔內(nèi)處理的事件數(shù)”。性能可以有以下指標(biāo):
- 延遲 。表示獲得響應(yīng)之前經(jīng)過(guò)的時(shí)間,這里指的是一段時(shí)間。我們有最小延遲(開(kāi)始時(shí)間)和 截止日期 (結(jié)束時(shí)間)。衡量延遲的其他因素包括優(yōu)先級(jí)(我們?cè)谄渲胁榭错憫?yīng)的順序)和抖動(dòng) (隨時(shí)間觀察到的延遲波動(dòng))。
- 吞吐量。是指在固定時(shí)間間隔內(nèi)獲得的響應(yīng)數(shù)。但為了提高精度,我們應(yīng)該度量多個(gè)時(shí)間間隔。
- 可用容量。以上度量的結(jié)合體。在不超出延遲要求的情況下可實(shí)現(xiàn)的最大吞吐量。
- 可調(diào)度的利用率。利用率是資源繁忙時(shí)間的百分比,而可調(diào)度的利用率是滿(mǎn)足一定時(shí)間要求的最大利用率。
- 數(shù)據(jù)丟失。如果使用緩存來(lái)提高性能,那么緩存未命中將成為性能指標(biāo)。
提高性能的技術(shù)
首先我們要了解影響性能的因素。
- 需求 。我們需要多少資源?
- 硬件 。我們需要什么類(lèi)型的資源?比如 CPU、內(nèi)存、I/O 設(shè)備、網(wǎng)絡(luò)等。系統(tǒng)是否運(yùn)行在正常條件下?還是在重負(fù)載下?
- 軟件 。我們使用的框架是否是高性能的?有沒(méi)有使用緩存?是否涉及某種反射(java)?是否做了最大的優(yōu)化工作?
我們需要控制需求,為此我們可以使用隊(duì)列、節(jié)流和背壓機(jī)制。通過(guò)改進(jìn)算法,我們可以減少資源需求。通過(guò)設(shè)置最大響應(yīng)時(shí)間(超時(shí))和某種優(yōu)先級(jí),我們可以進(jìn)一步控制需求。
可以使用垂直縮放來(lái)獲得更好的響應(yīng)時(shí)間。提高性能的另一種方法是并發(fā)。還需要注意阿姆達(dá)爾定律。
加速效果的瓶頸是程序的串行部分。例如,如果 95%的代碼可以并行化,則并行計(jì)算的理論最大加速比將是 20 倍。
限制你的資源、對(duì)所有內(nèi)容(線(xiàn)程、隊(duì)列)實(shí)施固定的生產(chǎn)限制、規(guī)劃資源使用并盡可能避免爭(zhēng)用……這些說(shuō)起來(lái)容易,做起來(lái)難。還可以充分利用緩存、水平縮放、添加多個(gè)處理單元等。
你應(yīng)該了解你的框架和你的數(shù)據(jù)庫(kù),并優(yōu)化它們。
2. 可靠性
根據(jù)《牛津詞典》,可靠意味著質(zhì)量或性能始終如一,且能夠被信任??煽啃钥梢杂闷骄收祥g隔時(shí)間(MTBF)來(lái)表示,可靠性 =exp(-t/MTBF)。
可靠性很難用數(shù)字度量。我們可以用一些軟件指標(biāo)衡量復(fù)雜度和代碼覆蓋率,以了解可靠性的邊緣情況。適應(yīng)度函數(shù)也可用于度量可靠性。未解決問(wèn)題的數(shù)量、成功的構(gòu)建和部署的數(shù)量也是一些可用指標(biāo)。ISO-9001 是衡量可靠性的另一種方法。
提高可靠性的技術(shù)
遵循最佳工程實(shí)踐將產(chǎn)生更好的產(chǎn)品。使用更好的管理實(shí)踐和流程,可以實(shí)現(xiàn)更高的可靠性。突變測(cè)試技術(shù)會(huì)讓系統(tǒng)考慮邊緣情況?;煦鐪y(cè)試是提高可靠性的另一個(gè)重要工具??傊覀円獜?qiáng)化系統(tǒng)來(lái)提高可靠性。
3. 可用性
表示可用系統(tǒng)時(shí)間與總工作時(shí)間的比率。這是可靠性之上的另一層。它是系統(tǒng)掩蓋或修復(fù)特定閾值(例如時(shí)間間隔)內(nèi)故障的能力。可用性可以表示為
MTBF= 平均無(wú)故障時(shí)間;MTTR= 平均修復(fù)時(shí)間
于是我們計(jì)算出下表:
提高可用性的技術(shù)
為了提升它,首先我們需要檢測(cè)潛在的故障。
檢測(cè)到異常情況后,我們可以進(jìn)行干預(yù)。
4. 彈性
彈性指的是系統(tǒng)遇到問(wèn)題時(shí)可以降級(jí)(而非中斷服務(wù)),等待問(wèn)題修復(fù)完成,表示的是系統(tǒng)在遇到嚴(yán)重故障時(shí)的持續(xù)運(yùn)行能力。為實(shí)現(xiàn)彈性,需要提前設(shè)置防御機(jī)制(斷路器模式)。彈性有時(shí)被稱(chēng)為容錯(cuò)性 。彈性系統(tǒng)指的是可以適應(yīng)壓力并持續(xù)運(yùn)行的系統(tǒng)。很難用數(shù)字指標(biāo)來(lái)度量彈性。
增強(qiáng)彈性的技術(shù)
首先是確定潛在風(fēng)險(xiǎn):系統(tǒng)有哪些關(guān)鍵功能?哪些硬件至關(guān)重要?然后我們需要實(shí)施保護(hù)策略,為此需要檢查哪些事件可能導(dǎo)致這些重要部件發(fā)生故障。找出風(fēng)險(xiǎn)因素后就需要確定容忍閾值。具體的保護(hù)策略包括對(duì)請(qǐng)求數(shù)和線(xiàn)程數(shù)施加限制、緩存相同的請(qǐng)求、批量發(fā)送請(qǐng)求等。
5. 可信賴(lài)性
它包括可靠性 、可用性 、彈性 、可持續(xù)性 (可用性 / 彈性的比值)、可恢復(fù)性 (彈性函數(shù))和穩(wěn)健性 (可靠性函數(shù))。我們應(yīng)該始終將它們視為一個(gè)整體。
拿一輛汽車(chē)來(lái)說(shuō),如果它是新車(chē)并且是知名的可靠品牌(例如梅賽德斯),我們可以說(shuō)它是可靠的。它有備用輪胎,所以有一些可用性。四輪驅(qū)動(dòng)意味著彈性,其中兩輪出故障還有兩輪能工作(但性能會(huì)下降)??沙掷m(xù)性是可用性(備用輪胎)和彈性(四輪驅(qū)動(dòng))的綜合。健壯性在這里可以指道路通過(guò)能力。如果汽車(chē)是電動(dòng)的,那么充電速度就是一個(gè)可恢復(fù)性指標(biāo)。
6. 可伸縮性
它是系統(tǒng)在重負(fù)載下在可接受的閾值內(nèi)的執(zhí)行能力。它分為手動(dòng)和自動(dòng)可伸縮性?xún)煞N,后者也叫靈活性 。當(dāng)負(fù)載突增時(shí),系統(tǒng)會(huì)做出反應(yīng)并水平縮放(添加 / 刪除更多實(shí)例)。我們可以查看 CPU 和內(nèi)存來(lái)觀察這些突發(fā)事件。這些突發(fā)操作完成后,系統(tǒng)將殺死不必要的實(shí)例,從而降低成本。垂直伸縮意味著我們向系統(tǒng)添加了更多物理資源(例如更多的內(nèi)存、更好的 cpu)。
實(shí)現(xiàn)可伸縮性的技術(shù)
這里涉及到 devops,最好使用 aws fargate 之類(lèi)的云服務(wù)。下圖中可以看到放大和縮小策略。
7. 安全性
它實(shí)際上是許多特點(diǎn)的集合: 機(jī)密性是指系統(tǒng)保護(hù)用戶(hù)數(shù)據(jù)安全的能力; 完整性是保護(hù)外部資源免遭篡改的能力; 身份驗(yàn)證允許用戶(hù)訪問(wèn)系統(tǒng); 授權(quán)則告訴用戶(hù)可以訪問(wèn)系統(tǒng)的哪些部分。授權(quán)通常使用 RBAC、ACL 或 ABAC 來(lái)實(shí)現(xiàn)。 不可否認(rèn)性保證了消息的發(fā)送者不能否認(rèn)自己發(fā)送了消息,并且接收者也不能否認(rèn)自己接收了消息。
增強(qiáng)安全性的技術(shù)
首先我們需要檢測(cè)。
針對(duì)攻擊行為,我們需要制定靈活的應(yīng)對(duì)策略。大多數(shù)情況下我們可以撤消訪問(wèn)權(quán)限,在某些極端情況下我們可以關(guān)閉系統(tǒng),當(dāng)然最好還是避免后一種情況出現(xiàn)。最好使用成熟的安全解決方案,自行實(shí)現(xiàn)往往不是好辦法。
8. 互操作性
它表示系統(tǒng)與外部系統(tǒng)通信的能力。合約接口是互操作性中最重要的概念,其涵蓋了通信的所有方面,包括錯(cuò)誤處理。
改善互操作性的技術(shù)
最好的策略是使用企業(yè)集成模式。如果用到多個(gè)通信協(xié)議,這種策略就是最佳方法。
9. 可調(diào)整性
也稱(chēng)為可變性 ,其描述了系統(tǒng)變化的難易程度。一般來(lái)說(shuō)它是一個(gè)隱含的特征。作為架構(gòu)師,你要知道系統(tǒng)變化的概率是未知的,但一旦出現(xiàn)變化,系統(tǒng)應(yīng)該能夠優(yōu)雅地應(yīng)對(duì)。變化是軟件世界中唯一確定的事物。話(huà)雖如此,我們不能將整個(gè)系統(tǒng)都設(shè)計(jì)為可變組件。如果每個(gè)組件都是即插即用組件,設(shè)計(jì)就做不完了。因此我們需要找到那些變化概率很高的部分。
改進(jìn)可調(diào)整性的技術(shù)
有兩個(gè)維度。作為一名架構(gòu)師,你需要確定哪些部分具有較高的變化概率;作為軟件工程師,你必須確保這些部分容易改動(dòng)。遵循 SOLID 原則是一個(gè)很好的開(kāi)始??梢允褂眠m應(yīng)度函數(shù)度量傳入和傳出耦合。我們需要計(jì)算變化成本。比如要構(gòu)建一個(gè) UI 表單,它需要的位置比我們最初想像的要多,則我們可以復(fù)制粘貼代碼并進(jìn)行必要的調(diào)整,也可以構(gòu)建一個(gè)新組件并插進(jìn)來(lái)。然后我們得到了變化的成本:
N x 編寫(xiě)代碼的成本(復(fù)制粘貼)<= 編寫(xiě)組件 (N x 將其插進(jìn)來(lái)的成本)
還需要考慮時(shí)間,觀察較長(zhǎng)的時(shí)間才能得到可靠的觀察結(jié)果。
10. 可部署性
所有系統(tǒng)都應(yīng)封裝在某種工件中,可以是 war、jar、ear、apk、dll、gem 等。它們被部署在能夠運(yùn)行它們的環(huán)境中。由于 docker 的進(jìn)化,現(xiàn)在我們可以在一臺(tái)機(jī)器上擁有多個(gè)環(huán)境??刹渴鹦允且环N將代碼轉(zhuǎn)換為客戶(hù)可用產(chǎn)品的機(jī)制。
改善可部署性的技術(shù)
最有效的是實(shí)施持續(xù)集成 / 持續(xù)部署(CI/CD)。認(rèn)真的話(huà),每次代碼推送都將觸發(fā)一個(gè)生產(chǎn)部署。為此,應(yīng)通過(guò)適應(yīng)度函數(shù)和自動(dòng)化測(cè)試來(lái)保護(hù)你的代碼。它是抗脆弱性的關(guān)鍵部分。我們希望能按需部署,一鍵完成工作。我們也會(huì)部署硬件。使用基礎(chǔ)架構(gòu)即代碼之類(lèi)的技術(shù)可以提高效率。
11. 可測(cè)試性
在所有系統(tǒng)中它都是一個(gè)重要特征。我們必須確保構(gòu)建的系統(tǒng)尊重了客戶(hù)的需求。復(fù)雜的系統(tǒng)很難測(cè)試。以微服務(wù)架構(gòu)為例,我們有很多獨(dú)立開(kāi)發(fā)的活動(dòng)部件。這個(gè)特征經(jīng)常會(huì)讓步給其他特征。為了使系統(tǒng)可測(cè)試,我們需要能控制每個(gè)組件的輸入和輸出。
改善可測(cè)試性的技術(shù)
請(qǐng)盡量控制系統(tǒng)的復(fù)雜性。我們應(yīng)該構(gòu)建較小的組件,不要重新發(fā)明輪子;還應(yīng)該編寫(xiě)可測(cè)試的代碼,在適當(dāng)?shù)奈恢脩?yīng)用 TDD。
12. 簡(jiǎn)單性
這條特征是很難實(shí)現(xiàn)的。一切都是權(quán)衡取舍,而大多數(shù)情況下這一條都會(huì)被犧牲掉。但如果我們需要在有限的時(shí)間內(nèi)快速構(gòu)建某些東西,那么就應(yīng)該優(yōu)先考慮簡(jiǎn)單性。在構(gòu)建 MVP(最小可行產(chǎn)品)時(shí),我們關(guān)心的只有簡(jiǎn)單性。但請(qǐng)注意,實(shí)現(xiàn)目標(biāo)之后,我們不應(yīng)丟掉所有東西。不要與 PoC(概念驗(yàn)證)或某種 R&D 混淆。 可重用性在這里也很重要。
改善簡(jiǎn)單性的技術(shù)
可以構(gòu)建粗粒度的組件;使用 RAD 框架,例如 ApacheIsis、Vaadin 或 JHipster;犧牲簡(jiǎn)單性之前請(qǐng)確保自己能承受對(duì)應(yīng)的代價(jià);遵循 KISS 原則。記住時(shí)間是關(guān)鍵:先跑起來(lái),再考慮美觀和性能。
13. 可移植性
指的是系統(tǒng)從一個(gè)操作系統(tǒng)移植到另一個(gè)的能力,它會(huì)影響編程語(yǔ)言的選擇。例如,我們知道為了運(yùn)行 Java 代碼需要一個(gè) JVM,因此問(wèn)題就是“JVM 是否可移植?”答案是肯定的。另一個(gè)例子是 golang:它打包為二進(jìn)制文件,不需要外部依賴(lài)項(xiàng),因此是可移植的。一些微軟專(zhuān)屬技術(shù)就不行,它們只能運(yùn)行在微軟操作系統(tǒng)中。
改善可移植性的技術(shù)
一個(gè)顯而易見(jiàn)的選項(xiàng)就是容器化、docker。一個(gè) docker 引擎能夠運(yùn)行多個(gè)隱藏了實(shí)現(xiàn)細(xì)節(jié)的 docker 容器。
14. 易用性
談到易用性時(shí)通常會(huì)提到可配置性 ,即用戶(hù)自定義系統(tǒng)的能力,比如通過(guò) UI 主題更改外觀和配置系統(tǒng)行為(例如控制用戶(hù)訪問(wèn)權(quán)限等)。還有本地化,也稱(chēng)為 i18n(internationalization)。它指的是系統(tǒng)支持多種標(biāo)準(zhǔn)的能力,一般是通過(guò)用戶(hù)體驗(yàn)(UX)實(shí)現(xiàn)的。這里的標(biāo)準(zhǔn)指的是語(yǔ)言、貨幣、公制單位、字符編碼等。本地化資源通常是靜態(tài)的。
可訪問(wèn)性是另一個(gè)易用性特征。世界上有些人是殘疾的(失明、聽(tīng)力受損、色盲),我們?nèi)绾未_保這些人可以受益于我們的系統(tǒng)呢?對(duì)于色盲來(lái)說(shuō),選擇顏色會(huì)花很多時(shí)間。Siri/Alexa 是盲人的好幫手??紤]可訪問(wèn)性時(shí),請(qǐng)想到我們的祖父母是不是能方便地使用我們的系統(tǒng)。
另外還有可支持性 ,比如說(shuō)幫助頁(yè)面或者 24×7 技術(shù)支持。我們應(yīng)該努力讓系統(tǒng)直觀易用,這會(huì)影響可學(xué)習(xí)性,也就是用戶(hù)習(xí)慣系統(tǒng)所需的時(shí)間。用戶(hù)培訓(xùn)和幫助頁(yè)面之類(lèi)的策略很好用。
15. 可擴(kuò)展性
它是描述系統(tǒng)對(duì)即插即用組件需求程度的特征。對(duì)于使用內(nèi)核架構(gòu)的系統(tǒng)來(lái)說(shuō),這是很重要的特征。Eclipse Platform 和 OSGI 標(biāo)準(zhǔn)就是經(jīng)典的例子。
16. 抗脆弱性
它是系統(tǒng)應(yīng)對(duì)壓力、沖擊、波動(dòng)、噪聲、錯(cuò)誤、故障或攻擊的能力。
改善抗脆弱性的技術(shù)
首先我們要敲打敲打系統(tǒng)??梢允褂?CI/CD,它們本來(lái)就是做這種事的。每次代碼更改都必須投入生產(chǎn)。當(dāng)然,我們也要有防御機(jī)制,適應(yīng)度函數(shù)就是個(gè)好方法; Simian Army 也是個(gè)不錯(cuò)的工具。
17. 可升級(jí)性
它是指系統(tǒng)無(wú)縫升級(jí)自身的能力。對(duì)于非 Web 產(chǎn)品(例如 App Store 和 Google Play),這很容易實(shí)現(xiàn),因?yàn)樗鼈兊纳?jí)能力是嵌入到 OS 中的;涉及到 Web 應(yīng)用時(shí),事情就麻煩多了。
改善可升級(jí)性的技術(shù)
首先我們需要為服務(wù)提供版本控制。下一步是使用藍(lán)綠部署或金絲雀部署等策略進(jìn)行零停機(jī)的時(shí)間部署。
18. 合規(guī)性
不管我們需要的是哪種第三方工具和框架,都應(yīng)該得到它們的合法授權(quán)。我們需要重視開(kāi)源軟件的合規(guī)性因素,因?yàn)樗鼈兛赡軙?huì)附帶一些我們不想要的額外約束。沒(méi)有人愿意暴露自己的源代碼,因此我們應(yīng)該遠(yuǎn)離 GPL 許可證。在歐盟,《GDPR》已成為強(qiáng)制規(guī)定,因此我們需要確保系統(tǒng)符合其規(guī)定。還要考慮一些 ISO 標(biāo)準(zhǔn),公司可能需要遵循某些流程才能符合它們的要求。
改善合規(guī)性的技術(shù)
理想情況下,每家公司都應(yīng)該有一個(gè)法律部門(mén),但現(xiàn)實(shí)并非如此。適應(yīng)度函數(shù)(例如許可證檢查)可以保護(hù)我們免受列入黑名單的許可證的影響。在設(shè)計(jì)系統(tǒng)時(shí),我們必須找到一種保護(hù)用戶(hù)數(shù)據(jù)隱私的方法。
19. 成本
可能是最重要的架構(gòu)特點(diǎn)。一切都有成本,虛擬的、還是現(xiàn)實(shí)的都一樣。任何成本都可以換算成金錢(qián)。如果我們需要購(gòu)買(mǎi)某些工具(IDE)、云服務(wù)(例如 AWS)、第三方框架(例如 new-relic)的許可證,則總會(huì)產(chǎn)生財(cái)務(wù)成本。開(kāi)發(fā)團(tuán)隊(duì)也要發(fā)工資,學(xué)習(xí)新技術(shù)或培訓(xùn)團(tuán)隊(duì)成員需要花錢(qián)。不尊重敏捷宣言是有代價(jià)的;錯(cuò)誤的代碼要付出代價(jià);缺少單元測(cè)試會(huì)有代價(jià);缺少 CI/CD 會(huì)有代價(jià);沒(méi)有基礎(chǔ)架構(gòu)即代碼也會(huì)有代價(jià)……這個(gè)列表是沒(méi)有盡頭的。
降低成本的技術(shù)
幫助客戶(hù)控制成本是我們的責(zé)任。我們需要區(qū)分單純的成本和投資,并讓客戶(hù)相信投資是劃算的。
以 Scrum 流程為例,我個(gè)人認(rèn)為它沒(méi)什么用。在一個(gè)固定的周期(通常為兩周)中,我們有這么多的儀式(計(jì)劃、站會(huì)、演示、回顧),然后根據(jù)(猜出來(lái)的)估計(jì)值做計(jì)算,結(jié)果 Sprint 完成度 100%只是偶然而非必然。我們需要敏捷和適應(yīng),而不是盲目地遵循流程。我們應(yīng)該減少會(huì)議和儀式,這樣成本就會(huì)下降。我們應(yīng)該專(zhuān)注于完成工作的本質(zhì)要素。
測(cè)試是必要的投資,快速前進(jìn)的唯一方法就是正確前進(jìn)。我們必須說(shuō)服客戶(hù),從長(zhǎng)遠(yuǎn)來(lái)看,成本是會(huì)下降的。測(cè)試會(huì)減少錯(cuò)誤的數(shù)量,從而減少成本。
代碼質(zhì)量是另一項(xiàng)投資。好的代碼將帶來(lái)更好的測(cè)試,提高穩(wěn)健性、可維護(hù)性、可調(diào)整性等。與難以維護(hù)的系統(tǒng)相比,我們的更改花費(fèi)的時(shí)間會(huì)更少,成本會(huì)下降。
20. 可存檔性
指系統(tǒng)保留歷史數(shù)據(jù)記錄的能力。在數(shù)據(jù)是一等公民的系統(tǒng)中(例如財(cái)務(wù)系統(tǒng)),這個(gè)特征非常重要。數(shù)據(jù)絕不會(huì)刪除,而只會(huì)歸檔,這主要是考慮到法律要求??蓺w檔性是對(duì)可審計(jì)性的支持。
實(shí)現(xiàn)可歸檔性的技術(shù)
首先是在數(shù)據(jù)上使用時(shí)間戳(例如 updatedOn、createdOn)。然后要有一個(gè) cron 作業(yè),將所有低于特定閾值的數(shù)據(jù)移入歷史表中。另一種技術(shù)是將數(shù)據(jù)標(biāo)記為軟刪除,但這會(huì)影響查詢(xún)性能。
21. 可審核性 / 可跟蹤性
這是支持重構(gòu)歷史的系統(tǒng)特征。我們必須記錄所有關(guān)鍵操作(尤其是在安全場(chǎng)景中),以便重現(xiàn)問(wèn)題并從錯(cuò)誤中學(xué)習(xí)經(jīng)驗(yàn)。我們也可以將這些記錄用作法律依據(jù)。
實(shí)現(xiàn)可審核性的技術(shù)
記錄每個(gè)關(guān)鍵操作并集中存放這些記錄。可以使用 ELK ,或 sleuth-zipkin 工具。
英文原文:
關(guān)注我并轉(zhuǎn)發(fā)此篇文章,私信我“領(lǐng)取資料”,即可免費(fèi)獲得InfoQ價(jià)值4999元迷你書(shū)!
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。