Spring Cloud Gateway是Spring Cloud官方推出的第二代網關框架,取代Zuul網關。
網關作為流量的,在微服務系統中有着非常作用。
網關常見的功能有:
1、路由轉發、
2、權限校驗、
3、限流控制、
4、日志監控
5、協議轉換
6、網關層緩存
總結:
網關的本質,就是它可以實現功能的集合。
概覽圖:
關鍵的類:
1、RouteLocator 路由的轉發。
2、predicate 請求與路由進行匹配
3、filter 過濾與修改
3.1、GatewayFilter : 需要通過spring.cloud.routes.filters 配置在具體路由下,只作用在當前路由上或通過spring.cloud.default-filters配置在全局,作用在所有路由上。
3.2、GlobalFilter : 全局過濾器,不需要在配置文件中配置,作用在所有的路由上,最終通過GatewayFilterAdapter包裝成GatewayFilterChain可識別的過濾器,它為請求業務以及路由的URI轉換為真實業務服務的請求地址的核心過濾器,不需要配置,系統初始化時加載,並作用在每個路由上。
4、自定義過濾器,需要實現以下兩個接口 :GatewayFilter, Ordered
5、限流過濾器
5.1、常見的限流算法:
5.1.1、計數器算法:簡單來說,就是一分鍾之內僅允許通過多少個請求。(缺點:突刺現象,無法解決某段時間並發高的問題)
5.1.2、漏桶算法:不管流量瞬間並發多高,都保持勻速消費request。(弊端:無法應對短時間的突發流量)
5.1.3、令牌桶算法:從某種意義上講,令牌桶算法是對漏桶算法的一種改進,桶算法能夠限制請求調用的速率,而令牌桶算法能夠在限制調用的平均速率的同時還允許一定程度的突發調用。在令牌桶算法中,存在一個桶,用來存放固定數量的令牌。算法中存在一種機制,以一定的速率往桶中放令牌。每次請求調用需要先獲取令牌,只有拿到令牌,才有機會繼續執行,否則選擇選擇等待可用的令牌、或者直接拒絕。放令牌這個動作是持續不斷的進行,如果桶中令牌數達到上限,就丟棄令牌,所以就存在這種情況,桶中一直有大量的可用令牌,這時進來的請求就可以直接拿到令牌執行,比如設置qps為100,那么限流器初始化完成一秒后,桶中就已經有100個令牌了,這時服務還沒完全啟動好,等啟動完成對外提供服務時,該限流器可以抵擋瞬時的100個請求。所以,只有桶中沒有令牌時,請求才會進行等待,最后相當於以一定的速率執行。
5.2、GateWay的實現:Spring Cloud Gateway官方就提供了RequestRateLimiterGatewayFilterFactory這個類,適用Redis和lua腳本實現了令牌桶的方式。
注意:在“pre”類型的過濾器可以做參數校驗、權限校驗、流量監控、日志輸出、協議轉換等,在“post”類型的過濾器中可以做響應內容、響應頭的修改,日志的輸出,流量監控等。