SpringCloud中Gateway的使用教程详解

 更新时间:2022年08月10日 11:54:19   作者:JAVA道人  
SpringCloud Gateway是Spring体系内的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。本文就来为大家详细讲讲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–与、or–或、negate–非。

Spring Cloud Gateway内置了许多Predict,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate包中,如果读者有兴趣可以阅读一下。现在列举各种Predicate如下图:

可以看到这有几种类型的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的使用教程详解的文章就介绍到这了,更多相关SpringCloud Gateway内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合EasyExcel 3.x的完整示例

    SpringBoot整合EasyExcel 3.x的完整示例

    EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的 Excel 处理工具,它能让你在不用考虑性能、内存的等因素的情况下,快速完成 Excel 的读、写等功能,这篇文章主要介绍了SpringBoot整合EasyExcel3.x的过程,需要的朋友可以参考下
    2023-07-07
  • SpringBoot整合Logback日志框架及高并发下的性能优化

    SpringBoot整合Logback日志框架及高并发下的性能优化

    在现代的Java应用开发中,日志记录是不可或缺的一部分,Spring Boot作为目前最流行的Java开发框架之一,默认集成了Logback作为日志框架,Logback是Log4j的继任者,具有更高的性能和更丰富的功能,本文将详细介绍如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • Java Socket一对多通信实现之并发处理方式

    Java Socket一对多通信实现之并发处理方式

    这篇文章主要介绍了Java Socket一对多通信实现之并发处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java基于AES对称加密算法实现的加密与解密功能示例

    java基于AES对称加密算法实现的加密与解密功能示例

    这篇文章主要介绍了java基于AES对称加密算法实现的加密与解密功能,结合完整实例形式分析了AES对称加密算法的定义与使用技巧,需要的朋友可以参考下
    2017-01-01
  • Netty分布式pipeline管道创建方法跟踪解析

    Netty分布式pipeline管道创建方法跟踪解析

    这篇文章主要为大家介绍了Netty分布式pipeline管道创建方法跟踪解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Spring常用一些工具类实例汇总

    Spring常用一些工具类实例汇总

    这篇文章主要介绍了Spring常用一些工具类实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 利用Redis实现延时处理的方法实例

    利用Redis实现延时处理的方法实例

    这篇文章主要给大家介绍了关于利用Redis实现延时处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • java实现 二叉搜索树功能

    java实现 二叉搜索树功能

    这篇文章主要介绍了java实现 二叉搜索树功能,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • java HashMap的keyset实例

    java HashMap的keyset实例

    简单地说,在keyset方法返回的set上做修改会改变原来hashmap,这也许不是你想要的,于是形成一个隐藏的bug
    2013-04-04
  • IDEA中JDK是1.8但Java版本只有21和17的解决办法

    IDEA中JDK是1.8但Java版本只有21和17的解决办法

    JDK 1.8(Java Development Kit 1.8)是Java平台的一个版本,它包含了用于开发和运行Java应用程序的工具和库,下面这篇文章主要给大家介绍了关于IDEA中JDK是1.8但Java版本只有21和17的解决办法,需要的朋友可以参考下
    2024-01-01

最新评论