蘭州拼團(tuán)網(wǎng)站建設(shè)競價(jià)賬戶托管哪家好
假設(shè)我們的分布式項(xiàng)目,admin是8087,gateway是8088,consumer是8086
我們一般的思路是我們的請求必須經(jīng)過我們的網(wǎng)關(guān)8088然后網(wǎng)關(guān)轉(zhuǎn)發(fā)到我們的分布式項(xiàng)目,那我要是沒有處理我們繞過網(wǎng)關(guān)直接訪問項(xiàng)目8087和8086不也是可以?
所以我們會有個(gè)黑白名單來源控制來對這種特殊情況做處理
不用sentinel的做法
我們在網(wǎng)關(guān)那在轉(zhuǎn)發(fā)請求的時(shí)候+一個(gè)請求頭,請求頭的值固定
然后這個(gè)請求頭相當(dāng)于密鑰我們不會對外暴露,然后在java代碼的攔截器中我們攔截請求判斷這個(gè)請求頭是否和配置一樣
優(yōu)點(diǎn):簡單
缺點(diǎn):我們要是請求頭泄漏,我們發(fā)起請求的時(shí)候可以偽造請求頭這樣子我們?nèi)匀荒芸缇W(wǎng)關(guān)訪問
用Sentinel的做法
sentinel+請求頭判斷來源做法
控制調(diào)用方
把我們的調(diào)用方分為白名單和黑名單
我們要的名稱其實(shí)是origin
RequestOriginParser接口
我們的sentinel是通過這個(gè)接口里的parseOrigin()這個(gè)方法,來獲取請求的來源的
這個(gè)方法的作用就是,從我們的request對象中解析出我們的origin的值
可惜,默認(rèn)情況下這個(gè)方法返回的結(jié)果是default
如果不為空,那我們就把我們的origin作為請求頭返回
如果瀏覽器獲得的origin頭和網(wǎng)關(guān)獲取的請求頭不一樣,那他們的來源名稱就不一樣
這樣子我們就可以來編寫我們的規(guī)則了
區(qū)分請求是否經(jīng)過網(wǎng)關(guān)
然后我們的網(wǎng)關(guān)有一個(gè)過濾器
請求頭的名字是origin,然后值是gateway
?
這樣我們從網(wǎng)關(guān)過來的就有請求頭,然后不是從網(wǎng)關(guān)過來的就沒有請求頭
之前如果我們知道正確的url,我們甚至可以繞過網(wǎng)關(guān)進(jìn)行訪問,這樣子一點(diǎn)都不安全
實(shí)現(xiàn)步驟
連接RequestOriginParser接口
然后我們把它注冊成一個(gè)bean
為網(wǎng)關(guān)添加過濾器
看到?jīng)],我們網(wǎng)關(guān)配置的請求頭的origin的值是gateway
總結(jié)
我們的sentinel是用這個(gè)方法來獲取我們的請求來源的
你看我們的返回值是String,我們就通過這個(gè)String來判斷我們的請求來源
我們默認(rèn)請求頭有origin這個(gè)參數(shù)
因?yàn)槲覀兣渲脧木W(wǎng)關(guān)來的,我們的origin的參數(shù)時(shí)gateway
添加授權(quán)
我們剛剛的那個(gè)方法返回的參數(shù),就是我們的來源的名稱
然后填寫我們的來源名稱
我們用8088端口繞過網(wǎng)關(guān),發(fā)現(xiàn)不行
sentinel限制IP做法?
-
在業(yè)務(wù)服務(wù)中配置 Sentinel 的 IP 限制規(guī)則,只允許網(wǎng)關(guān)的 IP 訪問。
-
這種方式適用于網(wǎng)關(guān)和服務(wù)部署在同一內(nèi)網(wǎng)環(huán)境的情況。
實(shí)現(xiàn)步驟:
-
獲取網(wǎng)關(guān)的 IP:
-
假設(shè)網(wǎng)關(guān)的 IP 是?
192.168.1.100
。
-
-
配置 Sentinel 規(guī)則:
-
在業(yè)務(wù)服務(wù)中配置 Sentinel 的白名單規(guī)則,只允許網(wǎng)關(guān)的 IP 訪問。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager; import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct; import java.util.Collections;@Configuration public class SentinelAuthorityRuleConfig {/*** 配置 Sentinel 的 IP 白名單規(guī)則*/@PostConstructpublic void initAuthorityRule() {// 創(chuàng)建 AuthorityRule 規(guī)則AuthorityRule rule = new AuthorityRule();rule.setResource("gateway_ip_whitelist"); // 資源名稱rule.setStrategy(RuleConstant.AUTHORITY_WHITE); // 白名單模式rule.setLimitApp("192.168.1.100"); // 只允許 Gateway 的 IP 訪問// 加載規(guī)則AuthorityRuleManager.loadRules(Collections.singletonList(rule));} }
-
3.業(yè)務(wù)服務(wù)層:
-
在業(yè)務(wù)服務(wù)中啟用 Sentinel 的流控功能,確保只有網(wǎng)關(guān)的請求可以通過
Gateway 的 IP
- 情況說明:如果 Gateway 沒有進(jìn)行特殊的配置來傳遞客戶端 IP 信息,那么后端服務(wù)接收到的請求中的 IP 地址通常是 Gateway 的 IP 地址。
- 實(shí)現(xiàn)方式:這是比較常見的默認(rèn)情況,例如一些簡單的網(wǎng)絡(luò)代理服務(wù)器在轉(zhuǎn)發(fā)請求時(shí),如果沒有專門設(shè)置修改請求頭中的 IP 相關(guān)信息,后端服務(wù)器就只能看到代理服務(wù)器(即 Gateway)的 IP 地址,因?yàn)樵诰W(wǎng)絡(luò)數(shù)據(jù)包傳輸過程中,源 IP 地址會被替換為 Gateway 的出口 IP 地址。
?如果我們要保留之前的客戶端請求的IP,我們要在Gateway做額外處理