微服務(wù)架構(gòu)是一種軟件開(kāi)發(fā)模式,它將一個(gè)復(fù)雜的應(yīng)用程序拆分為多個(gè)個(gè)獨(dú)立的、小型的、可復(fù)用的服務(wù),每個(gè)服務(wù)負(fù)責(zé)一個(gè)特定的業(yè)務(wù)功能。
微服務(wù)架構(gòu)有許多優(yōu)點(diǎn),例如提高系統(tǒng)的可擴(kuò)展性、可維護(hù)性、可測(cè)試性和故障容忍性。
但是,微服務(wù)架構(gòu)也有很多問(wèn)題需要注意,例如如何設(shè)計(jì)合理的劃分服務(wù)接口、如何在服務(wù)間實(shí)現(xiàn)高效通信、如何保證數(shù)據(jù)一致性等。因此要想成功地使用微服務(wù)架構(gòu),我們需要遵循一些最佳實(shí)踐。
以下是一些微服務(wù)架構(gòu)的最佳實(shí)踐,我將盡我所了解的知識(shí)給大家進(jìn)行講解。本文大綱如下,
1. 不使用微服務(wù)架構(gòu)
沒(méi)錯(cuò),我們應(yīng)該盡量避免使用微服務(wù)架構(gòu)。
認(rèn)真地說(shuō),使用微服務(wù)架構(gòu)只能被視為最后的選擇。從項(xiàng)目實(shí)際應(yīng)用場(chǎng)景開(kāi)發(fā),少看一些網(wǎng)上關(guān)于微服務(wù)的吹捧。務(wù)實(shí)一點(diǎn),根據(jù)項(xiàng)目體量、業(yè)務(wù)復(fù)雜度選擇一個(gè)適合當(dāng)前項(xiàng)目的架構(gòu)。
首先嘗試構(gòu)建一個(gè)單體的模塊化架構(gòu),而不是一上來(lái)就搞微服務(wù)架構(gòu)。
2. 針對(duì)失敗場(chǎng)景進(jìn)行處理
在任何使用微服務(wù)的分布式系統(tǒng)里面,總是有調(diào)用失敗的可能,比如網(wǎng)絡(luò)分區(qū)、某個(gè)服務(wù)宕機(jī)不可用等。
所以我們?cè)谙到y(tǒng)調(diào)用層面針對(duì)失敗場(chǎng)景的處理,應(yīng)該設(shè)計(jì)得越早越好。
故障設(shè)計(jì)最好三個(gè)級(jí)別,
- 基礎(chǔ)設(shè)施級(jí)別
- 數(shù)據(jù)庫(kù)級(jí)別和
- 單個(gè)微服務(wù)級(jí)別
實(shí)際的針對(duì)失敗場(chǎng)景處理,可以使用斷路器、服務(wù)降級(jí)和 "隔板模式"。
隔板模式在分布式系統(tǒng)中就是指資源隔離,在分布式系統(tǒng)里,資源隔離通常按業(yè)務(wù)分為進(jìn)程級(jí)別的隔離和線程級(jí)別的隔離,某些簡(jiǎn)單的服務(wù)質(zhì)量要求不高的業(yè)務(wù)場(chǎng)景下實(shí)現(xiàn)進(jìn)程級(jí)別的隔離就夠了,但是在某些對(duì)服務(wù)質(zhì)量要求較高的分布式場(chǎng)景下需要線程級(jí)別的細(xì)粒度隔離。
3. 構(gòu)建小型服務(wù)
微服務(wù)架構(gòu)中,每個(gè)服務(wù)應(yīng)該都按單一職責(zé)進(jìn)行設(shè)計(jì)。
每個(gè)微服務(wù)應(yīng)該只負(fù)責(zé)一個(gè)業(yè)務(wù)領(lǐng)域,并且盡量避免涉及其他領(lǐng)域。
這樣可以提高代碼的可讀性、可測(cè)試性和可維護(hù)性,也可以降低系統(tǒng)的復(fù)雜度和耦合度。
4. 使用輕量級(jí)通信協(xié)議
微服務(wù)架構(gòu)中,服務(wù)之間的通信協(xié)議時(shí)非常重要的。因?yàn)樵谝恍?duì)性能要求較高的場(chǎng)景里,選擇一個(gè)輕量級(jí)協(xié)議所能帶來(lái)的 QPS 提升,也是非??陀^的。
比如服務(wù)間可以使用 REST、GRPC 或消息隊(duì)列等通信協(xié)議,這樣可以盡可能減少服務(wù)通信帶來(lái)的開(kāi)銷(xiāo)并提升性能。
5. 服務(wù)發(fā)現(xiàn)
微服務(wù)架構(gòu)下,服務(wù)實(shí)例的網(wǎng)絡(luò)地址是動(dòng)態(tài)分配和變化的,因此需要一種機(jī)制,能夠及時(shí)獲取服務(wù)實(shí)例的最新的網(wǎng)絡(luò)地址,以便進(jìn)行服務(wù)間通信。
并且服務(wù)實(shí)例的數(shù)量和狀態(tài)都是隨著業(yè)務(wù)需求和故障情況而變化的,還需要有能夠及時(shí)感知服務(wù)實(shí)例的上線、下線、故障等情況的能力。
因此我們需要使用服務(wù)發(fā)現(xiàn)組件,它負(fù)責(zé)自動(dòng)發(fā)現(xiàn)服務(wù)實(shí)例,負(fù)載均衡和故障轉(zhuǎn)移。
服務(wù)發(fā)現(xiàn)組件有 Eureka 、Consul、Nacos 等,國(guó)內(nèi)的話,推薦大家使用 Nacos。
6. 數(shù)據(jù)庫(kù)隔離
微服務(wù)架構(gòu)下,每個(gè)服務(wù)的數(shù)據(jù)庫(kù)應(yīng)該都是單獨(dú)部署的,它們之間相互隔離。
一個(gè)服務(wù)要操作另一個(gè)服務(wù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),都應(yīng)該只能通過(guò)調(diào)用另一個(gè)服務(wù)的接口來(lái)實(shí)現(xiàn),而不是粗暴的直接訪問(wèn)其他服務(wù)的數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)。
數(shù)據(jù)庫(kù)隔離的最終目標(biāo)就是為了減少服務(wù)之間的耦合,使它們能夠獨(dú)立發(fā)展。
7. 實(shí)施彈性模式
為了提高微服務(wù)架構(gòu)中各個(gè)服務(wù)的彈性,我們應(yīng)該盡量使用彈性模式。
所謂彈性,其實(shí)就是服務(wù)的可用性,專(zhuān)業(yè)一點(diǎn)的話說(shuō)就是從某些類(lèi)型的故障中恢復(fù)并保持自身服務(wù)的能力。
那么,我們應(yīng)該如何實(shí)施實(shí)施彈性模式嘞?
其實(shí)很簡(jiǎn)單,我給大家分成兩個(gè)部分進(jìn)行講解,一個(gè)是服務(wù)內(nèi),另一個(gè)是服務(wù)外。
服務(wù)內(nèi)指的是別人調(diào)用我們的服務(wù)時(shí),需要注意的點(diǎn)有,
- 添加緩存
- 資源隔離
- 接口限速
服務(wù)外指的是我們調(diào)用別人的服務(wù)時(shí),需要注意的點(diǎn)有,
- 調(diào)用超時(shí)
- 請(qǐng)求重試
- 斷路器應(yīng)用
8. 服務(wù)監(jiān)控于鏈路追蹤
有句話說(shuō)得好,"在任何分布式系統(tǒng)中,會(huì)宕機(jī)的服務(wù)最終都會(huì)宕機(jī)"。
特別是在微服務(wù)系統(tǒng),系統(tǒng)間的服務(wù)調(diào)用鏈路越長(zhǎng),發(fā)生異常時(shí)的排查難度就越大。
所以為了跟上微服務(wù)的步伐,我們需要發(fā)現(xiàn)各個(gè)服務(wù)中存在的問(wèn)題。進(jìn)一步也就需要針對(duì)微服務(wù)的性能、狀態(tài)、異常等指標(biāo)進(jìn)行收集、分析、展示和告警。這有助于提高系統(tǒng)的可觀察性、可運(yùn)維性和可靠性。
鏈路追蹤是一種技術(shù),用于監(jiān)控和分析分布式系統(tǒng)中的請(qǐng)求流程,以及各個(gè)服務(wù)之間的調(diào)用情況。
在分布式系統(tǒng)中,鏈路追蹤就是為每個(gè)請(qǐng)求分配一個(gè)全局唯一的標(biāo)識(shí)(TraceId),并在請(qǐng)求在各個(gè)服務(wù)之間傳遞時(shí),記錄每個(gè)服務(wù)的調(diào)用信息(SpanId),包括調(diào)用時(shí)間、耗時(shí)、狀態(tài)等。通過(guò)收集、存儲(chǔ)、展示和分析這些信息,就可以還原出請(qǐng)求的完整鏈路,以及各個(gè)服務(wù)的性能表現(xiàn)。
在如今流行云原生的潮流下,推薦使用 Prometheus、Grafana 為微服務(wù)構(gòu)建全面的監(jiān)控能力,使用 Skywalking 為微服務(wù)構(gòu)建一套性能分析以及鏈路追蹤平臺(tái)。
9. 服務(wù)的安全性
微服務(wù)架構(gòu)中,各個(gè)服務(wù)的安全性設(shè)計(jì)也非常重要。
常見(jiàn)的有如下幾種安全性設(shè)計(jì)的舉措,
- API 網(wǎng)關(guān):使用 API 網(wǎng)關(guān)作為服務(wù)的統(tǒng)一入口,對(duì)所有進(jìn)入和離開(kāi)的請(qǐng)求進(jìn)行鑒權(quán)、路由、負(fù)載均衡、限流、緩存等功能,提高服務(wù)的可用性和性能,同時(shí)也增加了服務(wù)的安全性,防止內(nèi)部服務(wù)被直接訪問(wèn)或攻擊。
- 令牌安全:使用 JWT、OAuth 2.0 等標(biāo)準(zhǔn)化的令牌格式和協(xié)議來(lái)實(shí)現(xiàn)服務(wù)之間或服務(wù)與客戶端之間的身份驗(yàn)證和授權(quán),防止服務(wù)被冒充或?yàn)E用。
- 請(qǐng)求過(guò)濾:對(duì) API 網(wǎng)關(guān)所接收到的所有請(qǐng)求數(shù)據(jù),進(jìn)行 SQL 注入攻擊、XSS 攻擊和 CORS 攻擊過(guò)濾攔截處理。
- 風(fēng)控報(bào)警:在 API 網(wǎng)關(guān)添加風(fēng)控措施,針對(duì)發(fā)起惡意請(qǐng)求的用戶做黑名單風(fēng)控處理,針對(duì)服務(wù)內(nèi)部的非業(yè)務(wù)異常進(jìn)行報(bào)警通知。
10. 統(tǒng)一日志采集
分布式系統(tǒng)中,各個(gè)服務(wù)的日志都位于不同的機(jī)器上,因此機(jī)器越多,日志統(tǒng)一采集的需求就越強(qiáng)烈。
統(tǒng)一日志采集是微服務(wù)架構(gòu)中的一個(gè)重要的運(yùn)維需求,它負(fù)責(zé)收集和管理分布式系統(tǒng)中的各種日志,如運(yùn)行日志、訪問(wèn)日志、錯(cuò)誤日志等,以便于進(jìn)行問(wèn)題排查、性能分析、數(shù)據(jù)挖掘等。
推薦使用 ELK 或者 Graylog 搭建一套統(tǒng)一日志采集平臺(tái)。
因?yàn)槲沂褂?Graylog 比較多,所以這里給大家推薦了解一波 Graylog 這個(gè)統(tǒng)一日志采集平臺(tái)。
Graylog 是一個(gè)開(kāi)源的集中式日志管理系統(tǒng),它可以收集、存儲(chǔ)、分析、展示和告警各種機(jī)器數(shù)據(jù),為開(kāi)發(fā)團(tuán)隊(duì)提供安全、應(yīng)用和 IT 基礎(chǔ)設(shè)施方面的問(wèn)題的答案。
Graylog 可以讓我們?cè)谝粋€(gè)美觀的 web ui 界面上組合、關(guān)聯(lián)、查詢所有的日志數(shù)據(jù)。
Graylog 具有以下特點(diǎn)和優(yōu)勢(shì):
- 高性能:Graylog 可以處理每秒數(shù)百萬(wàn)條日志,支持多節(jié)點(diǎn)集群,實(shí)現(xiàn)水平擴(kuò)展和負(fù)載均衡。
- 易用性:Graylog 提供了一個(gè)友好的 Web 界面,讓您可以輕松地構(gòu)建復(fù)雜的查詢,創(chuàng)建自定義的儀表盤(pán),設(shè)置靈活的告警規(guī)則,生成定期的報(bào)告等。
- 靈活性:Graylog 支持多種日志來(lái)源,如文件、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、應(yīng)用程序等,可以通過(guò)插件和 API 進(jìn)行擴(kuò)展和集成,滿足不同的業(yè)務(wù)需求和場(chǎng)景。
- 安全性:Graylog 支持使用 HTTPS、SSL/TLS 等加密技術(shù)來(lái)保護(hù)日志數(shù)據(jù)的傳輸和存儲(chǔ),同時(shí)也支持使用 LDAP、OAuth 2.0 等認(rèn)證和授權(quán)機(jī)制來(lái)控制用戶的訪問(wèn)權(quán)限。
Graylog 使用教程:https://learn.microsoft.com/zh-cn/azure/network-watcher/network-watcher-analyze-nsg-flow-logs-graylog
最后聊兩句
本文為大家介紹了微服務(wù)架構(gòu)中的 10 個(gè)最佳實(shí)踐。包含 1. 不使用微服務(wù)架構(gòu)、2. 針對(duì)失敗場(chǎng)景進(jìn)行處理、3. 構(gòu)建小型服務(wù)、4. 使用輕量級(jí)通信協(xié)議、5. 服務(wù)發(fā)現(xiàn)、6. 數(shù)據(jù)庫(kù)隔離、7. 實(shí)施彈性模式、8. 服務(wù)監(jiān)控以及鏈路追蹤、9. 服務(wù)安全性、10.統(tǒng)一日志采集。
說(shuō)了這么多,其實(shí)還是希望大家結(jié)合自身項(xiàng)目背景,多多思考,不要為了使用微服務(wù)而去使用微服務(wù),在已經(jīng)使用了微服務(wù)架構(gòu)中項(xiàng)目,能夠結(jié)合上述最佳實(shí)踐,加上自己對(duì)各個(gè)服務(wù)以及業(yè)務(wù)上的思考,去解決哪些已存在的問(wèn)題。這樣才算是真正學(xué)會(huì)了微服務(wù)。
關(guān)注我每周分享技術(shù)干貨、開(kāi)源項(xiàng)目、實(shí)戰(zhàn)經(jīng)驗(yàn)、國(guó)外優(yōu)質(zhì)文章翻譯等,您的關(guān)注將是我的更新動(dòng)力!
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(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í),本站將立刻刪除。