客戶端向spring-cloud-gateway請求網關映射處理程序(gateway handler mapping),如果確認請求與路由匹配,則將請求發送到web處理程序(gateway web handler),web處理程序通過特定於該請求的過濾器鏈處理請求,圖中filters被虛線劃分的原因是filters可以在發送代理請求之前(pre filter)或之後執行邏輯(post filter)。先執行所有pre filter邏輯,然後進行請求代理。在請求代理執行完後,執行post filter邏輯。
開始使用Spring-Cloud-Gateway
Spring Cloud Gateway依賴Spring Boot和Spring Webflux提供的Netty runtime,所以springboot必須在2.0或者以上,springcloud在Finchley以上,基本springcloud環境確認後,然後引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
路由配置
官網都是用的yml
配置文件配置,與properties
配置文件配置稍有不同,我這裏全部使用properties
配置文件配置。
直接使用註冊中心路由配置
#使用服務發現路由
spring.cloud.gateway.discovery.locator.enabled=true
#服務路由名小寫
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
指定服務配置
#設置路由id
spring.cloud.gateway.routes[0].id=auth-service
#設置路由的uri
spring.cloud.gateway.routes[0].uri=lb://auth-service
#設置路由斷言,代理servicerId爲auth-service的/auth/路徑
spring.cloud.gateway.routes[0].predicates[0]= Path=/auth/**
spring.cloud.gateway.routes.predicates:路由斷言,配置時必須得有一項,不一定是Path;
spring.cloud.gateway.routes.uri:配置路由uri,"lb://‘serviceId’"前代表路由的服務,同時也可以是一個url
編碼服務配置
//java項目www.fhadmin.org
@Configuration
public class RoutesConfiguration {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route(predicateSpec ->
predicateSpec.path("/auth/**").uri("lb://auth-service").id("auth-service")
).build();
}
}
總結
Spring-Cloud-Gateway與Zuul 1.0相比,前者基於WebFlux與Reactive線程模型的異步非阻塞框架,服務通過底層的Netty來進行發佈及運行,異步非阻塞可以有效降低系統的線程數量,只需要很少的線程就可以完成較高的併發支持,而Zuul1.0是基於servlet性能上的差距可想而知,同時Spring-Cloud-Gateway還內置了許多的路由斷言(Factories)與過濾器(Filter)可以減少開發人員的編碼,和更好的功能支持和擴展