• 【微服务】Day06


    昨天晚课git地址

    https://gitee.com/jtzhanghl/home2205.git

    续SpringGateway网关

    网关路由配置

    上次课完成了路由的基本配置

    下面对当前项目所有服务器添加路由配置信息

    server:
      port: 9000
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          discovery:
            # 网关也是微服务项目的一部分,所以也要注册到Nacos
            server-addr: localhost:8848
        gateway:
          # routes就是路由的意思,在此处配置是一个数组类型
          routes:
            - id: gateway-shanghai
              uri: lb://shanghai
              predicates: 
                - Path=/sh/**
            # 数组类型中编写 "-"开头,表示是一个数组元素
            # id表示当前路由的名称,没有和其他任何出现过的名字关联,和之后的内容也没有关联
            - id: gateway-beijing
              # 当前路由配置的路由目标配置,也就是路由路径
              # lb是LoadBalance的缩写,beijing是路由目标服务器的名称
              uri: lb://beijing
              # 下面编写路由条件\规则,也就是满足什么样的路径会访问beijing服务器
              # 我们要配置内置断言来配置路径路径   predicates(断言)
              predicates:
                # 断言其实就是满足某个条件时做什么操作的设置
                # predicates和routes类似,也是一个数组类型
                # ↓  P大写!!!!!  表示以/bj/开头的请求都会路由到beijing服务器
                - Path=/bj/**
    # spring.cloud.gateway.routes[0].uri
    # spring.cloud.gateway.routes[0].predicates[0]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    上面的yml配置了bejing和shanghai项目的路由信息

    先启动Nacos

    然后启动每个模块(beijing/shanghai/gateway)

    我们使用

    http://localhost:9000/bj/show可以访问beijing服务器的资源

    http://localhost:9000/sh/show可以访问shanghai服务器的资源

    以此类推,再有很多服务器时,我们都可以仅使用9000端口号来将请求路由到正确的服务器

    就实现了gateway成为项目的统一入口的效果

    动态路由

    网关项目随着微服务数量的增多

    gateway项目的yml文件配置会越来越多,维护的工作量也会越来越大

    所以我们希望gateway能够设计一套默认情况下自动路由到每个模块的路由规则

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

    这就是我们SpringGateway的动态路由功能

    配置文件中开启即可

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    按上面修改完配置之后

    我们可以重启gateway来测试动态路由路径是否生效

    动态路由生成规则为:在网关端口号后先写要路由到的目标服务器在nacos注册的名称,再编写具体路径

    内置断言

    我们上次课在网关配置中使用了predicates(断言)的配置

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

    我们之前使用了Path断言,判断请求的路径是不是满足条件,例如是不是/sh/** /bj/**

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

    但是Path实际上只是SpringGateway提供的多种内置断言中的一种

    还有很多其它断言

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

    时间相关

    after,before,between

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

    如果条件满足可以执行路由操作,否则拒绝访问

    表示时间的格式比较特殊,先使用下面代码获得时间

    ZonedDateTime.now()
    
    • 1

    运行程序输出,可获得当前时间,这个时间的格式可能是

    2022-09-27T10:19:46.898+08:00[Asia/Shanghai]
    
    • 1

    下面在yml配置中添加新的断言配置

    使用After设置必须在指定时间之后访问

    routes:
      - id: gateway-shanghai
        uri: lb://shanghai
        predicates:
          - Path=/sh/**
          # 当前断言是两个条件,第一是路径必须用/sh/开头
          # 第二是访问的时间必须在下面指定的时间之后, 而且两个条件必须同时满足,才能路由
          - After=2022-09-27T10:29:00.898+08:00[Asia/Shanghai]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    必须在指定时间之后才能访问服务

    否则发生404错误拒绝访问

    需要注意测试时,先启动Nacos,再启动shanghai之后启动gateway

    测试时必须通过9000端口访问才能有效果

    使用Before设置必须在指定时间之前访问

    routes:
      - id: gateway-shanghai
        uri: lb://shanghai
        predicates:
          - Path=/sh/**
          # 当前断言是两个条件,第一是路径必须用/sh/开头
          # 第二是访问的时间必须在下面指定的时间之后, 而且两个条件必须同时满足,才能路由
          - Before=2022-09-27T10:31:30.898+08:00[Asia/Shanghai]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用Between设置必须在指定时间之间访问

    routes:
      - id: gateway-shanghai
        uri: lb://shanghai
        predicates:
          - Path=/sh/**
          # 当前断言是两个条件,第一是路径必须用/sh/开头
          # 第二是访问的时间必须在下面指定的时间之后, 而且两个条件必须同时满足,才能路由
          - Between=2022-09-27T10:33:20.898+08:00[Asia/Shanghai],2022-09-27T10:33:40.898+08:00[Asia/Shanghai]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    要求指定参数的请求

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

    routes:
      - id: gateway-shanghai
        uri: lb://shanghai
        predicates:
          - Path=/sh/**
          # 判断是否包含指定参数名称(username)的断言,不包含就不能正常路由
          - Query=username
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    内置过滤器

    Gateway还提供的内置过滤器

    不要和我们学习的filter混淆

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

    常见过滤器也有一些

    我们给大家演示一下AddRequestParameter过滤器

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

    routes:
      - id: gateway-shanghai
        uri: lb://shanghai
        filters:
          # 内置过滤器功能,AddRequestParameter在路由到指定控制器方法之前
          # 在请求中添加参数age=18,控制器方法运行时可以通过age获取该值
          - AddRequestParameter=age,18
        predicates:
          - Path=/sh/**
          # 判断是否包含指定参数名称(username)的断言,不包含就不能正常路由
          - Query=username
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在shanghai的控制器方法中添加代码接收name,age的值

    @RestController
    @RequestMapping("/sh")
    public class ShanghaiController {
       
    
        @GetMapping("/show")
        public String show(String username,Integer age){
       
            System.out.<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Excel只读模式的密码如何取消?
    UniApp集成微信小程序原生分包
    HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作
    .env文件详解
    GPT-4o:重塑人机交互的未来
    如何在矩池云使用 Poetry 管理项目环境
    【24届数字IC秋招总结】正式批面试经验汇总9——飞腾
    springboot流浪狗领养管理系统毕业设计源码260839
    Redis概述
    电池故障估计:Realistic fault detection of li-ion battery via dynamical deep learning
  • 原文地址:https://blog.csdn.net/shortcutsuccess/article/details/127130780