码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 十一、统一网关GateWay(搭建网关、过滤器、跨越解决)


    目录

    一、网关技术的实现

    在SpringCloud中网关的实现包括两种:

    作用:

    二、搭建网关服务

    1、新建模块,并添加依赖

    2、新建Gateway包,并编写启动类

    3、编写yml文件

    4、启动服务,并在网页内测试

    5、步骤

    三、路由断言工厂

    1、网关路由可以配置的内容包括:

    四、路由过滤器

    配置路由过滤器:

    1、修改yml文件

    2、重启gateway服务,并在userController中添加请求头参数

     3、重启user服务,并且在浏览器中进行测试

    配置所有路由的过滤器:

    1、在yml文件中添加默认路由过滤器

    2、重启网关,并测试

    五、全局过滤器

    1、新增拦截器类

    2、重启服务,并发送请求

    3、添加过滤参数并发送请求

    六、过滤器执行顺序

    七、跨域问题的解决


    一、网关技术的实现

    在SpringCloud中网关的实现包括两种:

    • gateway
    • zuul

    Zuul是基于Servlet的实现,属于阻塞式编程。

    而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

    作用:

    1. 对用户请求做身份认证、权限校验
    2. 将用户请求路由到微服务,并实现负载均衡
    3. 对用户请求做限流

    二、搭建网关服务

    1、新建模块,并添加依赖

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-gateway</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloud</groupId>
    7. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    8. </dependency>

    2、新建Gateway包,并编写启动类

    3、编写yml文件

    1. server:
    2. port: 10010
    3. spring:
    4. application:
    5. name: gateway
    6. cloud:
    7. nacos:
    8. server-addr: localhost:8848 #nacos地址
    9. gateway:
    10. routes:
    11. - id: user-service #路由标识(唯一)
    12. uri: lb://userservice #目标路由的地址
    13. predicates: #路由断言
    14. - Path=/user/** #判断路径
    15. - id: order-service
    16. uri: lb://orderservice
    17. predicates:
    18. - Path=/order/**

    4、启动服务,并在网页内测试

    5、步骤

    三、路由断言工厂

    1、网关路由可以配置的内容包括:

    • 路由id:路由唯一标示
    • uri:路由目的地,支持lb和http两种
    • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
    • filters:路由过滤器,处理请求或响应

    具体使用方法可以在spring官网查看

    当路由规则不符合时,会出现404的错误!

    四、路由过滤器

    路由过滤器工厂同样有30多个,这里是具体实现方法。

    配置路由过滤器:

    1、修改yml文件

    1. filters:
    2. - AddRequestHeader=Truth,Itcast is freaking aowsome!
    2、重启gateway服务,并在userController中添加请求头参数

     3、重启user服务,并且在浏览器中进行测试

    说明请求头添加成功了

    这只是配置单个路由的过滤器,若要添加所有路由过滤器,进行以下步骤

    配置所有路由的过滤器:

    1、在yml文件中添加默认路由过滤器

    2、重启网关,并测试

    发现请求头添加成功,也就是过滤器添加成功

    五、全局过滤器

    1、新增拦截器类

    1. @Order(-1) //参数是指过滤器的优先级,值越低,优先级越高
    2. @Component
    3. public class AuthorizeFileter implements GlobalFilter {
    4. @Override
    5. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    6. // 1.获取请求参数
    7. ServerHttpRequest request = exchange.getRequest();
    8. MultiValueMap params = request.getQueryParams();
    9. // 2.获取参数中的authorization参数
    10. String authorization = params.getFirst("authorization");
    11. // 3.判断参数值是否等于admin
    12. if ("admin".equals(authorization)){
    13. // 4.是则放行
    14. return chain.filter(exchange);
    15. }
    16. else {
    17. // 5.否则拦截
    18. // 5.1设置状态码
    19. exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
    20. // 5.2拦截请求
    21. return exchange.getResponse().setComplete();
    22. }
    23. }
    24. }

    2、重启服务,并发送请求

    3、添加过滤参数并发送请求

    六、过滤器执行顺序

    • order值越小,优先级越高
    • 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器
       

    七、跨域问题的解决

    在gateway的yml文件中加上,网站记得改

    1. globalcors: # 全局的跨域处理
    2. add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
    3. corsConfigurations:
    4. '[/**]':
    5. allowedOrigins: # 允许哪些网站的跨域请求
    6. - "http://localhost:8090"
    7. - "http://www.leyou.com"
    8. allowedMethods: # 允许的跨域ajax的请求方式
    9. - "GET"
    10. - "POST"
    11. - "DELETE"
    12. - "PUT"
    13. - "OPTIONS"
    14. allowedHeaders: "*" # 允许在请求中携带的头信息
    15. allowCredentials: true # 是否允许携带cookie
    16. maxAge: 360000 # 这次跨域检测的有效期

  • 相关阅读:
    AdServices归因和iAd归因集成
    可视化学习:WebGL的基础使用
    LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解
    4.2冰达机器人:视觉实例-机器人视觉循线、视觉实例-调整循线颜色
    jenkins 使用原生 git clone 命令,指定ssh密钥文件
    供应商关系管理的重要性
    MongoDB数据的导入与导出
    【无线传感器】使用 Mamdani 模糊推理系统改进无线传感器网络路由和数据包传递(Matlab代码实现)
    Ansible教程
    GitHub详细教程
  • 原文地址:https://blog.csdn.net/icbbm/article/details/134477857
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号