微服務(wù)器怎么改安全性 微服務(wù) 安全性

26.FastAPI安全性

軟件開發(fā)中,安全是永恒的話題,F(xiàn)astAPI作為一個(gè)優(yōu)秀的Python Web開發(fā)框架,為用戶提供了多種工具,幫助用戶以標(biāo)準(zhǔn)的方式輕松快速地解決軟件開發(fā)中的安全性。

創(chuàng)新互聯(lián)是一家專業(yè)提供蕉城企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為蕉城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

FastAPI 的 fastapi.security 模塊中為各種安全方案提供了一些工具,這些工具簡化了這些安全機(jī)制的使用方法。

FastAPI提供的OAuth2PasswordBearer是使用 OAuth2的密碼授權(quán)模式的Bearer Token(不記名 token) 。創(chuàng)建OAuth2PasswordBearer 實(shí)例需要接收URL作為參數(shù)。

客戶端會向該 URL 通過表單的格式發(fā)送 username 和 password 參數(shù),然后得到一個(gè) token 值;OAuth2PasswordBearer 并不會創(chuàng)建相應(yīng)的 URL 路徑操作,只是指明了客戶端用來獲取 token 的目標(biāo) URL。

代碼示例:

在上面的代碼中, tokenUrl="token"指的token是相對 URL 。

此時(shí)訪問,其返回結(jié)果:

上面的結(jié)果表明:訪問的內(nèi)容以及被保護(hù),必須經(jīng)過授權(quán)后才可以訪問。

當(dāng)獲取到表單數(shù)據(jù)后,需要進(jìn)行密碼校驗(yàn),一般情況下,我們都會考慮使用哈希密碼,PassLib 是一個(gè)用于處理哈希密碼的非常好的 Python 包,它支持許多安全哈希算法以及配合算法使用的實(shí)用程序。

具體passlib的使用方法可以查看其文檔

下面的代碼示例在上面代碼的基礎(chǔ)上增加用戶登錄及Token驗(yàn)證

啟動應(yīng)用并執(zhí)行請求:

測試無效登錄:

測試正常登錄:

返回token,在Headers中使用token訪問:

修改token后請求:

上面的代碼如果去掉 await verify_token(token) 行,則:

curl -H "Authorization:Bearer u000010007" -i

會得到返回結(jié)果,原因是默認(rèn)情況下,OAuth2PasswordBearer只負(fù)責(zé)請求頭中是否具有Authorization:Bearer,如果有就會執(zhí)行相應(yīng)的請求,所以,為了驗(yàn)證Token的正確性,需要每個(gè)方法都執(zhí)行相應(yīng)的驗(yàn)證代碼。

本例只作為例子,在實(shí)際開發(fā)中不會直接拿用戶ID作為Token,為了提高系統(tǒng)的安全性,需要使用 JWT。下面我們就介紹 JWT。

JWT是一個(gè)將 JSON 對象編碼為密集且沒有空格的長字符串的標(biāo)準(zhǔn)。 具體學(xué)習(xí)和了解 JWT,請參考 。

需要提到的主要是 JWT中的sub,JWT 的規(guī)范中有一個(gè) sub 鍵,值為該令牌的主題。使用它并不是必須的,但這是我們放置用戶標(biāo)識的地方,所以一般情況下,我們在sub中存放用戶ID, 為了避免 ID 沖突,當(dāng)為創(chuàng)建 JWT 令牌時(shí),可以在 sub 鍵的值前加上前綴,例如 username:、userid:等。

在 Python 中生成和校驗(yàn) JWT 令牌 ,可以使用PyJWT,也可以使用 python-jose 。我們在本例中使用 python-jose 來編寫代碼。

使用:

使用 JWT,需要在系統(tǒng)中添加一個(gè)SECRET_KEY變量,用于生成令牌,如:

以下代碼在上面代碼的基礎(chǔ)上使用 JWT 令牌。

與前面的代碼差別之處:

1.生成Token的函數(shù):build_access_token

2.校驗(yàn)Token的函數(shù):verify_token

