Spring Cloud GateWay 入門(一)

Spring 官方最終還是按捺不住推出了自己的網關組件:Spring Cloud Gateway ,相比之前我們使用的 Zuul(1.x) 它有哪些優勢呢?Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何長連接,如 WebSockets,Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性。

Spring Cloud Gateway介紹


Spring Cloud Gateway 是 是基于 Spring 5.0,Spring Boot 2.0, Project Reactor和WebFlux等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。

Spring Cloud Gateway 作為 Spring Cloud 生態系統中的網關,目標是替代 Netflix Zuul,其不僅提供統一的路由方式,并且基于 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

相關概念:

  • Route(路由):這是網關的基本構建塊。它由一個 ID,一個目標 URI,一組斷言和一組過濾器定義。如果斷言為真,則路由匹配。
  • Predicate(斷言):這是一個 Java 8 的Function Predicate。輸入類型是一個 [Spring Framework ServerWebExchange]。我們可以使用它來匹配來自 HTTP 請求的任何內容,例如 headers 或參數。
  • Filter(過濾器):這是org.springframework.cloud.gateway.filter.GatewayFilter的實例,我們可以使用它修改請求和響應。

工作流程:

image

客戶端向 Spring Cloud Gateway 發出請求。如果 Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到 Gateway Web Handler。Handler 再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回。 過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之后(“post”)執行業務邏輯。

Spring Cloud Gateway 的特征:

  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
  • 動態路由
  • Predicates 和 Filters 作用于特定路由
  • 集成 Hystrix 斷路器
  • 集成 Spring Cloud DiscoveryClient
  • 易于編寫的 Predicates 和 Filters
  • 限流
  • 路徑重寫

快速上手


Spring Cloud Gateway 網關路由有兩種配置方式:

  • 在配置文件 yml 中配置
  • 通過@Bean自定義 RouteLocator,在啟動主類 Application 中配置
    這兩種方式是等價的,建議使用 yml 方式進配置。

配置服務的路由:配置文件方式
新建spring cloud項目,在項目中添加spring cloud gateway的依賴包

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Spring Cloud Gateway 是使用 netty+webflux 實現因此不需要再引入 web 模塊。
在.yml或.properties文件中添加如下配置:

server:
  port: 8081

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/a/**
        filters:
        - StripPrefix=1
      - id: host_route
        uri: http://www.ityouknow.com
        predicates:
        - Path=/springcloud
#        filters:
#        - StripPrefix=1

配置服務的路由:代碼方式
1、刪除配置文件中的路由配置
2、修改 Application.java, 添加自定義路由配置

@SpringBootApplication
public class CloudgatewayApplication {

    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p
                        .path("/a/**")
//                        .filters(f -> f.addRequestHeader("Hello", "World"))
                        .filters(f -> f.stripPrefix(1))
                        .uri("https://www.baidu.com"))
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(CloudgatewayApplication.class, args);
    }
}

當訪問地址 http://localhost:8081/a時會自動轉發到地址:https://www.baidu.com

路由規則


Spring Cloud Gateway 內置了很多 Predicates 工廠,這些 Predicates 工廠通過不同的 HTTP 請求參數來匹配,多個 Predicates 工廠可以組合使用。
Spring Cloud Gateway 的功能很強大,我們僅僅通過 Predicates 的設計就可以看出來,前面我們只是使用了 predicates 進行了簡單的條件匹配,其實 Spring Cloud Gataway 幫我們內置了很多 Predicates 功能。

Spring Cloud Gateway 是通過 Spring WebFlux 的 HandlerMapping 做為底層支持來匹配到轉發路由,Spring Cloud Gateway 內置了很多 Predicates 工廠,這些 Predicates 工廠通過不同的 HTTP 請求參數來匹配,多個 Predicates 工廠可以組合使用。

Predicate 介紹
Predicate 來源于 Java 8,是 Java 8 中引入的一個函數,Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將 Predicate 組合成其他復雜的邏輯(比如:與,或,非)??梢杂糜诮涌谡埱髤敌r灐⑴袛嘈吕蠑祿欠裼凶兓枰M行更新操作。如果對Predicate不了解的,可以先了解一下JAVA 8函數式編程。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性實現了各種路由匹配規則,有通過 Header、請求參數等不同的條件來進行作為條件匹配到對應的路由。具體可以查看可參考 官方文檔,網上有一張圖總結了 Spring Cloud 內置的幾種 Predicate 的實現。

image.png

說白了 Predicate 就是為了實現一組匹配規則,方便讓請求過來找到對應的 Route 進行處理。具體的配置可以參考官方文檔。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。