1.簡介
在sentinel的流控規則,與授權規則中,都提供了來源區分。
比如流控規則:這裏的針對來源,表示針對哪些調用來源進行限流
-
默認值default表示不區分來源,即任何調用來源都限流
-
如果需要指定來源進行限流,比如說調用端有:app、pc
-
針對app調用要限流,針對pc調用不限流,該如何實現呢?
-
需要注意:sentinel默認是隻認default,其它不認識!!!
比如授權規則:這裏流控應用,表示針對哪些應用調用需要授權,或者禁止
-
配合選擇白名單,表示流控應用中指定的應用,允許訪問
-
配合選擇黑名單,表示流控應用中指定的應用,不允許訪問
-
需要注意:sentinel默認是不提供來源區分,因此授權規則默認情況下用不了
-
那如果需要使用授權規則,該如何實現呢?
2.擴展RequestOriginParser
要想實現流控規則中的針對來源,以及授權規則中指定流控應用。sentinel給我們提供了一個接口
public interface RequestOriginParser {
String parseOrigin(HttpServletRequest var1);
}
我們只需要擴展RequestOriginParser接口,即可實現區分來源的業務場景需求,要實現區分來源,得有來源標識,這裏我有兩個建議
-
http請求參數中,傳遞來源標識
-
http請求頭中,傳遞來源標識
在實際項目中,我建議從http請求頭中,傳遞來源標識,這樣會讓請求更加優雅一些!放到請求參數中,會使得請求參數稍微難堪!比如這樣的:http://ip:port/shop/add?origin=app,非要加【?origin=app】這一段來傳遞來源標識,醜陋,非常醜陋!
但是在我的這個案例中,爲了演示方便,我還是選擇醜陋的方式了,小夥伴們諒解諒解!
@Component
public class MyRequestOriginParser implements RequestOriginParser {
/**
* 解析來源
* @param request
* @return
*/
public String parseOrigin(HttpServletRequest request) {
// 1.這裏從請求參數中獲取origin(實際應用中,建議從http請求頭獲取更佳!)
String origin = request.getParameter("origin");
return origin;
}
}
3.測試效果
啓動應用,分別測試流控規則針對來源,以及授權規則,看看效果吧!
3.1.流控規則
配置流控規則,指定流控規則來源app
訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=app,瘋狂刷新,流控了!
訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,瘋狂刷新,沒有發生流控!
3.2.授權規則
配置授權規則,指定流控應用:app,並選擇白名單,表示只允許app端訪問
訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=app,可以正常訪問!
訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,禁止訪問,提示沒有授權!
{"status":500,"msg":"error,沒有訪問權限!"}
提前友情提示:原計劃我們下一篇要分享【擴展sentinel之支持restful url】,因在sentinel新的版本中,已經支持了restful 風格url,那麼該篇文章我們就省略了。
有小夥伴可能會有疑問,什麼是restful風格url?
-
在sentinel早先版本中,應該是1.6以前版本,會把具體的請求url作爲資源
-
比如說:http://127.0.0.1:8080/sentinel/grade/1;http://127.0.0.1:8080/sentinel/grade/2會被當做兩個資源
-
而其實我們期望的資源,應該是:http://127.0.0.1:8080/sentinel/grade/{userId},這樣的
-
那麼在新版本中,我們這裏使用的是1.8版本,它已經是我們期望的了
-
如果有小夥伴使用早期版本,或者說感興趣,可以參考sentinel提供的接口UrlCleaner