SpringCloud API网关

1. 概念

API网关,简称网关,本身是一个服务,通常作为后端服务的唯一入口,类似于整个微服务框架的门面,所有的外部客户端访问都需要经过它来进行调度和过滤:

在这里插入图片描述

它有以下核心功能:

  • 权限控制:作为微服务的入口,对用户进行权限校验,如果检验失败则进行拦截
  • 动态路由:一切请求先经过网关,但网关本身不处理业务,而是根据某种规则吧请求转发到某个微服务
  • 负载均衡:当路由的目标服务有多个时,还需要作负载均衡
  • 限流:请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大

常用的网关方式有很多,而在SpringCloud中我们使用的网关方案是 Spring Cloud Gateway

2. Spring Cloud Gateway

2.1 介绍

Spring Cloud Gateway 是Spring Cloud的一个全新的API网关项目,基于Spring + SpringBoot等技术,为微服务架构提供一种简单而有效的途径来转发请求

2.2 操作方式

它的操作方式如下:

  1. 创建网关项目,API网关本身也是一个服务

    在这里插入图片描述

  2. 引入网关依赖

    <!--⽹关-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <!--基于nacos实现服务发现依赖-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--负载均衡-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    
  3. 编写启动类

    @SpringBootApplication
    public class GateWayApplication {
        public static void main(String[] args) {
            SpringApplication.run(GateWayApplication.class, args);
        }
    }
    
  4. 创建配置文件,添加Gateway路由配置

    server:
      port: 10030
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            server-addr: 主机号:8848
            cluster-name: SH
            namespace: c567e423-b52b-4797-a33b-734ee78882f8
        gateway:
          routes:
            - id:
                product-service-route
              uri:
                lb://product-service # 目标服务地址,当predicates路由条件满足时转接到该地址
              predicates: # 路由条件
                - Path=/product/**
            - id:
                order-service-route
              uri:
                lb://order-service
              predicates:
                - Path=/order/**,/feign/**
    

    配置字段说明:

    • id:可自行定义,保持唯一即可
    • uri:目标服务地址,支持普通的URIlb://应用注册服务名称,lb表示负载均衡,使用lb://方式表示从注册中心获取服务地址
    • predicates:路由条件,将符合条件的请求都代理到uri参数指定的地址,如上述代码中服务请求路径为/product/**的请求都会被代理到lb://product-service 中

    配置完上述内容后,我们来进行测试,启动API网关服务,并通过网关服务10030端口访问product-service:127.0.0.1:10030/product/1001

    在这里插入图片描述

    可以看到,我们的请求符合路由条件Path=/product/**,所以网关服务将我们的请求代理到了127.0.0.1:9090/product/1001这个服务路径中了:

    在这里插入图片描述

    此时访问order-service服务也可成功:

    在这里插入图片描述

    :若显示请求时间超时可能与自己本身的服务器性能有关,我们这里开启了多个服务对此请求时比较吃服务器性能

3.Route Predicate Factories

3.1 介绍

Route Predicate Factories(路由断言工厂),在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制。比如上述代码中的 Path=/product/**,就是通过Path属性来匹配URL前缀是/product的请求。

Spring Cloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且

多个Predicate可以通过and逻辑进行组合

官网链接Route Predicate Factories :: Spring Cloud Gateway

常见的predicate如下:

名称说明示例
After只匹配指定日期之后的请求predicates: - After=2023-01-20T17:42:47.789- 07:00[America/Denver]
Before只匹配指定日期之前的请求predicates: - Before=2023-01-20T17:42:47.789- 07:00[America/Denver]
Between只匹配两个指定时间之间的请求,早的在前,晚的在后predicates: - Between=2017-01-20T17:42:47.789- 07:00[America/Denver], 2017-01- 21T17:42:47.789-07:00[America/Denver]
Method只匹配指定的请求方式predicates: - Method=GET,POST
Path只匹配指定规则的路径predicates: - Path=/red/{segment},/blue/{segment}
RemoteAddr请求者的IP必须为指定范围predicates: - RemoteAddr=192.168.1.1/24
Cookie请求中包含指定Cookie,且该Cookie的值符合指定的正则表达式predicates: - Cookie=chocolate, ch.p
Header请求中包含指定Header,且该Header的值符合指定的正则表达式predicates: - Header=X-Request-Id, \d+
Host请求必须是访问某个host(根据请求中的Host字段进行匹配)predicates: - Host=** .somehost.org, **.anotherhost.org

3.2 使用方式

Predicate的使用方式很简单,只需要在配置文件中添加规则即可,如下:

gateway:
  routes:
    - id:
        product-service-route
      uri:
        lb://product-service # 目标服务地址,当predicates路由条件满足时转接到该地址
      predicates: # 路由条件
        - Path=/product/**
        - After=2025-07-31T12:39:55.113010600+08:00[Asia/Shanghai] # 只接受指定时间之后的请求

此时再重启服务,重新访问127.0.0.1:10030/product/1001,可以查询不到该接口:

在这里插入图片描述

将条件注释掉或修改时间条件即可重新访问!

:这里使用到的时间是ZonedDateTime类型的格式,可以通过ZonedDateTime.now()获取:

import org.junit.Test;

import java.time.ZonedDateTime;

public class GateWayTest {

    @Test
    public void test1() {
        System.out.println(ZonedDateTime.now());
    }
}

在这里插入图片描述

以上便是对API网关的使用介绍了!!如果内容对大家有帮助的话请给这篇文章一个三连关注吧( •̀ ω •́ )( •̀ ω •́ )

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部