Spring Cloud Gateway是SpringCloud的全新子項目,該項目基於Spring5.x、SpringBoot2.x技術版本進行編寫,意在提供簡單方便、可擴展的統一API路由管理方式。
概念解釋:
Route(路由):路由是網關的基本單元,由ID、URI、一組Predicate、一組Filter組成,根據Predicate進行匹配轉發。Predicate(謂語、斷言):路由轉發的判斷條件,目前SpringCloud Gateway支持多種方式,常見如:Path、Query、Method、Header等。Filter(過濾器):過濾器是路由轉發請求時所經過的過濾邏輯,可用於修改請求、響應內容。
開始使用
Spring Cloud Gateway目前有兩種方式進行配置:
application.yml配置文件方式- 通過@Bean注解
RouteLocator方法返回值
route的組成部分
id:路由的IDuri:匹配路由的轉發地址predicates:配置該路由的斷言,通過PredicateDefinition類進行接收配置。- order:路由的優先級,數字越小,優先級越高。
Spring Cloud Gateway Predicates
每一個Predicate的使用,你可以理解為:當滿足這種條件后才會被轉發,如果是多個,那就是都滿足的情況下被轉發。

Path 方式匹配轉發
我們在application.yml配置文件內添加對應的路由配置,如下所示
spring: application: name: spring-cloud-gateway-sample cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: # 匹配路徑轉發 - Path=/api-boot-datasource-switch.html # 端口號 server: port: 9090
在上面的配置中,當訪問http://localhost:9090/api-boot-datasource-switch.html時就會被自動轉發到http://blog.yuqiyu.com/api-boot-datasource-switch.html,這里要注意完全匹配Path的值時才會進行路由轉發
,對應的 RouteLocator方式該怎么進行配置
@Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("blog", r -> r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com")) .build(); } id:blog path:/api-boot-datasource-switch.html uri:http://blog.yuqiyu.com
Host 方式匹配轉發
Spring Cloud Gateway可以根據Host主機名進行匹配轉發,如果我們的接口只允許**.yuqiyu.com域名進行訪問,那么配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: - Host=**.yuqiyu.com
對應的 RouteLocator方式該進行配置
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.host("**.yuqiyu.com") .uri("http://blog.yuqiyu.com") .order(1) .id("blog") ) .build(); }
組合示例
相同的Predicate也可以配置多個,請求的轉發是必須滿足所有的Predicate后才可以進行路由轉發,組合使用示例如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: - Method=GET - Host=**.yuqiyu.com - Path=192.168.1.56/24
對應的 RouteLocator方式該進行配置
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.host("**.yuqiyu.com") .and().path("/api-boot-datasource-switch.html") .and().method("GET") .uri("http://blog.yuqiyu.com") .order(1) .id("blog") ) .build(); }