3.登錄函數(shù):login

請求測試:

登錄:

令牌訪問:

錯誤的令牌訪問:

在大部分應(yīng)用程序中,當(dāng)用戶訪問某個(gè)接口API的時(shí)候,都需要明確訪問者的身份,所以在應(yīng)用程序中需要隨時(shí)獲取當(dāng)前用戶,由于在 JWT 令牌的 sub 字段中已經(jīng)保存了用戶信息,所以獲取當(dāng)前用戶只需要對令牌解碼即可。

在上面的代碼的基礎(chǔ)上,增加兩個(gè)函數(shù),代碼如下:

請求測試:

以上,我們完成了一個(gè)簡單的安全性示例,F(xiàn)astAPI提供的安全性框架幫助我們節(jié)約了很多代碼,但在實(shí)際開發(fā)中,我們常常使用微服務(wù)的方式來開發(fā),對于鑒權(quán)最好設(shè)計(jì)獨(dú)立的微服務(wù)進(jìn)行處理。后面我們會展示一個(gè)采用FastAPI開發(fā)的鑒權(quán)微服務(wù),以便在此基礎(chǔ)上進(jìn)行業(yè)務(wù)系統(tǒng)的開發(fā)。

數(shù)據(jù)庫的安全性、角色與權(quán)限在哪里根改啊

打開企業(yè)管理器,打開SQLServer組,下面有個(gè)安全性,里面有個(gè)登錄,登錄里面就是數(shù)據(jù)庫的賬號管理了.

怎么增強(qiáng)wifi的安全性?

對于增強(qiáng)WiFi的安全性,我們需要注意下面幾點(diǎn)。

采用WPA/WPA2J加密方式,省心又安全。

設(shè)置隱藏SSID,讓壞人不容易發(fā)現(xiàn)家庭WiFi。

及時(shí)修改路由器后臺賬號密碼。

及時(shí)修改WiFi接入密碼,密碼盡可能復(fù)雜一些。

啟用mac地址過濾功能,綁定經(jīng)常使用的設(shè)備。

在手機(jī)端和電腦端安裝安全軟件。

做到這些,WiFi的安全性已經(jīng)比較高了。

「微服務(wù)架構(gòu)」Medium的微服務(wù)架構(gòu)實(shí)踐

微服務(wù)1架構(gòu)的目標(biāo)是幫助工程團(tuán)隊(duì)更快,更安全,更高質(zhì)量地交付產(chǎn)品。解耦服務(wù)允許團(tuán)隊(duì)快速迭代,對系統(tǒng)的其余部分影響最小。

在Medium,我們的技術(shù)堆棧始于2012年的單片Node.js應(yīng)用程序。我們已經(jīng)構(gòu)建了幾個(gè)衛(wèi)星服務(wù),但我們還沒有制定一個(gè)系統(tǒng)地采用微服務(wù)架構(gòu)的策略。隨著系統(tǒng)變得越來越復(fù)雜并且團(tuán)隊(duì)不斷發(fā)展,我們在2018年初轉(zhuǎn)向了微服務(wù)架構(gòu)。在這篇文章中,我們希望分享我們有效地做到這一點(diǎn)并避免微服務(wù)綜合癥的經(jīng)驗(yàn)。

首先,讓我們花一點(diǎn)時(shí)間來思考微服務(wù)架構(gòu)是什么,不是什么。 “微服務(wù)”是那些過載和混亂的軟件工程趨勢之一。這就是我們在Medium認(rèn)為它是什么:

該定義包括三個(gè)微服務(wù)設(shè)計(jì)原則:

Three Principles of Modeling Microservices

當(dāng)我們對微服務(wù)進(jìn)行建模時(shí),我們應(yīng)該遵守所有三個(gè)設(shè)計(jì)原則。這是實(shí)現(xiàn)微服務(wù)架構(gòu)全部潛力的唯一途徑。錯過任何一個(gè)都會成為反模式。

