网关详解+配置

Spring Gateway是Spring自己编写的,也是SpringCloud的组件

SpringGateway官网:

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

网关演示:

StringGateway网关是一个依赖,不是一个软件

使用时需要创建一个SpringBoot项目

使用时也需注册到Nacos注册中心中,网关项目也是微服务的一个组成部分

需添加以下配置:


    
    
        org.springframework.cloud
        spring-cloud-starter-gateway
    
    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-discovery
    
    
    
        org.springframework.cloud
        spring-cloud-starter-loadbalancer
    

yml文件配置需添加:

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        # 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
        server-addr: localhost:8848
    gateway:
      # route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
      routes:
        # List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
          # id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
        - id: gateway-beijing
          # uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
          # lb就是LoadBalance的缩写,表示支付负载均衡调用
          uri: lb://beijing
          # predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
          predicates:
            # predicates也是一个List,赋值要以"-"开头
            # 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
            # ↓ P要大写!!!!!!    **是通配任何路径
            - Path=/bj/**

 网关多路由配置

gateway:
  # route是路由的意思,下面的内容就是配置路由,因为一个网关项目可能配置很多路由,所以设计为了一个List集合
  routes:
    - id: gateway-shanghai
      uri: lb://shanghai
      predicates:
        - Path=/sh/**
    # List类型赋值时,每个元素都要以"-"开头,在一个"-"之后的所有内容,是同一个元素的属性值
      # id表示当前路由的唯一标识名称,和其他名称的配置没有关联,唯一的要求就是不能和路由名称重复
    - id: gateway-beijing
      # uri属性配置路由目标服务器,beijing指注册到nacos名称为beijing的项目
      # lb就是LoadBalance的缩写,表示支付负载均衡调用
      uri: lb://beijing
      # predicate是断言的意思,断言就是满足某些条件时执行某些操作的设置
      predicates:
        # predicates也是一个List,赋值要以"-"开头
        # 断言配置的含义是如果访问网关项目的请求路径以/bj/开头,就路由到上面配置的beijing服务器
        # ↓ P要大写!!!!!!    **是通配任何路径
        - Path=/bj/**

动态路由 

网关项目的配置会随着微服务模块增多而变得复杂,后期维护的工作量也会增大

我们希望gateway能自动理由到每个模块的路由

这样不管当前项目有多少个路由目标,都不需要再去维护yml文件了

需要在配置文件添加Gateway的动态路由功能:

server:
  port: 9000
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        # 网关也是微服务项目的一个模块,需要注册到Nacos才能生效
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 开启动态路由的配置
          # 默认的路由规则:在网关端口号后,先编写要路由到的目标服务器注册到Nacos的名称
          #                           然后再写这个模块具体访问的路径
          # 例如 localhost:9001/bj/show  -> localhost:9000/beijing/bj/show
          enabled: true

 配置中使用了内置断言:

内置断言:

断言的意思就是判断某个条件是否满足,

上面配置中使用了Path断言,判断请求的路径是不是满足条件

如果路径满足这个条件,就路由到指定的服务器,

Path断言只是断言中的一种,下面列举其他的断言:

  • after
  • before
  • between
  • cookie
  • header
  • host
  • method
  • path
  • query
  • remoteaddr

时间相关:

after,before,between

判断当前时间在指定时间之前,之后或中间的操作

条件满足则可以执行路由操作,反之拒绝访问

表示时间的格式较特殊可以用下面代码获得时间:

ZonedDateTime.now()

 例:在yml配置中添加新的断言配置:

使用After设置在指定时间之后才能访问,否则会报404错误拒绝访问

routes:
  - id: gateway-shanghai
    uri: lb://shanghai
    predicates:
      - Path=/sh/**
      # After是时间断言,判断当前访问时间是否晚于配置的时间
      # 如果时间早于配置的时间,会发生404,只有晚于这个时间才能正常访问
      # 所有断言配置都是"与"的关系
      - After=2023-02-22T16:27:10.619+08:00[Asia/Shanghai]

    Before:(在....之前)

predicates:
  - Path=/sh/**
  - Before=2023-02-22T16:31:00.619+08:00[Asia/Shanghai]

Between(指定时间段访问):

predicates:
  - Path=/sh/**
  - Between=2023-02-22T16:33:00.619+08:00[Asia/Shanghai],2023-02-22T16:33:30.619+08:00[Asia/Shanghai]

 要求指定参数的请求:

Query断言,判断是否包含指定的参数名称,包含参数名称才能通过路由

例:

predicates:
  - Path=/sh/**
  # Query断言判断请求中是否包含参数名称为username的参数,如果不包含发生404错误
  - Query=username

 这里需要提到的一点就是

内置过滤器

Gateway还提供内置过滤器:

但是不要和我们代码中的filter混淆

内置过滤器允许我们在路由请求到目标资源的同时,对这个请求进行加工或处理:

常见的过滤器比如:

AddRequestParament过滤器

它的作用是请求中添加参数和它对应的值

routes:
  - id: gateway-shanghai
    uri: lb://shanghai
    filters:
      - AddRequestParameter=age,18
    predicates:
      - Path=/sh/**
      # Query断言判断请求中是否包含参数名称为username的参数,如果不包含发生404错误
      - Query=username

添加之后在控制器则需要进行接收:

@GetMapping("/show")
public String show(String username,Integer age){
    System.out.println(ZonedDateTime.now());
    return "这里是上海!姓名:"+username +"年龄:"+age;
}

今日学习到此结束,感谢你的阅读,如有疑问或者问题欢迎私信,我会帮忙解决,如果没有回,那我就是在学习

你可能感兴趣的:(网关配置,spring,java,spring,cloud)