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

溫馨提示×

溫馨提示×

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

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

SpringCloud中Gateway如何使用

發布時間:2022-08-10 14:23:35 來源:億速云 閱讀:133 作者:iii 欄目:開發技術

本篇內容介紹了“SpringCloud中Gateway如何使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.基礎教程

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    <dependencies>
        <!--gateway不是通過servlet啟動的,不需要spring-boot-starter-web-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
   
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

application.yml

server:
  port: 8081

springboot啟動類

@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p -> p
                        .path("/**")
                        .filters(f -> f.addRequestParameter("aa","bb"))
                        .uri("http://localhost:18080"))

                .build();
    }
}

以上代碼,是做了個路由:如果url的path符合正則“/**”則給請求添加一個aa=bb的參數然后轉發到http://localhost:18080,。

如果訪問http://localhost:8081/get,則最終會請求http://localhost:18080/get?aa=bb

我們再添加一個route。

@SpringBootApplication
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
    @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(p ->p
                        .method("POST")
                        .uri("http://localhost:18081")
                )
                .route(p -> p
                        .path("/**")
                        .filters(f -> f.addRequestParameter("aa","bb"))
                        .uri("http://localhost:18080"))

                .build();
    }
}

以上代碼添加了一個如果是POST訪問,則轉發到http://localhost:18081。

那么如果我們使用POST的http://localhost:8081/aaa,則會轉發到http://localhost:18081/aaa.

值得注意的是,如果這兩個route換下位置,path=/** 的route放在method=post的上面,則會產生另外的情況,就是會轉發到18080上去,因為POST的http://localhost:8081/aaa也會匹配上/** .這些route是有先后順序的。

可以看出route有一個重要的概念,就是條件predicate,命中了什么條件就會被轉發到哪里。

Predicate來自于java8的接口。Predicate 接受一個輸入參數,返回一個布爾值結果。該接口包含多種默認方法來將Predicate組合成其他復雜的邏輯(比如:與,或,非)。可以用于接口請求參數校驗、判斷新老數據是否有變化需要進行更新操作。add&ndash;與、or&ndash;或、negate&ndash;非。

Spring Cloud Gateway內置了許多Predict,這些Predict的源碼在org.springframework.cloud.gateway.handler.predicate包中,如果讀者有興趣可以閱讀一下。現在列舉各種Predicate如下圖:

SpringCloud中Gateway如何使用

可以看到這有幾種類型的Predict,而我們剛剛使用的就是METHOD和Path這兩種,當然你可以選擇其他的。

2.將配置放在配置文件里

總是寫些Bean實際上還是不爽,不如我們放在配置文件里面。放配置文件里面可以減少代碼量,最重要的是,如果配合springcloudconfig,可以做到在線更新,這就很爽了。

我們將上面的那個bean注釋掉,然后把上面的寫到配置文件里。

server:
  port: 8081
spring:
  cloud:
    gateway:
      routes:
      - id: my_method_route
        uri: http://localhost:18081
        predicates:
        - Method=POST
      - id: my_path_route
        uri: http://localhost:18080
        predicates:
        - Path=/**

注意一些關鍵的地方,要約定大于配置比如:Method=POST Path=/**

3.放在springcloud里面

目前我們都是一個單機springboot,跟springcloud沒有關系。我們嘗試將這段配置放在nacos的config里面。

nacos新建gateway-test.yaml,類型yaml,內容如下:

spring:
  cloud:
    gateway:
      routes:
      - id: my_path_route
        uri: http://localhost:18080
        predicates:
        - Path=/**
      - id: my_method_route
        uri: http://localhost:18081
        predicates:
        - Method=POST

java項目的pom修改下,添加了nacos的服務發現和配置文件。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    <dependencies>
        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        
        <!--springboot2.4版本之后需要添加下面依賴才能加載bootstrap.yml-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>



        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- SpringCloud Alibaba 微服務 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

添加bootstrap.yml,添加了nacos的一些配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

修改application.yml

server:
  port: 8081
spring:
  profiles:
    active: test

此時

{{spring.application.name}}-{{spring.profiles.active}}.{{spring.cloud.nacos.config.file-extension}}

正好等于我們剛才在nacos上建的gateway-test.yaml

最后是java啟動執行,發現gateway就從nacos拉取配置文件生效了。

4.使用服務名而不是IP

我們的uri轉發的都是具體的ip地址,那么真正在微服務的時候,肯定轉發的是服務名而不是ip地址。

修改gateway-test.yaml里面的uri,boot-cloud和boot-cloud1是我們創建的另兩個服務。

spring:
  cloud:
    gateway:
      routes:
      - id: my_path_route
        uri: lb://boot-cloud
        predicates:
        - Path=/**
      - id: my_method_route
        uri: lb://boot-cloud1
        predicates:
        - Method=POST

lb是對服務進行負載均衡的意思,需要添加依賴

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

啟動后,就可以對服務進行轉發了。

“SpringCloud中Gateway如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

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

AI

呼伦贝尔市| 卫辉市| 广州市| 墨竹工卡县| 甘洛县| 汽车| 论坛| 二连浩特市| 慈溪市| 丹阳市| 长沙县| 孝感市| 浑源县| 仪陇县| 兴国县| 唐海县| 怀化市| 兴业县| 五大连池市| 辽阳市| 清流县| 东乡族自治县| 宁河县| 台山市| 汽车| 崇明县| 黑山县| 金堂县| 班玛县| 新郑市| 岗巴县| 乌兰县| 库车县| 长葛市| 招远市| 济南市| 商城县| 龙里县| 梁平县| 怀远县| 大化|