沒有一個(gè)目的,每個(gè)微服務(wù)最終會做太多事情,成長為多個(gè)“單片”服務(wù)。我們不會從微服務(wù)架構(gòu)中獲得全部好處,我們也會支付運(yùn)營成本。

如果沒有松散耦合,對一個(gè)服務(wù)的更改會影響其他服務(wù),因此我們無法快速安全地發(fā)布更改,這是微服務(wù)架構(gòu)的核心優(yōu)勢。更重要的是,緊密耦合引起的問題可能是災(zāi)難性的,例如數(shù)據(jù)不一致甚至數(shù)據(jù)丟失。

如果沒有高凝聚力,我們將最終得到一個(gè)分布式單片系統(tǒng) - 一組混亂的服務(wù),必須同時(shí)進(jìn)行更改和部署才能構(gòu)建單一功能。由于多個(gè)服務(wù)協(xié)調(diào)的復(fù)雜性和成本(有時(shí)跨多個(gè)團(tuán)隊(duì)),分布式單片系統(tǒng)通常比集中式單片系統(tǒng)差得多。

與此同時(shí),了解 微服務(wù)不是什么 很重要:

在Medium,我們總是在做出重大產(chǎn)品或工程決策時(shí)會問“為什么現(xiàn)在?”這個(gè)問題。 “為什么?”是一個(gè)顯而易見的問題,但它假設(shè)我們擁有無限的人,時(shí)間和資源,這是一個(gè)危險(xiǎn)的假設(shè)。當(dāng)你想到“為什么現(xiàn)在?”時(shí),你突然有了更多的限制 - 對當(dāng)前工作的影響,機(jī)會成本,分心的開銷等等。這個(gè)問題有助于我們更好地優(yōu)先考慮。

我們現(xiàn)在需要采用微服務(wù)的原因是我們的Node.js單片應(yīng)用程序已經(jīng)成為多個(gè)方面的瓶頸。

首先,最緊迫和最重要的瓶頸是其性能。

某些計(jì)算量很大且I / O很重的任務(wù)不適合Node.js.我們一直在逐步改進(jìn)整體應(yīng)用程序,但事實(shí)證明它是無效的。它的低劣性能使我們無法提供更好的產(chǎn)品而不會使已經(jīng)非常慢的應(yīng)用程序變慢。

其次,整體應(yīng)用程序的一個(gè)重要且有點(diǎn)緊迫的瓶頸是它會減慢產(chǎn)品開發(fā)速度。

由于所有工程師都在單個(gè)應(yīng)用程序中構(gòu)建功能,因此它們通常緊密耦合。我們無法靈活地改變系統(tǒng)的一部分,因?yàn)樗部赡苡绊懫渌糠帧N覀円埠ε伦龀鲋卮蟾淖?,因?yàn)橛绊懱螅袝r(shí)難以預(yù)測。整個(gè)應(yīng)用程序作為一個(gè)整體進(jìn)行部署,因此如果由于一次錯誤提交導(dǎo)致部署停滯,那么所有其他更改(即使它們完全正常工作)也無法完成。相比之下,微服務(wù)架構(gòu)允許團(tuán)隊(duì)更快地發(fā)貨,學(xué)習(xí)和迭代。他們可以專注于他們正在構(gòu)建的功能,這些功能與復(fù)雜系統(tǒng)的其余部分分離。更改可以更快地進(jìn)入生產(chǎn)。他們可以靈活地安全地嘗試重大變革。

在我們新的微服務(wù)架構(gòu)中,更改會在一小時(shí)內(nèi)完成生產(chǎn),工程師不必?fù)?dān)心它會如何影響系統(tǒng)的其他部分。該團(tuán)隊(duì)還 探索 了在開發(fā)中安全使用生產(chǎn)數(shù)據(jù)的方法2多年來一直是白日夢。隨著我們的工程團(tuán)隊(duì)的發(fā)展,所有這些都非常重要。

第三,單一應(yīng)用程序使得難以為特定任務(wù)擴(kuò)展系統(tǒng)或隔離不同類型任務(wù)的資源問題。

