假設我們的分布式項目,admin是8087,gateway是8088,consumer是8086
我們一般的思路是我們的請求必須經過我們的網關8088然后網關轉發到我們的分布式項目,那我要是沒有處理我們繞過網關直接訪問項目8087和8086不也是可以?
所以我們會有個黑白名單來源控制來對這種特殊情況做處理
不用sentinel的做法
我們在網關那在轉發請求的時候+一個請求頭,請求頭的值固定
然后這個請求頭相當于密鑰我們不會對外暴露,然后在java代碼的攔截器中我們攔截請求判斷這個請求頭是否和配置一樣
優點:簡單
缺點:我們要是請求頭泄漏,我們發起請求的時候可以偽造請求頭這樣子我們仍然能跨網關訪問
用Sentinel的做法
sentinel+請求頭判斷來源做法
控制調用方
把我們的調用方分為白名單和黑名單
我們要的名稱其實是origin
RequestOriginParser接口
我們的sentinel是通過這個接口里的parseOrigin()這個方法,來獲取請求的來源的
這個方法的作用就是,從我們的request對象中解析出我們的origin的值
可惜,默認情況下這個方法返回的結果是default
如果不為空,那我們就把我們的origin作為請求頭返回
如果瀏覽器獲得的origin頭和網關獲取的請求頭不一樣,那他們的來源名稱就不一樣
這樣子我們就可以來編寫我們的規則了
區分請求是否經過網關
然后我們的網關有一個過濾器
請求頭的名字是origin,然后值是gateway
?
這樣我們從網關過來的就有請求頭,然后不是從網關過來的就沒有請求頭
之前如果我們知道正確的url,我們甚至可以繞過網關進行訪問,這樣子一點都不安全
實現步驟
連接RequestOriginParser接口
然后我們把它注冊成一個bean
為網關添加過濾器
看到沒,我們網關配置的請求頭的origin的值是gateway
總結
我們的sentinel是用這個方法來獲取我們的請求來源的
你看我們的返回值是String,我們就通過這個String來判斷我們的請求來源
我們默認請求頭有origin這個參數
因為我們配置從網關來的,我們的origin的參數時gateway
添加授權
我們剛剛的那個方法返回的參數,就是我們的來源的名稱
然后填寫我們的來源名稱
我們用8088端口繞過網關,發現不行
sentinel限制IP做法?
-
在業務服務中配置 Sentinel 的 IP 限制規則,只允許網關的 IP 訪問。
-
這種方式適用于網關和服務部署在同一內網環境的情況。
實現步驟:
-
獲取網關的 IP:
-
假設網關的 IP 是?
192.168.1.100
。
-
-
配置 Sentinel 規則:
-
在業務服務中配置 Sentinel 的白名單規則,只允許網關的 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 白名單規則*/@PostConstructpublic void initAuthorityRule() {// 創建 AuthorityRule 規則AuthorityRule rule = new AuthorityRule();rule.setResource("gateway_ip_whitelist"); // 資源名稱rule.setStrategy(RuleConstant.AUTHORITY_WHITE); // 白名單模式rule.setLimitApp("192.168.1.100"); // 只允許 Gateway 的 IP 訪問// 加載規則AuthorityRuleManager.loadRules(Collections.singletonList(rule));} }
-
3.業務服務層:
-
在業務服務中啟用 Sentinel 的流控功能,確保只有網關的請求可以通過
Gateway 的 IP
- 情況說明:如果 Gateway 沒有進行特殊的配置來傳遞客戶端 IP 信息,那么后端服務接收到的請求中的 IP 地址通常是 Gateway 的 IP 地址。
- 實現方式:這是比較常見的默認情況,例如一些簡單的網絡代理服務器在轉發請求時,如果沒有專門設置修改請求頭中的 IP 相關信息,后端服務器就只能看到代理服務器(即 Gateway)的 IP 地址,因為在網絡數據包傳輸過程中,源 IP 地址會被替換為 Gateway 的出口 IP 地址。
?如果我們要保留之前的客戶端請求的IP,我們要在Gateway做額外處理