微服務網關

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

在前面簡單的了解了一下註冊中心Nacos的使用(//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服務,然後請求網關即可轉發到對應的微服務上了。

代碼完整地址:

//github.com/mrxiaobai-wen/springcloud_study

Tags: