一.微服務(wù)架構(gòu)回顧
那我們先回憶一下,常用4種架構(gòu)之微服務(wù)架構(gòu)。
微服務(wù)架構(gòu),主要是中間層分解,將系統(tǒng)拆分成很多小應(yīng)用(微服務(wù)),微服務(wù)可以部署在不同的服務(wù)器上,也可以部署在相同的服務(wù)器不同的容器上。當(dāng)應(yīng)用的故障不會影響到其他應(yīng)用,單應(yīng)用的負(fù)載也不會影響到其他應(yīng)用,其代表框架有Springcloud、Dubbo等。其架構(gòu)圖如下所示:
易于開發(fā)和維護(hù):一個微服務(wù)只會關(guān)注一個特定的業(yè)務(wù)功能,所以它業(yè)務(wù)清晰、代碼量較少。開發(fā)和維護(hù)單個微服務(wù)相對簡單。而整個應(yīng)用是由若干個微服務(wù)構(gòu)建而成的,所以整個應(yīng)用也會被維持在一個可控狀態(tài)。
單個微服務(wù)啟動較快:單個微服務(wù)代碼量較少,所以啟動會比較快。
局部修改容易部署:單體應(yīng)用只要有修改,就得重新部署整個應(yīng)用,微服務(wù)解決了這樣的問題。一般來說,對某個微服務(wù)進(jìn)行修改,只需要重新部署這個服務(wù)即可。
技術(shù)棧不受限:在微服務(wù)架構(gòu)中,可以結(jié)合項(xiàng)目業(yè)務(wù)及團(tuán)隊(duì)的特點(diǎn),合理地選擇技術(shù)棧。例如某些服務(wù)可使用關(guān)系型數(shù)據(jù)庫MySQL;某些微服務(wù)有圖形計算的需求,可以使用Neo4j。甚至可根據(jù)需要,部分微服務(wù)使用Java開發(fā),部分微服務(wù)使用Node.js開發(fā)。微服務(wù)雖然有很多吸引人的地方,但它并不是免費(fèi)的午餐,使用它是有代價的。使用微服務(wù)架構(gòu)面臨的挑戰(zhàn)。
運(yùn)維要求較高:更多的服務(wù)意味著更多的運(yùn)維投入。在單體架構(gòu)中,只需要保證一個應(yīng)用的正常運(yùn)行。而在微服務(wù)中,需要保證幾十甚至幾百個服務(wù)服務(wù)的正常運(yùn)行與協(xié)作,這給運(yùn)維帶來了很大的挑戰(zhàn)。
分布式固有的復(fù)雜性:使用微服務(wù)構(gòu)建的是分布式系統(tǒng)。對于一個分布式系統(tǒng),系統(tǒng)容錯、網(wǎng)絡(luò)延遲、分布式事務(wù)等都會帶來巨大的挑戰(zhàn)。
接口調(diào)整成本高:微服務(wù)之間通過接口進(jìn)行通信。如果修改某一個微服務(wù)的API,可能所有使用了該接口的微服務(wù)都需要做調(diào)整。
重復(fù)勞動:很多服務(wù)可能都會使用到相同的功能,而這個功能并沒有達(dá)到分解為一個微服務(wù)的程度,這個時候,可能各個服務(wù)都會開發(fā)這一功能,從而導(dǎo)致代碼重復(fù)。盡管可以使用共享庫來解決這個問題(例如可以將這個功能封裝成公共組件,需要該功能的微服務(wù)引用該組件),但共享庫在多語言環(huán)境下就不一定行得通了。
二.親身小經(jīng)歷
上面扯皮了這么多,還不到關(guān)鍵的地方,到底搞什么鬼呀?我不是有意的,我就想讓大家再過過概念。好啦,現(xiàn)在我們開始吧!看看我當(dāng)時的微服務(wù)架構(gòu)(我那會用SpingCloud,就根據(jù)SpingCloud講一講),大家看安不安全?以下內(nèi)容基本使用白話文扯皮子。
看不清楚的,大家可以點(diǎn)擊圖片放大看一看。從中可以看出這是SpringCloud微服務(wù)架構(gòu)圖,至于Dubbo等微服務(wù)架構(gòu)思路大體也是這樣。從中我們看出為了保證安全可靠性,我們用了gateway、oauth2.0。至于這兩項(xiàng)技術(shù)到底穩(wěn)不穩(wěn),我們分開聊一聊。
三.gateway
1.gateway是什么?
SpringCloudGateway是Spring官方基于Spring5.0,SpringBoot2.0和ProjectReactor等技術(shù)開發(fā)的網(wǎng)關(guān),SpringCloudGateway旨在為微服務(wù)架構(gòu)提供一種簡單而有效的統(tǒng)一的API路由管理方式。SpringCloudGateway作為SpringCloud生態(tài)系中的網(wǎng)關(guān),目標(biāo)是替代NetflixZUUL,其不僅提供統(tǒng)一的路由方式,并且基于Filter鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/埋點(diǎn),和限流等。
2.gateway怎么用?
SpringCloudGateway怎么用,在這里我主要是為了講述微服務(wù)的安全性,我就不上代碼了,我就講講理論知識,具體細(xì)節(jié)等下我提供一些我之前的文章鏈接,供大家學(xué)習(xí)。
一個組件引入,無非就以下幾件事情:
引入依賴包。
相關(guān)yml配置(即文件配置)。
上手方式:要么使用文件配置方式、要么使用javaapi(如果有其它的再說,目前我知道就這兩種),然后就完事了。
3.gateway能為微服務(wù)提供什么安全性保障?
SpringCloudGateway為我們提供了什么服務(wù)?由上面微服務(wù)架構(gòu)圖,我們可以看出移動客戶端、管理后臺訪問微服務(wù)1、2、3接口必須經(jīng)過gateway。gateway作為中間件,它的核心方法是filter,它就可以做以下幾件事情:
按照自定的過濾方式進(jìn)行攔截,符合約定的就可以通過或者被攔截。這樣亂七八糟的接口就不能訪問了嘛,這樣就可以保證服務(wù)微服務(wù)的安全性。
既然能攔截到一切接口,那就可以對一些熱點(diǎn)接口,做一些限流操作,比如a接口在一分鐘內(nèi)訪問次數(shù)超過2萬次,我們就讓他降級,讓它響應(yīng)其它事件。
容錯處理,請求有問題,就做一些特殊回調(diào)。
其它呀,反正接口都流經(jīng)過你這里,你想怎么玩就怎么玩咯。
我曾經(jīng)寫過的一些SpringCloudGateway文章:
SpringCloud之Gateway(一):基本了解及謂詞詳解
SpringCloud之Gateway(二):網(wǎng)關(guān)過濾器
SpringCloud之Gateway(三):全局過濾器
SpringCloud之Gateway(四):TLS/SSL、配置、跨域訪問配置、執(zhí)行器API、開發(fā)人員指南及MVC或Webflux搭建Gateway
四.oauth2.0
oauth2.0按照gateway方式,我們同樣從以下三個問題分析一下:
1.oauth2.0是什么?
OAuth2.0協(xié)議為用戶資源的授權(quán)提供了一個安全又簡易的標(biāo)準(zhǔn)。與以往的授權(quán)方式不同之處是OAuth的授權(quán)不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權(quán),因此OAuth2.0是安全的。
2.oauth2.0怎么用?
SpringCloud可以使用OAuth2.0來實(shí)現(xiàn)多個微服務(wù)的統(tǒng)一認(rèn)證授權(quán),通過向OAuth2.0服務(wù)進(jìn)行集中認(rèn)證和授權(quán),獲得access_token,而這個token是受其他微服務(wù)信任的,在后續(xù)的訪問中都把a(bǔ)ccess_token帶過去,從而實(shí)現(xiàn)了微服務(wù)的統(tǒng)一認(rèn)證授權(quán)。核心功能主要是以下兩點(diǎn):
其一是認(rèn)證與鑒權(quán),對于請求的用戶身份的授權(quán)以及合法性鑒權(quán);
其二是API級別的操作權(quán)限控制,這個在第一點(diǎn)之后,當(dāng)鑒定完用戶身份合法之后,對于該用戶的某個具體請求是否具有該操作執(zhí)行權(quán)限進(jìn)行校驗(yàn)。
OAuth2.0定義了四種授權(quán)方式。
授權(quán)碼模式(authorizationcode)
簡化模式(implicit)
密碼模式(resourceownerpasswordcredentials)
客戶端模式(clientcredentials)
3.oauth2.0能為微服務(wù)提供什么安全性保障?
由上可知,只需在訪問服務(wù)前增加OAuth2.0服務(wù)就能保證用戶的相對安全了,一個用戶能不能訪問接口,oauth2.0來做最后一道關(guān)閘。這樣就能保證微服務(wù)架構(gòu)的相對安全性了。
五.其它
1.使用nginx服務(wù)器,作用如下:
反向代理:代理我們要訪問的目標(biāo)服務(wù)器。
2.中間件搭建集群。
3.其它,你來補(bǔ)充