使用單一的單一應(yīng)用程序,我們必須擴(kuò)展和縮小整個(gè)系統(tǒng),以滿足更多資源需求的任務(wù),即使這意味著系統(tǒng)過度配置用于其他更簡單的任務(wù)。為了緩解這些問題,我們對不同類型的請求進(jìn)行分片,以分離Node.js進(jìn)程。它們在一定程度上起作用,但不會擴(kuò)展,因?yàn)檫@些微單一版本的單片服務(wù)是緊密耦合的。

最后但同樣重要的是,一個(gè)重要且即將成為緊迫的瓶頸是它阻止我們嘗試新技術(shù)。微服務(wù)架構(gòu)的一個(gè)主要優(yōu)點(diǎn)是每個(gè)服務(wù)都可以使用不同的技術(shù)堆棧構(gòu)建,并與不同的技術(shù)集成。這使我們能夠選擇最適合工作的工具,更重要的是,我們可以快速安全地完成工作。

采用微服務(wù)架構(gòu)并非易事。它可能會出錯,實(shí)際上會損害工程生產(chǎn)力。在本節(jié)中,我們將分享七個(gè)在采用早期階段幫助我們的策略:

有人可能會認(rèn)為采用新的服務(wù)器架構(gòu)意味著產(chǎn)品開發(fā)的長時(shí)間停頓以及對所有內(nèi)容的大量重寫。這是錯誤的做法。我們永遠(yuǎn)不應(yīng)該為了建立新的服務(wù)而建立新的服務(wù)。每次我們建立新服務(wù)或采用新技術(shù)時(shí),都必須具有明確的產(chǎn)品價(jià)值和/或工程價(jià)值。

產(chǎn)品價(jià)值應(yīng)以我們可以為用戶提供的利益為代表。與在單片Node.js應(yīng)用程序中構(gòu)建值相比,需要一項(xiàng)新服務(wù)來提供值或使其更快地交付值。工程價(jià)值應(yīng)該使工程團(tuán)隊(duì)更好,更快。

如果構(gòu)建新服務(wù)沒有產(chǎn)品價(jià)值或工程價(jià)值,我們將其留在單一的應(yīng)用程序中。如果十年內(nèi)Medium仍然有一個(gè)支持某些表面的單片Node.js應(yīng)用程序,那就完全沒了問題。從單一應(yīng)用程序開始實(shí)際上有助于我們戰(zhàn)略性地對微服務(wù)進(jìn)行建模。

建立具有明確價(jià)值的新服務(wù)

有人可能會認(rèn)為采用新的服務(wù)器架構(gòu)意味著產(chǎn)品開發(fā)的長時(shí)間停頓以及對所有內(nèi)容的大量重寫。這是錯誤的做法。我們永遠(yuǎn)不應(yīng)該為了建立新的服務(wù)而建立新的服務(wù)。每次我們建立新服務(wù)或采用新技術(shù)時(shí),都必須具有明確的產(chǎn)品價(jià)值和/或工程價(jià)值。

產(chǎn)品價(jià)值應(yīng)以我們可以為用戶提供的利益為代表。與在單片Node.js應(yīng)用程序中構(gòu)建值相比,需要一項(xiàng)新服務(wù)來提供值或使其更快地交付值。工程價(jià)值應(yīng)該使工程團(tuán)隊(duì)更好,更快。

如果構(gòu)建新服務(wù)沒有產(chǎn)品價(jià)值或工程價(jià)值,我們將其留在單一的應(yīng)用程序中。如果十年內(nèi)Medium仍然有一個(gè)支持某些表面的單片Node.js應(yīng)用程序,那就完全沒了問題。從單一應(yīng)用程序開始實(shí)際上有助于我們戰(zhàn)略性地對微服務(wù)進(jìn)行建模。

單片持久存儲被認(rèn)為是有害的

建模微服務(wù)的很大一部分是對其持久數(shù)據(jù)存儲(例如,數(shù)據(jù)庫)進(jìn)行建模??绶?wù)共享持久數(shù)據(jù)存儲通常似乎是將微服務(wù)集成在一起的最簡單方法,然而,它實(shí)際上是有害的,我們應(yīng)該不惜一切代價(jià)避免它。這就是原因。

