SpringCloud基本使用——Gateway

130 阅读3分钟

如何使用gateway进行api网关配置

前置条件

依赖

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意: 这里不需要引入spring-boot-starter-web依赖因为gateway使用了 webflux而不是springmvc

开启注解

@SpringBootApplication
// 开启nacos服务发现
@EnableDiscoveryClient
public class CloudGateWayMain {
    public static void main(String[] args) {
        SpringApplication.run(CloudGateWayMain.class, args);
    }
}

实践

配置yml文件

因为我这里使用了配置中心,所以要先配置boostrap.yml文件。这里我们先不讲配置中心,只关注于配置。

spring:
  cloud:
  // 配置gateway
    gateway:
      discovery:
        locator:
          enabled: true
        // [0]  
      routes:
        // [1]
        - id: after_route
        // [2]
          uri: lb://cloud-consumer-feign
         // [3]
          predicates:          
            - Path=/api/**
            - After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai]
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: cloud-gateway
management:
  endpoints:
    web:
      exposure:
        include: refresh
server:
  port: 2001

解释

  • [0]routes: 标识路由配置开始

  • [1] -id: "-"符号是yml里面数组的标识方法,标识这里可以配置多项路由。id为自定义的名字,因为我这里使用了after route所以定义为after router

  • [2] uri: 以lb://cloud-consumer-feign 为例,lb标识开启负载均衡,实际上还能使用httphttpscloud-consumer-feign为其他服务的服务名。

  • [3] predicates: 翻译过来是谓词逻辑来自java中,通俗点讲就是在这里配置路由规则。

    • path: 匹配请求路径
    • After: 当前请求在指定时间之后才匹配。After=2021-07-13T14:11:00.123+08:00[Asia/Shanghai] 以此为例,表示只有只有在2021-07-13 14:11:00之后才能访问上面path匹配的url。

tips:这里只介绍了after,path 路由谓词。实际上有很多种路由谓词并且支持自定义路由谓词。简单列出一下几项:

谓词逻辑作用
After route predicate当前请求在指定时间**之后**才匹配
Before route predicate当前请求在指定时间**之前**才匹配
Between route predicate当前请求在指定时间**之间**才匹配
Header route predicate当前请求中的header值匹配配置的header参数值时生效
Method Route Predicate只有指定方式(put,post,get....)才能访问
Path Route Predicate匹配请求路径
Query route predicate匹配请求参数
RemoteAddr route predicate匹配请求的ip地址,支持ipv4和ipv6
Weight route predicate根据权重来分发请求,权重是根据group来计算的

路由的接口

@GetMapping("/api/testAfterRoute")
public String testGateWayAfterRoute() {
    return "testAfterRoute time:" + LocalDateTime.now() + " port:" + port;
}

效果

image-20220825174825236

改变时间尝试路由

After=2021-07-16T14:11:00.123+08:00[Asia/Shanghai]

结果

image-20220825174844448

总结

  • 在gateway种我们通过简单的配置即可达到api网关的目的。
  • 利用官方自带的谓词逻辑,我们可以实现限时开放接口,负载均衡,身份验证等等。
  • 通过自定义谓词逻辑,可以高度定制api网关逻辑
  • 配和nacos的配置中心可以实现动态更改路由谓词规则,不用重启服务即可生效新的路由谓词规则。
  • 低代码,yaml文件配置可满足大部分需求

引用

Spring Cloud Gateway

Spring Cloud Gateway Route Predicate Factory 的使用