簡單嘗試Spring Cloud Gateway
簡介
Spring Cloud Gateway是一個API網關,它是用於代替Zuul而出現的。Spring Cloud Gateway構建於Spring生態系統之上,包括Spring5,SpringBoot2等。它的目標是提供簡單、有效的方式路由你的API。
Spring Cloud Gateway不能在傳統的Servlet容器中工作,也不能構建成一個war包工作。這一點很重要。
重要概念
- 路由:Gateway的基礎構建模塊。它包括一個ID,一個目標URL,一個斷言集合和一個過濾器集合。如果斷言判斷為真,則路由匹配。
- 斷言:這是Java8的新增功能,輸入的類型為Spring框架的ServerWebExchange。它可以匹配HTTP請求中的任何東西,比如:請求頭或者參數。
- 過濾器:是Spring框架的GatewayFilter,請求和響應都可以被Filter修改。
Spring Cloud Gateway的流程圖如下:
創建一個簡單的路由
首先我們使用IDEA創建Spring-boot項目,並選擇spring-cloud-starter-gateway依賴,請注意,這里千萬不能選擇spring-boot-starter-web,它們兩個不能同時存在。然后我們在啟動類中,增加如下代碼:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org"))
.build();
}
myRoutes方法的輸入參數類型為RouteLocatorBuilder,它可以非常簡單的向路由中增加斷言和過濾器。上例中,我們的斷言為“/get”,凡是訪問路由網關中的“/get”路徑,都會在請求頭中增加“Hello”—“World”鍵值對,並且會轉發到http://httpbin.org。我們啟動項目,並在瀏覽器中訪問http://localhost:8080/get,結果如下:
當我們訪問http://localhost:8080/get時,Gateway首先會判斷路徑/get,確定路徑/get符合條件后,在請求頭中添加“Hello”—“World”。然后會轉發請求到http://httpbin.org/get,然后返回上圖的響應。
使用Hystrix熔斷
我們還可以在Gateway中,使用熔斷機制,當我們轉發請求,獲取的響應超時(504錯誤)時,可以喚起我們設置的熔斷措施,並返回預設的結果。代碼如下:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org:80"))
.route(p -> p
.host("*.hystrix.com")
.filters(f -> f.hystrix(config -> config
.setName("myHystrix")
.setFallbackUri("forward:/fallback")))
.uri("http://httpbin.org"))
.build();
}
@RequestMapping("fallback")
public String fallback() {
return "Hello,Hystrix fallback";
}
我們看方法中的第二個route,斷言的判斷為Host=*.hystrix.com,當請求頭中的Host為*.hystrix.com,進入此路由,然后再過濾器中,設置Hystrix熔斷,當請求超時時,請求轉發到Gateway中的“/fallback”,"/fallback"我們將返回“Hello,Hystrix fallback”。我們啟動Gateway,並通過Postman配置請求頭Host=www.hystrix.com,訪問http://localhost:8080/delay/3。結果如下:
Spring Cloud Gateway就先介紹到這里,當然它還有很多強大的功能,在這里並沒有一一展開的去講。如有疑問,歡迎評論區留言哦~