微服務閘道器

小白先生哦 發表於 2021-01-26

我的微服務學習筆記系列目錄https://www.cnblogs.com/mrxiaobai-wen/p/14278656.html

在前面簡單的瞭解了一下注冊中心Nacos的使用(https://www.cnblogs.com/mrxiaobai-wen/p/14304495.html),然後這兩天上手了一下Spring Cloud Gateway,在這裡做一個總結。


微服務閘道器簡介

  • 什麼是閘道器:顧名思義,它就是一個關口,所有想要進入到我們系統的請求都首先要經過這個關口才行。

  • 為什麼需要閘道器:比如我在前面上手Nacos的時候,建立了兩個服務,分別是nacos-server-spring-cloud和nacos-consumer-spring-cloud,兩個不同的服務,不同的埠,不同的地址。那麼我在訪問這兩個服務的時候要分別記錄兩個地址訪問兩個不同的服務。但是這個系統是有機聯絡的,它們一起組成了一套系統。那麼有沒有什麼方式可以讓我只請求一個地方就能獲取到我所需要的所有內容呢?那麼這裡就可以使用上閘道器。

    我們所有的請求都請求到閘道器上,至於轉到哪一類服務上,轉到哪一類服務的哪個例項上,完全由閘道器自己去判斷。

    如下圖,使用者請求某個服務,微服務系統內部服務之間相互依賴:

    graph LR 使用者1[使用者1] --> 閘道器[閘道器] 使用者2[使用者2] --> 閘道器[閘道器] 閘道器[閘道器] --> 服務一[服務一] 閘道器[閘道器] --> 服務二[服務二] 閘道器[閘道器] --> 服務三[服務三] 服務一[服務一] --> 服務二[服務二] 服務三[服務三] --> 服務二[服務二]

    這樣,我們就能夠遮蔽微服務內部的結構,對外提供一個統一的入口,而外部也不用關注微服務系統內部的結構。

  • 閘道器能做什麼:

    • 負載均衡
    • 限流降級
    • 授權認證
    • 日誌記錄

    列出的是幾個常見的使用場景。

  • 常見微服務閘道器:


Spring Cloud Gateway介紹

Spring Cloud Gateway官方文件

Spring Cloud的一個子專案,其設計如圖:

微服務閘道器

它有三個元件:

  • 路由(Route):一組斷言與一組過濾器的集合,是閘道器的基本元件。

  • 斷言(Predicate):是否匹配路由的判斷條件。

  • 過濾器(Filter):對請求的處理邏輯,比如校驗、鑑權、日誌記錄等等。

整體邏輯就是:請求進入到閘道器後,首先根據路由配置中的斷言匹配handler,然後執行filter鏈。


Spring Cloud Gateway使用

  • 首先引入必要依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
    

    根據我們下面的配置檔案,我們使用到了註冊中心,所以在這裡還要引入nacos的依賴。

  • 建立配置檔案application.yml

    spring:
      application:
        name: spring-cloud-geteway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
              lower-case-service-id: true
          routes:
            - id: nacos-server-spring-cloud
              uri: lb://nacos-server-spring-cloud
              predicates:
                - Path=/nacos-server-spring-cloud/**
              filters:
                - StripPrefix= 1
            - id: nacos-consumer-spring-cloud
              uri: lb://nacos-consumer-spring-cloud
              predicates:
                - Path=/nacos-consumer-spring-cloud/**
              filters:
                - StripPrefix= 1
    

    註冊中心配置bootstrap.yml

    spring:
      application:
        name: spring-cloud-geteway
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
          config:
            server-addr: 127.0.0.1:8848
            file-extension: yaml #指定yaml格式的配置
            encode: UTF-8
    

    其中routes就是配置路由列表,這裡使用了之前用到的nacos-server-spring-cloud和nacos-consumer-spring-cloud兩個服務。

    predicates:
    	- Path=/nacos-server-spring-cloud/**
    

    則是標識匹配以nacos-server-spring-cloud開頭的請求。

    在filters中只用到了一個

    - StripPrefix= 1
    

    表示閘道器將請求轉發到下游服務之前從請求中剝離的路徑個數,這裡配置了1,那麼表示會將前面的nacos-server-spring-cloud路徑去掉,然後再按照相應的地址進行轉發。

  • 配置主類

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

上面的準備工作做完後,啟動閘道器、server、consumer、nacos服務,然後請求閘道器即可轉發到對應的微服務上了。

程式碼完整地址:

https://github.com/mrxiaobai-wen/springcloud_study