首頁 > 軟體

SpringCloud超詳細講解微服務閘道器Gateway

2022-07-16 18:01:40

前言

上一篇:微服務閘道器Zuul

上文中,我們介紹了微服務閘道器Zuul,Zuul 是 Netflix 公司開源的產品,被稱為第一代閘道器,也是 Spring Cloud 前幾個版本預設使用的一款提供動態路由微服務閘道器元件,但是隨著 Netflix 公司一系列的停更事件,在最新的 Spring Cloud Greenwich 版本中已經不建議採用 Zuul 技術,官方建議使用 Spring Cloud Gateway 作為預設的閘道器技術。 Spring Cloud Gateway作為第二代閘道器技術,比Zull更強,官方會一直維護更新下去。

所以本文需要再介紹一下Gateway。

微服務閘道器GateWay介紹

Spring Cloud Gateway 是 Spring 體系內的一個全新專案,該專案是基於 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。

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

GateWay特性介紹

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

Gateway 中的相關術語

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

Gateway實戰

上文中,我們啟動了註冊中心registry,dms服務,和app服務,以及zuul服務,本文我們將建立gateway服務以替換zuul:

1、建立專案gateway

建立子模組gateway ,pom.xml引入eureka-client 和gateway 的依賴

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

2、建立啟動類

@EnableEurekaClient
@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class, args);
    }
}

啟動類上增加@EnableEurekaClient以及@SpringBootApplication註解。

3、新增組態檔

新增組態檔application.yml

server:
  port: 8004
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: eureka-client-app-1
          uri: lb://app
          predicates:
            - Path=/**
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/

spring.cloud.gateway.routes路由引數設定說明:

  • id:我們自定義的路由 ID。
  • uri:需要轉發的目標服務地址。
  • predicates:路由條件。
  • filters:過濾規則,本範例暫時沒用。

4、程式設計方式實現路由

上面路由規則我們也可以使用程式設計方式來實現,在啟動類中增加如下程式碼,是等效的:

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("eureka-client-app-1",r -> r.path("/**")
               .uri("lb://app"))
                .build();
        return routes.build();
    }
}

5、啟動驗證

存取Gateway服務的地址:http://localhost:8004/app/index,效果如下:

總結

本文介紹瞭如何使用 Spring Cloud Gateway。Gateway 的特性以及兩種實現方式:一種是通過組態檔的方式來實現,一種是通過編碼的方式來實現,推薦使用組態檔的方式來使用,便於後期修改維護。

到此這篇關於SpringCloud超詳細講解微服務閘道器Gateway的文章就介紹到這了,更多相關SpringCloud Gateway內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com