一、概述
Spring Cloud Gateway是一個基於Spring Boot 2.0+和Spring Framework 5.0+的網關,旨在為微服務架構提供一種簡單有效的方式來處理API請求。Spring Cloud Gateway作為Spring Cloud生態系統中的網關,目標是提供統一的路由方式且基於Filter鏈的方式提供各種便捷的操作,例如:熔斷、限流、重試等。
二、動態路由介紹
動態路由是Spring Cloud Gateway最為重要的功能之一,它提供了非常方便的方式來動態增刪改路由規則而無需停止服務。採用動態路由可以讓我們實現路由的自由發揮,充分發揮Spring Cloud Gateway的優勢,使得我們能夠在反向代理層面對請求進行攔截和控制,達到限流、鑒權、監控等效果。
三、動態路由配置示例
下面我們以一個示例來講解如何配置Spring Cloud Gateway的動態路由,假設有三個服務分別是service1、service2、service3,下面是對service1進行動態路由配置的代碼示例:
spring: cloud: gateway: routes: - id: service1_route uri: http://localhost:8080 predicates: - Path=/service1/** filters: - RewritePath=/service1(?<segment>/?.*), $\{segment}
上面的配置意味着,所有路徑為 /service1/** 的請求將被轉發到 http://localhost:8080 這個服務上, RewritePath 告訴網關重新解析路徑。如果沒有此過濾器,/service1/** 對應的請求將會被發送到後端的 /service1 這個路徑上,RewritePath 的作用就是將 /service1/** 路徑下的所有請求的 /service1 替換成空字符串。
四、動態路由實現原理
動態路由的實現依賴於 Spring Cloud Gateway 的核心——RouteLocator,Spring Cloud Gateway 將配置中的所有 Route 信息交給 RouteLocator,RouteLocator根據自身的實現方式返回一個包含所有 Route 信息的 RouteDefinition 列表,Spring Cloud Gateway 則將這些 RouteDefinition 轉換為 Route,並啟動這些 Route 將請求轉發到後端的服務。
當註冊中心中的服務數量發生變化或者配置方式發生變化時,Spring Cloud Gateway會接收到配置中心發來的消息,更新本地的 RouteLocator 中記錄的 RouteDefinition,Spring Cloud Gateway內置了一個RefreshRoutesListener,用來更新 Route,網關收到消息後會觸發RefreshRoutesEvent事件,最終調用RefreshRoutesListener的onApplicationEvent方法,執行Route表的刷新操作,具體如下:
public class RefreshRoutesListener implements ApplicationListener { private static final Logger log = LoggerFactory.getLogger(RefreshRoutesListener.class); private final RouteDefinitionRouteLocator routeDefinitionRouteLocator; private final GatewayProperties gatewayProperties; private final RouteLocator routeLocator; public RefreshRoutesListener(RouteDefinitionRouteLocator routeDefinitionRouteLocator, GatewayProperties gatewayProperties, RouteLocator routeLocator) { this.routeDefinitionRouteLocator = routeDefinitionRouteLocator; this.gatewayProperties = gatewayProperties; this.routeLocator = routeLocator; } @Override public void onApplicationEvent(RefreshRoutesEvent event) { log.debug("Received refresh event"); routeDefinitionRouteLocator.setRouteDefinitions(event.getRouteDefinitions()); CompositeRouteLocator routeLocator = new CompositeRouteLocator(this.routeLocator.getRouteLocators()); routeLocator.getRouteDefinitions().subscribe(this::logRefreshComplete); this.routeDefinitionRouteLocator.initialized(routeLocator); this.gatewayProperties.getRoutes().stream().filter( route -> route.getId().equals("default")).findFirst().ifPresent(defaultRoute -> { if (event.getRouteDefinitions().isEmpty()) { log.debug("Clear out the default route"); defaultRoute.setUri(null); } }); } private void logRefreshComplete(Collection routeDefinitions) { if (log.isDebugEnabled()) { log.debug("Routes refreshed: " + routeDefinitions); } } }
五、動態路由的優點
採用Spring Cloud Gateway的動態路由可以提供以下幾個優點:
1、靈活性高:動態路由能夠讓我們對路由進行更加靈活的控制,能夠更加精準地選擇服務。
2、可擴展性高:動態路由對後端的服務並沒有太多的要求,用戶可以通過增加規則的方式對新的服務進行支持。
3、無需重啟:實現動態路由之後,即可實現對服務的動態路由,不需要重啟 Spring Cloud Gateway 服務。
六、總結
SpringCloudGateway的動態路由功能是SpringCloud Gateway優秀的特性之一,這個特性可以讓我們在網關層面實現更加細緻化的控制,同時也提高了整個系統的可擴展性和靈活性,是我們在進行微服務架構設計時很好的選擇。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/152125.html