首先,持久數(shù)據(jù)存儲是關(guān)于實(shí)現(xiàn)細(xì)節(jié)的。 跨服務(wù)共享數(shù)據(jù)存儲會將一個(gè)服務(wù)的實(shí)現(xiàn)細(xì)節(jié)暴露給整個(gè)系統(tǒng)。如果該服務(wù)更改了數(shù)據(jù)的格式,或者添加了緩存層,或者切換到不同類型的數(shù)據(jù)庫,則還必須相應(yīng)地更改許多其他服務(wù)。 這違反了松散耦合的原則。

其次,持久數(shù)據(jù)存儲不是服務(wù)行為,即如何修改,解釋和使用數(shù)據(jù) 。如果我們跨服務(wù)共享數(shù)據(jù)存儲,則意味著其他服務(wù)也必須復(fù)制服務(wù)行為。 這違反了高內(nèi)聚的原則 - 給定域中的行為泄露給多個(gè)服務(wù)。如果我們修改一個(gè)行為,我們將不得不一起修改所有這些服務(wù)。

在微服務(wù)架構(gòu)中,只有一個(gè)服務(wù)應(yīng)該負(fù)責(zé)特定類型的數(shù)據(jù)。所有其他服務(wù)應(yīng)該通過負(fù)責(zé)服務(wù)的API請求數(shù)據(jù),或者保留數(shù)據(jù)的 只讀非規(guī)范(可能具體化)副本 。

這可能聽起來很抽象,所以這是一個(gè)具體的例子。假設(shè)我們正在構(gòu)建一個(gè)新的推薦服務(wù),它需要來自規(guī)范帖子表的一些數(shù)據(jù),目前在AWS DynamoDB中。我們可以通過兩種方式之一為新推薦服務(wù)提供發(fā)布數(shù)據(jù)。

在單片存儲模型中,推薦服務(wù)可以直接訪問單片應(yīng)用程序所執(zhí)行的相同持久存儲。這是一個(gè)壞主意,因?yàn)椋?/p>

緩存可能很棘手。 如果推薦服務(wù)與單一應(yīng)用程序共享相同的緩存,我們也必須在推薦服務(wù)中復(fù)制緩存實(shí)現(xiàn)細(xì)節(jié);如果推薦服務(wù)使用自己的緩存,當(dāng)單片應(yīng)用更新帖子數(shù)據(jù)時(shí),我們將不知道何時(shí)使其緩存無效。

如果單片應(yīng)用程序決定更改為使用RDS而不是DynamoDB來存儲帖子數(shù)據(jù),我們將不得不重新實(shí)現(xiàn)推薦服務(wù)中的邏輯以及訪問帖子數(shù)據(jù)的所有其他服務(wù)。

單片應(yīng)用程序具有解釋帖子數(shù)據(jù)的復(fù)雜邏輯 ,例如,如何確定帖子是否應(yīng)該對給定用戶不可見。我們必須在推薦服務(wù)中重新實(shí)現(xiàn)這些邏輯。一旦整體應(yīng)用程序更改或添加新邏輯,我們也需要在任何地方進(jìn)行相同的更改。

即使推薦服務(wù)是自己的數(shù)據(jù)訪問模式的錯誤選項(xiàng),推薦服務(wù)仍然停留在DynamoDB上。

在解耦存儲模型中,推薦服務(wù)不能直接訪問發(fā)布數(shù)據(jù),也不能直接訪問任何其他新服務(wù)。發(fā)布數(shù)據(jù)的實(shí)現(xiàn)細(xì)節(jié)僅保留在一個(gè)服務(wù)中。有不同的方法來實(shí)現(xiàn)這一目標(biāo)。

Option A 理想情況下,應(yīng)該有一個(gè)擁有帖子數(shù)據(jù)的Post服務(wù),其他服務(wù)只能通過Post服務(wù)的API訪問郵政數(shù)據(jù)。但是,為所有核心數(shù)據(jù)模型構(gòu)建新服務(wù)可能是一項(xiàng)昂貴的前期投資。

