溫馨提示×

溫馨提示×

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

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

SpringCloud中Gateway如何使用

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

本篇內(nèi)容介紹了“SpringCloud中Gateway如何使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.基礎(chǔ)教程

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    <dependencies>
        <!--gateway不是通過servlet啟動(dòng)的,不需要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啟動(dòng)類

@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();
    }
}

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

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

我們再添加一個(gè)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();
    }
}

以上代碼添加了一個(gè)如果是POST訪問,則轉(zhuǎn)發(fā)到http://localhost:18081。

那么如果我們使用POST的http://localhost:8081/aaa,則會(huì)轉(zhuǎn)發(fā)到http://localhost:18081/aaa.

值得注意的是,如果這兩個(gè)route換下位置,path=/** 的route放在method=post的上面,則會(huì)產(chǎn)生另外的情況,就是會(huì)轉(zhuǎn)發(fā)到18080上去,因?yàn)镻OST的http://localhost:8081/aaa也會(huì)匹配上/** .這些route是有先后順序的。

可以看出route有一個(gè)重要的概念,就是條件predicate,命中了什么條件就會(huì)被轉(zhuǎn)發(fā)到哪里。

Predicate來自于java8的接口。Predicate 接受一個(gè)輸入?yún)?shù),返回一個(gè)布爾值結(jié)果。該接口包含多種默認(rèn)方法來將Predicate組合成其他復(fù)雜的邏輯(比如:與,或,非)??梢杂糜诮涌谡埱髤?shù)校驗(yàn)、判斷新老數(shù)據(jù)是否有變化需要進(jìn)行更新操作。add&ndash;與、or&ndash;或、negate&ndash;非。

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

SpringCloud中Gateway如何使用

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

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

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

我們將上面的那個(gè)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=/**

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

3.放在springcloud里面

目前我們都是一個(gè)單機(jī)springboot,跟springcloud沒有關(guān)系。我們嘗試將這段配置放在nacos的config里面。

nacos新建gateway-test.yaml,類型yaml,內(nèi)容如下:

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項(xiàng)目的pom修改下,添加了nacos的服務(wù)發(fā)現(xiàn)和配置文件。

<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 微服務(wù) -->
            <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

此時(shí)

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

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

最后是java啟動(dòng)執(zhí)行,發(fā)現(xiàn)gateway就從nacos拉取配置文件生效了。

4.使用服務(wù)名而不是IP

我們的uri轉(zhuǎn)發(fā)的都是具體的ip地址,那么真正在微服務(wù)的時(shí)候,肯定轉(zhuǎn)發(fā)的是服務(wù)名而不是ip地址。

修改gateway-test.yaml里面的uri,boot-cloud和boot-cloud1是我們創(chuàng)建的另兩個(gè)服務(wù)。

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是對服務(wù)進(jìn)行負(fù)載均衡的意思,需要添加依賴

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

啟動(dòng)后,就可以對服務(wù)進(jìn)行轉(zhuǎn)發(fā)了。

“SpringCloud中Gateway如何使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI