Spring Cloud Gateway是Spring官方基於Spring 5.0,Spring Boot 2.0和Project Reactor等技術開發的網關,Spring Cloud Gateway旨在爲微服務架構提供一種簡單而有效的統一的API路由管理方式。Spring Cloud Gateway做爲Spring Cloud生態系中的網關,目標是替代Netflix ZUUL,其不只提供統一的路由方式,而且基於Filter鏈的方式提供了網關基本的功能,例如:安全,監控/埋點,和限流等。git
可能有同窗就要問了,不是已經有Zuul了嗎,爲何又搞了一個網關,這更新的節奏確實很快哈,沒精力還真學習不過來。github
之因此新搞了一個網關,是由於Zuul基於servlet 2.5 (works with 3.x),使用阻塞API。它不支持任何長期的鏈接,如websocket。web
Gateway創建在Spring Framework 5,Project Reactor和Spring Boot 2上,使用非阻塞API。支持Websockets,由於它與Spring緊密集成,因此它會是一個讓開發者有更好體驗的框架。固然性能的提高是確定的,否則徹底不必從新搞一個啊,只不過Zuul2出來的太遲了,本身已經搞了一個,因此不太可能會將Zuul2集成到Spring Cloud中了。spring
關於性能這塊的比較能夠參考我周兄的文章《糾錯帖:Zuul & Spring Cloud Gateway & Linkerd性能對比》後端
工做原理
工做原理
如上圖所示,客戶端發送請求到Spring Cloud Gateway,Gateway Handler Mapping肯定請求與路由匹配,則會將請求交給Gateway Web Handler處理。
在代理先後能夠執行多個過濾器。最後代理到具體的服務。安全
首先仍是最基本的步驟,建立一個Maven項目,添加Gateway須要的依賴信息:微信
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>
編寫啓動類:websocket
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 網關啓動入口 * * @author yinjihuan * * @about http://cxytiandi.com/about * */ @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
下面來實現一個最簡單的轉發功能,基於Path的匹配轉發功能。markdown
在resources下面建一個application.yml的文件, 內容以下:架構
server: port: 8084 spring: cloud: gateway: routes: - id: path_route uri: http://cxytiandi.com predicates: - Path=/course
當你訪問http://localhost:8084/course的時候就會轉發到http://cxytiandi.com/course,效果以下:
課程列表
關於路由規則什麼的咱們後面再作介紹,本章只是先體驗下Spring Cloud Gateway的功能,可以建立一個新的項目,成功啓動就能夠了,一步步來。
若是你的項目中包含了spring-cloud-starter-gateway,但你不想啓動網關的時候能夠經過下面的配置禁用掉:
application.properties
spring.cloud.gateway.enabled=false.
application.yml
spring: cloud: gateway: enabled: false
上面講解的是基於配置的方式來實現路由,還有一種方式是經過代碼的方式來進行路由,好比:
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.path("/course").uri("http://cxytiandi.com")) .build(); }
示列代碼:https://github.com/yinjihuan/spring-cloud/tree/master/fangjia-gateway
更多技術分享請關注微信公衆號:猿天地
猿天地
文章推薦
1大牛坐鎮|高端JAVA純技術羣你要加入嗎?
2 Spring Cloud如何提供API給客戶端
3先後端API交互如何保證數據安全性?
4Zuul過濾器獲取請求參數問題?
5Java作爬蟲也很牛
更多技術分享盡在微信羣,加羣請關注公衆號,點擊加羣按鈕。