當(dāng)人員配置有限時(shí),還有一些更實(shí)用的方法。根據(jù)數(shù)據(jù)訪問模式,它們實(shí)際上可能是更好的方式。

在 選項(xiàng)B 中,單一應(yīng)用程序可讓推薦服務(wù)知道何時(shí)更新相關(guān)的帖子數(shù)據(jù)。通常,這不必立即發(fā)生,因此我們可以將其卸載到排隊(duì)系統(tǒng)。

在 選項(xiàng)C 中,ETL管道生成推薦服務(wù)的發(fā)布數(shù)據(jù)的只讀副本,以及可能對推薦有用的其他數(shù)據(jù)。在這兩個(gè)選項(xiàng)中,推薦服務(wù)完全擁有其數(shù)據(jù),因此它可以靈活地緩存數(shù)據(jù)或使用最適合的數(shù)據(jù)庫技術(shù)。

解耦“建立服務(wù)”和“運(yùn)行服務(wù)”

如果構(gòu)建微服務(wù)很難,那么運(yùn)行服務(wù)往往更難。 當(dāng)運(yùn)行服務(wù)與構(gòu)建每個(gè)服務(wù)相結(jié)合時(shí),它會減慢工程團(tuán)隊(duì)的速度,團(tuán)隊(duì)必須不斷重新發(fā)明這樣做。我們希望讓每項(xiàng)服務(wù)都專注于自己的工作而不用擔(dān)心如何運(yùn)行服務(wù)的復(fù)雜問題,包括網(wǎng)絡(luò),通信協(xié)議,部署,可觀察性等。服務(wù)管理應(yīng)該與每個(gè)服務(wù)的實(shí)現(xiàn)完全分離。

由于最近在 容器化,容器編排,服務(wù)網(wǎng)格,應(yīng)用程序性能監(jiān) 控等方面的技術(shù)進(jìn)步,“運(yùn)行服務(wù)”的解耦變得比以往更容易實(shí)現(xiàn)。

網(wǎng)絡(luò)。 網(wǎng)絡(luò)(例如,服務(wù)發(fā)現(xiàn),路由,負(fù)載平衡,流量路由等)是運(yùn)行服務(wù)的關(guān)鍵部分。傳統(tǒng)方法是為每種平臺/語言提供庫。它工作但不理想,因?yàn)閼?yīng)用程序仍然需要非常繁瑣的工作來集成和維護(hù)庫。通常,應(yīng)用程序仍然需要單獨(dú)實(shí)現(xiàn)某些邏輯?,F(xiàn)代解決方案是在Service Mesh中運(yùn)行服務(wù)。在Medium,我們使用 Istio和Envoy作為邊車代理 。構(gòu)建服務(wù)的應(yīng)用工程師根本不需要擔(dān)心網(wǎng)絡(luò)問題。

通信協(xié)議 。無論您選擇哪種技術(shù)堆?;蛘Z言來構(gòu)建微服務(wù),從一個(gè)高效,類型化,跨平臺且需要最少開發(fā)開銷的成熟RPC解決方案開始是非常重要的。支持向后兼容性的RPC解決方案也使部署服務(wù)更加安全,即使它們之間存在依賴關(guān)系。在Medium,我們選擇了gRPC。

一種常見的替代方案是基于HTTP的REST + JSON,它長期以來一直是服務(wù)器通信的福音解決方案。但是,盡管該堆棧非常適合瀏覽器與服務(wù)器通信,但它對于服務(wù)器到服務(wù)器的 通信效率很低 ,尤其是當(dāng)我們需要發(fā)送大量請求時(shí)。如果沒有自動生成的 存根和樣板代碼 ,我們將不得不手動實(shí)現(xiàn)服務(wù)器/客戶端代碼。可靠的RPC實(shí)現(xiàn)不僅僅包裝網(wǎng)絡(luò)客戶端。另外,REST是“自以為是”,但總是讓每個(gè)人都對每個(gè)細(xì)節(jié)都達(dá)成一致很困難,例如,這個(gè)調(diào)用真的是REST,還是只是一個(gè)RPC?這是一種資源還是一種操作?等等

