• 微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.4 路由的过滤器配置


    微服务框架

    【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

    SpringCloud微服务架构

    8 Gateway 网关

    8.4 路由的过滤器配置
    8.4.1 路由过滤器 GatewayFilter

    GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

    举个栗子:

    在这里插入图片描述

    当用户向网关发起请求时,它到底经历了什么?

    在这里插入图片描述

    首先是路由,我们有一个断言工厂,它可以基于我们配置的规则完成 请求路由,判断这个请求到底要去向哪个微服务

    但是路由之后,并不是立即就向微服务发起请求的

    在这里插入图片描述

    在网关里面,我们还可以路由配置各种各样的过滤器

    这些过滤器会形成一个 过滤器链,

    在这里插入图片描述

    用户的请求一定要经过这个过滤器链,才能到达微服务

    那么在这个过程中,过滤器就可以对用户的请求做各种的处理,【请求头处理、参数处理…】

    当微服务处理完成后,会返回一个结果,这个结果也是先到达网关,而且同样的也会经过过滤器链,来逐层处理【各种各样的处理】微服务响应的结果,最终才会返回给用户

    【所以具体能做什么样的处理?】

    Spring提供了31种不同的路由过滤器工厂。【当然现在可能也不止了】例如:

    名称说明
    AddRequestHeader给当前请求添加一个请求头
    RemoveRequestHeader移除请求中的一个请求头
    AddResponseHeader给响应结果中添加一个响应头
    RemoveResponseHeader从响应结果中移除有一个响应头
    RequestRateLimiter限制请求的流量

    Spring 官网 https://docs.spring.io/spring-cloud-gateway/docs/3.1.4/reference/html/#gatewayfilter-factories

    在这里插入图片描述

    OK, 现在【2022年10月29日】有34 种了

    8.4.2 举个栗子

    给所有进入userservice的请求添加一个请求头

    给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

    实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

    在这里插入图片描述

    直接干

    filters:
      - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
    • 1
    • 2

    在这里插入图片描述

    OK, 直接重启网关服务

    在这里插入图片描述

    在user服务中,简单验证一下

    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id,
                          @RequestHeader(value = "Truth",required = false) String truth) {
        System.out.println("truth : " + truth);
        return userService.queryById(id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    重启user 服务

    在这里插入图片描述

    直接测试

    在这里插入图片描述

    查看日志

    在这里插入图片描述

    OK, 没毛病

    【如果我现在想给所有的微服务都加上这个请求头】

    所有微服务都复制一份配置,显然是不合理的,

    【默认过滤器】

    如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

    在这里插入图片描述

    直接干

    default-filters:
      - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
    • 1
    • 2

    在这里插入图片描述

    重启网关服务

    在这里插入图片描述

    先来两次user 请求

    在这里插入图片描述

    查看日志

    在这里插入图片描述

    OK,8081和8082 一个接了一个,而且两次都打印了请求头信息【没毛病】

    这里同样的方式给order 服务加上一个打印信息

    package cn.itcast.order.web;
    
    import cn.itcast.order.pojo.Order;
    import cn.itcast.order.service.OrderService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("order")
    public class OrderController {
    
       @Autowired
       private OrderService orderService;
    
        @GetMapping("{orderId}")
        public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,@RequestHeader(value = "Truth",required = false) String truth) {
            // 根据id查询订单并返回
            System.out.println(truth);
            return orderService.queryOrderById(orderId);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    OK, 重启一下order 服务,测试

    在这里插入图片描述

    没毛病,这就是所有都加上了

    8.4.3 总结
    • 过滤器的作用是什么?

    ①对路由的请求或响应做加工处理,比如添加请求头

    ②配置在路由下的过滤器只对当前路由的请求生效

    • defaultFilters的作用是什么?

    ①对所有路由都生效的过滤器

  • 相关阅读:
    golang中逗号
    GLSL (3)输入和输出
    This dependency was not found: vxe-table/lib/vxe-table in ./src/main.js
    R语言因子分析全流程
    LeetCode: 数组峰值与谷值问题总结 - Python
    CUDA、cudNN 、CUDAToolKit三者关系
    数据结构_B树(C语言)
    CMMI3认证和CMMI5认证有哪些不同
    [Android Frameworks] native Binder and IMemory
    轻松解决VS配置OpenCV环境
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128143167