Spring cloud gateway实现Api网关(nacos+gateway)

1. 核心概念

在这里插入图片描述

1.1 导入依赖

<!--spring cloud gateway网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

1.2 在bootstrap.yml中配置路由规则

1.2.1 Path 配置请求路径路由
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            - Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后

http://localhost/goods/test

1.2.2 Query 请求中是否包含请求参数
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            #- Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            - Query=token, abc.            # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求

http://localhost/goods/test?token=123

abc. 其中"." 代表任意字符

http://localhost/goods/test?token=abc1

1.2.3 Method 根据请求方式匹配
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            #- Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            #- Query=token, abc.            # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求
            - Method=GET                    # 匹配任意  GET 请求
1.2.4 datatime 通过时间匹配,路由
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            #- Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            #- Query=token, abc.            # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求
            #- Method=POST                    # 匹配任意  POST 请求
            - After=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配 2021-4-25 10:00:00之后
            #- Before=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配这个时间之前 
            #- Between=2021-04-25T10:00:00+08:00[Asia/Shanghai],2021-04-25T12:00:00+08:00[Asia/Shanghai] # 匹配两个时间之间
1.2.5 RemoteAddr 通过远程地址进行匹配,路由

http://192.168.100.233:7000/goods/test

server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            #- Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            #- Query=token, abc.            # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求
            #- Method=POST                    # 匹配任意  POST 请求
            #- After=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配 2021-4-25 10:00:00之后
            #- Before=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配这个时间之前
            #- Between=2021-04-25T10:00:00+08:00[Asia/Shanghai],2021-04-25T12:00:00+08:00[Asia/Shanghai] # 匹配两个时间之间
          	- RemoteAddr=192.168.100.233/24 # 匹配远程地址是RemoteAddr的请求,24 表示子网掩码
1.2.5 Header 通过请求头匹配,路由
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: http://localhost:9101/     # 目标URI,路由到微服务的地址
          predicates:                     # 断言(判断条件)
            #- Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            #- Query=token, abc.            # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求
            #- Method=POST                    # 匹配任意  POST 请求
            #- After=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配 2021-4-25 10:00:00之后
            #- Before=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配这个时间之前
            #- Between=2021-04-25T10:00:00+08:00[Asia/Shanghai],2021-04-25T12:00:00+08:00[Asia/Shanghai] # 匹配两个时间之间
            #- RemoteAddr=192.168.100.233/24 # 匹配远程地址是RemoteAddr的请求,24 表示子网掩码
            - Header=token, \d+ # 请求头携带token \d+ 值得正则表达式

2 动态路由(服务发现得路由规则)

动态路由 就是将gateway 注册到,服务注册中心,这里我使用的是nacos 服务注册中心

2.1 动态获取URI

2.1.1 导入nacos的依赖

<!--nacos配置中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos服务注册客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2.1.2 bootstrap.yml

server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      # 路由规则
      routes:
        - id: shop-goods                  # 路由 ID,唯一
          uri: lb://shop-goods            # 根据服务名称从注册中心获取服务请求地址
          predicates:                     # 断言(判断条件)
            - Path=/goods/**              # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token                 # 匹配请求参数中包含 token 的请求
            #- Query=token, abc.           # 匹配请求参数中包含 token ,并且参数的值 满足正则表达式 abc. 的请求
            #- Method=POST                 # 匹配任意  POST 请求
            #- After=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配 2021-4-25 10:00:00之后
            #- Before=2021-04-25T10:00:00+08:00[Asia/Shanghai] # 匹配这个时间之前
            #- Between=2021-04-25T10:00:00+08:00[Asia/Shanghai],2021-04-25T12:00:00+08:00[Asia/Shanghai] # 匹配两个时间之间
            #- RemoteAddr=192.168.100.233/24 # 匹配远程地址是RemoteAddr的请求,24 表示子网掩码
            #- Header=token, \d+ # 请求头携带token \d+ 值得正则表达式
    nacos:
      # 注册中心配置
      discovery:
        server-addr: localhost:8848 # nacos 注册中心地址
        namespace: 0e883794-4414-4d41-a177-6d335d304e42 # 开发环境  指定 具体的命名空间id
        #group: DEFAULT_GROUP # 分组 默认分组可以省略
      # 配置中心配置
      config:
        #enabled: false #关闭配置
        server-addr: localhost:8848 # Nacos 配置中心地址
        namespace: 0e883794-4414-4d41-a177-6d335d304e42 # 开发环境  指定 具体的命名空间id
        group: TEST_GROUP # 分组
        name: test-config-dev #dataid 内容

2.2 服务名称转发(简化配置文件)

2.2.1 bootstrap.yml (nacos+gateway)(最终版)
server:
  port: 7000
spring:
  application:
    name: gateway-server # 应用名称
  cloud:
    gateway:
      discovery:
        locator:
          # 是否与服务发现组件进行结合,通过  serviceId 转发到具体的微服务
          enabled: true                       #是否开启基于服务发现得路由规则
          lower-case-service-id: true         # 是否将服务名称转小写
    nacos:
      # 注册中心配置
      discovery:
        server-addr: localhost:8848 # nacos 注册中心地址
        namespace: 0e883794-4414-4d41-a177-6d335d304e42 # 开发环境  指定 具体的命名空间id
        #group: DEFAULT_GROUP # 分组 默认分组可以省略
      # 配置中心配置
      config:
        #enabled: false #关闭配置
        server-addr: localhost:8848 # Nacos 配置中心地址
        namespace: 0e883794-4414-4d41-a177-6d335d304e42 # 开发环境  指定 具体的命名空间id
        group: TEST_GROUP # 分组
        name: test-config-dev #dataid 内容


版权声明:本文为qq_39576977原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。