中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud 中怎么使用Gateway配置路由動態

發布時間:2021-06-18 15:37:59 來源:億速云 閱讀:681 作者:Leah 欄目:大數據

Spring Cloud 中怎么使用Gateway配置路由動態,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

8. 根據配置文檔配置路由

Spring Cloud Gateway的配置由一系列的“ RouteDefinitionLocator”接口實現類控制,此接口如下所示:

public interface RouteDefinitionLocator {
	Flux<RouteDefinition> getRouteDefinitions();
}

默認情況下,通過Spring Boot的@ConfigurationProperties機制,Spring Cloud Gateway 使用PropertiesRouteDefinitionLocator從配置文件中加載路由的配置信息。之前的路由配置中,使用了一種快捷的配置方式,也可以指定具體的參數名,如下面的兩種配置方式效果是完全一樣的:

spring:
  cloud:
    gateway:
      routes:
      - id: setstatus_route
        uri: http://example.org
        filters:
        - name: SetStatus
          args:
            status: 401
      - id: setstatusshortcut_route
        uri: http://example.org
        filters:
        - SetStatus=401

在一些網關的應用場景中,使用屬性配置的方式就可以了,但是在一些生產環境中,有一些路由配置信息可能是來自別的地方,比如數據庫。在將來的Spring Cloud Gateway版本中,也會添加一些基于數據庫的RouteDefinitionLocator實現類,比如Redis,MongoDB

8.1 Fluent Java Routes API (使用Java 路由API 代碼添加路由配置)

在RouteLocatorBuilder中定義的一些 Fluent API,使用它可以在Java代碼中配置相關的路由信息,如下面代碼所示:

// static imports from GatewayFilters and RoutePredicates
@Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder, AddRequestHeaderGatewayFilterFactory throttle) {
        NameValueConfig requestHeader = new NameValueConfig();
        requestHeader.setName("routes-a");
        requestHeader.setValue("yes");
        return builder.routes()
                .route(r -> r.host("localhost:8080").and().path("/routes-api/a/**")
                    .filters(f ->{
                            f.addResponseHeader("X-TestHeader", "foobar");
                            return f.redirect(HttpStatus.MOVED_PERMANENTLY.value(), "http://www.xinyues.com");
                            })
                    .uri("http://localhost:8080").id("custom-1")
                )
                .route(r -> r.path("/routes-api/b/**")
                    .filters(f ->
                            f.addResponseHeader("X-AnotherHeader", "baz"))
                    .uri("http://localhost:8080").id("custom-2")
                )
                .route(r -> r.order(0)
                    .host("localhost:8080").and().path("/routes-api/c/**")
                    .filters(f -> f.filter(throttle.apply(requestHeader)))
                    .uri("http://localhost:8080").id("custom-3")
                )
                .build();
    }

這段代碼是我自己參考原文檔實現的,原文檔上面那個ThrottleGatewayFilterFactory找不到。這里我添加了自定義 的routes Id,可以從源碼中查看:https://gitee.com/wgslucky/SpringCloud,啟動源碼項目,在瀏覽器中輸入:http://localhost:8080/actuator/gateway/routes,可以看到網關加載的所有的路由信息,可以看到代碼中路由id為custom-x的路由信息,說明在Java添加的路由配置與在配置文件中添加的路由配置都被加載到了。如果瀏覽器安裝了Json插件更直觀一些。這是一個路由的配置Json數組。根據上面代碼中的路由配置,在瀏覽器中輸入:http://localhost:8080/routes-api/a/test,可以看到成功跳轉到了目標網站,說明路由配置成功了。 這種形式也可以添加一些自定義的Predicate判斷,在RouteDefinitionLocator中定義的Predicates可以使用邏輯and。使用Fluent Java Api,可以使用and(),or()和negate()操作Predicate類。例如上面代碼中的第一個路由就使用and()添加了兩個Predicate。

8.2 DiscoveryClient Route Definition Locator 使用服務發現客戶端定義路由信息