部署。 擁有一致的方法來構(gòu)建,測試,打包,部署和管理服務(wù)非常重要。所有Medium的微服務(wù)都在容器中運(yùn)行。目前,我們的編排系統(tǒng)是AWS ECS和Kubernetes的混合體,但僅限于Kubernetes。

我們構(gòu)建了自己的系統(tǒng)來 構(gòu)建,測試,打包和部署 服務(wù),稱為BBFD。它在一致地跨服務(wù)工作和為個(gè)人服務(wù)提供采用不同技術(shù)堆棧的靈活性之間取得平衡。它的工作方式是讓每個(gè)服務(wù)提供基本信息,例如,要監(jiān)聽的端口,構(gòu)建/測試/啟動服務(wù)的命令等,BBFD將負(fù)責(zé)其余的工作。

徹底和一致的可觀察性

可觀察性包括允許我們了解系統(tǒng)如何工作的過程,約定和工具,以及在不工作時(shí)對問題進(jìn)行分類??捎^察性包括日志記錄,性能跟蹤,指標(biāo),儀表板,警報(bào),并且對于微服務(wù)架構(gòu)的成功至關(guān)重要。

當(dāng)我們從單個(gè)服務(wù)遷移到具有許多服務(wù)的分布式系統(tǒng)時(shí),可能會發(fā)生兩件事:

我們失去了可觀察性,因?yàn)樗兊酶y或更容易被忽視。

不同的團(tuán)隊(duì)重新發(fā)明了輪子,我們最終得到了零碎的可觀察性,這實(shí)際上是低可觀察性 ,因?yàn)楹茈y使用碎片數(shù)據(jù)連接點(diǎn)或分類任何問題。

從一開始就具有良好且一致的可觀察性非常重要,因此我們的DevOps團(tuán)隊(duì)提出了一致的可觀察性策略,并構(gòu)建了支持實(shí)現(xiàn)這一目標(biāo)的工具。每項(xiàng)服務(wù)都會自動獲取詳細(xì)的DataDog儀表板,警報(bào)和日志搜索,這些服務(wù)在所有服務(wù)中也是一致的。我們還大量使用LightStep來了解系統(tǒng)的性能。

并非每一項(xiàng)新服務(wù)都需要從零開始構(gòu)建

在微服務(wù)架構(gòu)中,每個(gè)服務(wù)都做一件事并且做得非常好。請注意,它與如何構(gòu)建服務(wù)無關(guān)。如果您從單一服務(wù)遷移,請記住,如果您可以從單片應(yīng)用程序中剝離微服務(wù)并不總是必須從頭開始構(gòu)建。

在這里,我們采取務(wù)實(shí)的態(tài)度。我們是否應(yīng)該從頭開始構(gòu)建服務(wù)取決于兩個(gè)因素:(1)Node.js適合該任務(wù)的程度如何;(2)在不同的技術(shù)堆棧中重新實(shí)現(xiàn)的成本是多少。

如果Node.js是一個(gè)很好的技術(shù)選項(xiàng)并且現(xiàn)有的實(shí)現(xiàn)很好,我們將代碼從單片應(yīng)用程序中刪除,并用它創(chuàng)建一個(gè)微服務(wù)。即使采用相同的實(shí)現(xiàn),我們?nèi)詫@得微服務(wù)架構(gòu)的所有好處。

我們的單片Node.js單片應(yīng)用程序的架構(gòu)使我們可以相對輕松地使用現(xiàn)有實(shí)現(xiàn)構(gòu)建單獨(dú)的服務(wù)。我們將在本文稍后討論如何正確構(gòu)建單片。

尊重失敗,因?yàn)樗麄儠l(fā)生

在分布式環(huán)境中,更多的東西可能會失敗,而且它們會失敗。如果處理不當(dāng),任務(wù)關(guān)鍵型服務(wù)的失敗可能是災(zāi)難性的。我們應(yīng)該始終考慮如何測試故障并優(yōu)雅地處理故障。

