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(); }