Spring Cloud Gateway可以使用服務發現客戶端接口DiscoveryClient,從服務注意中心獲取服務注冊信息,然后配置相應的路由。注意,需要在配置中添加如下配置開啟這個功能:

spring.cloud.gateway.discovery.locator.enabled=true

然后確保已引入DiscoveryClient的實現類的服務發現客戶端依賴,比如Eureka,Consul或Zookeeper。

8.2.1 Configuring Predicates and Filters For DiscoveryClient Routes 為路由信息配置斷言和過濾器

默認情況下,通過服務發現客戶端DiscoveryClient自動配置的路由信息中,只包括一個默認的Predicate和Filter。默認的Predicate是一個Path Predicate,模式是 /serviceId/**,serviceId就是從服務發現客戶端中獲取的服務ID。默認的Filter是一個重寫路徑過濾器,它的正則表達式為:/serviceId/(?<remaining>.*),它的作用是將請求路徑中的serviceId去掉,變為/(?<remaining>.*),如果想要添加自定義的Predicate和Filters,可以這樣配置:spring.cloud.gateway.discovery.locator.predicates[x]spring.cloud.gateway.discovery.locator.filters[y],當使用這種配置方式時,不會再保留原來默認的Predicate和Filter了,如果你還需要原來的配置,需要手動添加到配置中,如下面所示: application.properties

spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: Hystrix
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"

application.yml

spring: 
  cloud: 
    gateway: 
      discovery:
        locator:
          enabled: true
          predicates:
          - name: Path
            args:
              pattern: "'/'+serviceId+'/test'"
          filters: 
          - name: RedirectTo
            args:
              status: 301
              url: "'http://www.xinyues.com'"

需要注意的是,在這些配置中,所有的配置的值都是會被Spel解析的,所以如果是字符串的話,需要使用引號。比如,application.yml中,如果配置成這樣:url: http://www.xinyues.com會報錯的,詳細見:https://www.cnblogs.com/wgslucky/p/11743740.html

application.yml 這種配置是保留原來的默認的Predicate和Filter

spring: 
  cloud: 
    gateway: 
      discovery:
        locator:
          enabled: true
          predicates:
          - name: Path
            args:
              pattern: "'/'+serviceId+'/**'"
          filters: 
          - name: AddRequestHeader
            args: 
             name: "'foo'"
             value: "'bar'"
          - name: RewritePath
            args:
              regexp: "'/' + serviceId + '/(?<remaining>.*)'"
              replacement: "'/${remaining}'"

可以看到所有的字符串必須在引號的單引號內。

Spring Cloud 中怎么使用Gateway配置路由動態

手機支架懶人支架桌面ipad平板電腦創意便攜式支架多功能直播抖音拍照落地床頭直播車載折疊支撐架

8.2.2 源碼實現

到這里下載源碼:https://gitee.com/wgslucky/SpringCloud

  1. 修改application.yml,激活discoveryclient配置文件

spring:
  profiles:
    active:
    - discoveryclient
  1. 啟動spring-cloud-gateway項目

  2. 啟動spring-cloud-app-a項目

然后瀏覽器中輸入:http://localhost:8080/actuator/gateway/routes,可以看到已添加成功定義好到spring-cloud-app-a服務的路由信息了,如下所示: Spring Cloud 中怎么使用Gateway配置路由動態 可以看到里面有一個默認的filter和predicate。而且可以看出,在配置文件中配置的路由信息,java代碼中添加的路由配置信息,都加載到網關中,說明這三種配置路由信息的方式是可以一起使用的。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平阳县| 通江县| 中江县| 长寿区| 松滋市| 哈尔滨市| 隆德县| 皋兰县| 崇州市| 南宫市| 丹巴县| 阿拉善左旗| 临武县| 固原市| 方正县| 长兴县| 罗山县| 洪雅县| 黑水县| 昭通市| 兴义市| 茶陵县| 中牟县| 绥棱县| 珲春市| 阿巴嘎旗| 内丘县| 永济市| 平罗县| 绵竹市| 临泉县| 沽源县| 康马县| 温州市| 越西县| 九江市| 阜平县| 惠来县| 黔西| 建阳市| 嘉禾县|