從第一天起避免使用微服務(wù)綜合癥

微服務(wù)不是靈丹妙藥 - 它解決了一些問題,但創(chuàng)造了一些其他問題,我們將其稱為“微服務(wù)綜合癥”。如果我們從第一天開始就不去考慮它們,那么事情會變得很快,如果我們以后再照顧它們會花費(fèi)更多。以下是一些常見癥狀。

隨著最近的技術(shù)創(chuàng)新,采用微服務(wù)架構(gòu)要容易得多。這是否意味著我們都應(yīng)該停止構(gòu)建單一服務(wù)?

雖然新技術(shù)支持得更好,但微服務(wù)架構(gòu)仍然存在高度復(fù)雜性和復(fù)雜性。 對于小型團(tuán)隊(duì)來說,單一的應(yīng)用程序通常仍然是更好的選擇。但是,請花些時(shí)間來構(gòu)建單片應(yīng)用程序,以便以后在系統(tǒng)和團(tuán)隊(duì)成長時(shí)更容易遷移到微服務(wù)架構(gòu)。

在Medium,我們在早期的單片應(yīng)用程序中做出了一些很好的架構(gòu)決策。

我們的單片應(yīng)用程序由組件高度模塊化,即使它已經(jīng)發(fā)展成為一個(gè)非常復(fù)雜的應(yīng)用程序,包括Web服務(wù)器,后端服務(wù)和離線事件處理器。脫機(jī)事件處理器單獨(dú)運(yùn)行,但使用完全相同的代碼。這使得將一大塊業(yè)務(wù)邏輯剝離到單獨(dú)的服務(wù)相對容易,只要新服務(wù)提供與原始實(shí)現(xiàn)相同(高級)的接口即可。

我們的整體應(yīng)用程序在較低級別封裝了數(shù)據(jù)存儲詳細(xì)信息。每種數(shù)據(jù)類型(例如,數(shù)據(jù)庫表)具有兩層實(shí)現(xiàn):數(shù)據(jù)層和服務(wù)層。

這有助于我們采用微服務(wù)架構(gòu),因?yàn)橐环N類型數(shù)據(jù)的實(shí)現(xiàn)細(xì)節(jié)完全隱藏在代碼庫的其余部分。創(chuàng)建新服務(wù)來處理某些類型的數(shù)據(jù)相對容易且安全。

單片應(yīng)用程序還可以幫助我們對微服務(wù)進(jìn)行建模,并使我們能夠靈活地專注于系統(tǒng)中最重要的部分,而不是從頭開始為所有微服務(wù)建模。

單片Node.js應(yīng)用程序?yàn)槲覀兎?wù)了好幾年,但它開始減慢我們從運(yùn)送偉大的項(xiàng)目和快速迭代。我們開始系統(tǒng)地和戰(zhàn)略性地采用微服務(wù)架構(gòu)。我們?nèi)蕴幱谶@一旅程的早期階段,但我們已經(jīng)看到了它的優(yōu)勢和潛力 - 它大大提高了開發(fā)效率,使我們能夠大膽地思考并實(shí)現(xiàn)大量的產(chǎn)品改進(jìn),并解鎖了工程團(tuán)隊(duì)以安全地測試新技術(shù)。

加入Medium的工程團(tuán)隊(duì)是一個(gè)激動人心的時(shí)刻。如果這聽起來很有趣,請查看我們的工作頁面 - 在Medium工作。如果您對微服務(wù)架構(gòu)特別感興趣,您可能需要先了解這兩個(gè)開頭:高級全棧工程師和高級平臺工程師。

原文 :

討論: 請加入知識星球【首席架構(gòu)師圈】

本文標(biāo)題:微服務(wù)器怎么改安全性 微服務(wù) 安全性
鏈接分享:http://muchs.cn/article10/dohcigo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、電子商務(wù)、網(wǎng)站排名、建站公司響應(yīng)式網(wǎng)站、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)