SpringCloud系列(七)最详细最全面详述统一网关 Gateway

news2024/9/25 23:21:08

有道词典上对 Gateway 有大门口, 门道, 通道以及计算机术语中的网关之意, 其实对于网关这个概念是很好理解的, 例如有这样高档的小区车库, 当开车经过闸口的时候会识别你的车牌号, 识别成功后会自动将你的车库门打开; 其实计算机中的网关也是如此, 在 Spring Cloud 中网关的实现有两种: Gateway 和 Zuul, 但是 Zuul 是基于 Servlet 实现的, 属于阻塞式编程, 而 Gateway 则是基于 Spring5 中提供的 WebFlux, 属于响应式编程, 具有更良好的性能, 因此我们着重讲的也是比较主流的 Gateway 的使用; 作为 Spring Cloud 的核心组件之一, 主要作用就是统一服务访问的入口, 对所有的微服务进行底层映射, 当客户端访问某一个服务时, 通过服务名来找到相应的服务.
总之网关的作用: 对用户的请求做身份认证及权限的校验; 将用户请求路由到相应的微服务, 并实现负载均衡; 再就是对用户的请求做限流.

Gateway

  • 🐝 Gateway 和 Nginx 的区别
  • 🐝 🐝 Gateway 的作用
  • 🐝 🐝 🐝 Gateway 的搭建
  • 🐝 🐝 🐝 🐝 路由
    • 🐝 🐝 🐝 🐝 🙊断言工厂
    • 🐝 🐝 🐝 🐝 🙊🙊 过滤器
    • 🐝 🐝 🐝 🐝 🙊🙊🙊 全局过滤器
    • 🐝 🐝 🐝 🐝 🙊🙊🙊🙊过滤器的执行顺序
  • 🐝 🐝 🐝 🐝 🐝跨域问题的处理

🐝 Gateway 和 Nginx 的区别

之前的文章中我们学过 Nginx, 它的主要作用是反向代理, 实现负载均衡, 而对于 Gateway 也有实现负载均衡的作用, 负载均衡就是我们将项目部署到多个服务器上, 然后通过使用统一的域名去访问, 如通过 Nginx 对请求进行分发, 从而减轻服务器的压力, 也可以这样说, Nginx 服务器起到了分发的作用, 但是真正的实现可以放在其他的服务器上, Nginx 作为隔离层, 也对我们项目起到了安全壁障. 那么 Gateway 和 Nginx 有什么区别呢?

  • 首先要区分这两个概念首先要区分开流量网关和业务网关的概念, Nginx 作为流量网关, 相当于访问的一个总入口, 也就是说我们会将所有的 html 页面放到 Nginx 的容器中, 从而起到流量的监控及日志的管理, 全局的限流等; 而业务网关则是针对具体的后端应用和服务, 也可以总结为 Nginx 主要配置在前端, 而 Gateway 则是配置在后端;
  • 其次 Gateway 主要是利用路由, 断言及过滤器进行流量的控制等; Nginx 主要是负载均衡, 反向代理及当做 Web 服务器.
  • 总之, Gateway 是前端工程到后端服务器之间的一个业务网关, 而 Nginx 是用户到前端工程的流量网关.

🐝 🐝 Gateway 的作用

  • 对用户的请求做身份认证及权限的校验; 网关作为微服务的入口, 需要校验用户是否具有请求的资格, 如果没有则拦截在外面;
  • 将用户请求路由到相应的微服务, 并实现负载均衡; 一切请求都必须先经过 Gateway, 但是网关并不处理业务, 这里倒和 Nginx 一致, 而是根据某种规则将请求转发到某个微服务中, 这个过程也称之为是路由; 当然当有多个微服务的时候还需要做负载均衡;
  • 对用户的请求做限流; 当客户端的请求流量过多时, 可以在网关中设置微服务能够接受的流量进行放行发过来的请求, 避免服务压力过大.

🐝 🐝 🐝 Gateway 的搭建

步骤一: 创建 Gateway 服务并引入相关依赖;
在这里插入图片描述
在 pom.xml 中引入网关及 nacos 服务发现依赖;

        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos服务发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

步骤二: 编写启动类;
在这里插入图片描述
步骤三: 在 application.yml 中编写配置及路由规则;
在这里插入图片描述
注意 routes 网关路由的配置, id 前面的短线有空格; 路由断言就是来判断请求是否符合规则; uri 中的 lb 即 loadBalance, 也就是负载均衡的意思, providerservice 就是我们的服务名称.

步骤四: 重启测试;
  重启服务提供者 / 服务消费者 / Gateway;
在这里插入图片描述
网关路由的流程图如下:
在这里插入图片描述

🐝 🐝 🐝 🐝 路由

🐝 🐝 🐝 🐝 🙊断言工厂

我们在前面的 yml 中写的断言规则只是字符串, 这些字符串都会被断言工厂读取并处理, 转变为路由判断的条件, 如路径的匹配: - Path=/provider/**; 关于断言规则还有很多种, 如下图所示, 但是我们常用的也就是 Path 这个了.
在这里插入图片描述
总之, 断言工厂(PredicateFactory) 主要作用有就是读取用户定义的断言条件, 对请求做出判断. 如 - Path=/provider/** 代表的含义就是以 /provider 开头的就认为是符合条件的.

🐝 🐝 🐝 🐝 🙊🙊 过滤器

路由过滤器(GatewayFilter) 是网关中提供的一种过滤器, 可以对进入网关的请求和微服务返回的响应进行处理;路由过滤器 spring 也提供了很多种, 如:
在这里插入图片描述
案例: 在 providerservice 路由下添加请求头过滤器, 只需要在 yml 文件中的 routes 中添加即可:
在这里插入图片描述
过滤器的作用:

  • 对路由的请求或者响应做加工处理, 如上面的案例添加请求头;
  • filters: 配置在路由下的过滤器只对当前路由的请求生效, default-filters 则是对所有路由都生效.

🐝 🐝 🐝 🐝 🙊🙊🙊 全局过滤器

除了上述方式使用过滤器外, 还有全局过滤器可供我们使用, 它的作用也是处理一切进入网关的请求和微服务的响应, 与上面的过滤器的作用是一样的, 但是不是通过在 yml 中配置使用, 而是需要我们自己写代码实现. 当然接口 spring 中已提供, 如下所示:
在这里插入图片描述
案例: 定义一个全局过滤器用来拦截用户并判断其身份; 要求判断请求的参数中是否有 authorization, 并判断其值是否为 admin, 如果都满足这两个条件才放行; 具体实现逻辑如下:
在这里插入图片描述
具体实现步骤:

  • 实现 GlobalFilter 接口;
  • 添加 @Order 注解或者是实现 Ordered 接口;
  • 编写处理逻辑.

🐝 🐝 🐝 🐝 🙊🙊🙊🙊过滤器的执行顺序

上面我们已经说了三类过滤器, 当前路由的过滤器 / DefaultFilter 过滤器 / 全局过滤器; 那么请求来了之后, 三者的执行顺序是怎么样的呢?
在这里插入图片描述
请求路由后, 会将三个路由器合并到一个过滤器链中, 排序后一次进行执行, 如上图所示;

  • 每个过滤器都必须指定一个 int 类型的 order 值, order 值越小, 优先级越高, 执行顺序越靠前;
  • 全局过滤器实现 Ordered 接口或者添加 @Order 注解来执行 order 值, 有我们程序猿自己设定;
  • 路由过滤器和默认过滤器的 order 是由 Spring 来设定, 默认是按照声明的顺序从 1 递增;
  • 当过滤器的 order 值一样时, 会按照 defaultFilter > 默认过滤器 > 全局过滤器的顺序进行执行.

🐝 🐝 🐝 🐝 🐝跨域问题的处理

当域名不同后者是域名相同但是端口号不同时, 浏览器禁止请求的发起者与服务端发生跨域 ajax 请求, 从而请求被浏览器拦截, 遇到这样的问题解决方案可以在 gateway 的 yml 中加入 CORS 配置;
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【1 - 决策树 - 原理部分】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

LOAM和SSL-SLAM

今天来水两个激光SLAM的相关框架的学习笔记。 一、LOAM 首先介绍scan-to-scan map-to-map scan-to-map之间的关系&#xff1a; 1.scan-to-scan匹配 即两帧激光雷达数据之间的匹配&#xff0c;目的是求得从起始帧A到目标帧B的相对平移量与旋转矩阵。目前来说scan-toscan中&a…

Elasticsearch搜索引擎

The Elastic Stack, 包括 Elasticsearch【搜索&#xff0c;分析】、 Kibana【可视化】、 Beats 和 Logstash【数据的搜集】&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elati…

安装压缩包版mysql

一、mysql-8.0.21-winx64.zip解压 二、在解压后的目录下添加data目录 三、配置环境变量 win7&#xff1a; ​ 我的电脑–>属性–>高级系统设置–>高级–>环境变量 ​ 在下面系统变量中 ​ 新建 ​ 变量名&#xff1a;MYSQL_HOME ​ 变量值&#xff1a;E:\MySQL\my…

常用的接口安全性保障手段

http接口有哪些安全问题 数据被抓包窃取数据被恶意篡改数据被爬取泄漏Token授权机制 用户使用用户名密码登录后服务器给客户端返回一个Token&#xff08;通常是UUID&#xff09;&#xff0c;并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验…

UG NX二次开发(C#)-曲线-NXOpen.Curve初探

系列文章目录 `` 例如:第一章 初探NXOpen.Curve类 文章目录 系列文章目录1.前言2.NXOpen.Curve2. NXOpen.Curve包含的子类3.曲线类型的获取4.将曲线对象转换为子类类型1.前言 介绍下NXOpen.Curve类、Curve类型的获取、一些创建曲线的封装方法(包括直线、样条曲线、圆锥曲线…

OSM数据内容解析

OSM数据内容解析 数据简介 OpenStreetMap&#xff08;简称OSM&#xff0c;中文是公开地图&#xff09;&#xff0c;这是一个网上地图协作计划&#xff0c;目标是创造一个内容自由且能让所有人编辑的世界地图。是一款由网络大众共同打造的免费开源、可编辑的地图服务。 OSM采…

成功实施APS生产排程系统,必须具备哪些条件?

在许多生产管理者眼中&#xff0c;生产作业计划是不重要的&#xff0c;如果我们只停留在小加工作坊的规模&#xff0c;大脑就能把一个月的订单、物料、资源记得清清楚楚&#xff0c;那么生产计划排程的必要性确实不太大&#xff0c;但事实上&#xff0c;随着生产规模的扩大&…

JDK1.8中HashMap的resize()方法详解

JDK1.8中HashMap的resize()方法详解 文章目录JDK1.8中HashMap的resize()方法详解[toc]一、概述二、源码解析三、元素迁移四、小结在学习本文之前&#xff0c;默认大家已经有了HashMap源码的前置知识。 「集合底层」深入浅出HashMap底层源码 一、概述 resize()方法的代码比较长…

OpenHarmony#深入浅出学习eTs#(四)登陆界面UI

本项目Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) 一、明确目标 经过前面两章的学习&#xff0c;大家对Super Visual应该有了一个较为简单的认识&#xff0c;这一章就把前面的知识点串一下&#xff0c;使用Ark UI(Super Visual)赖模仿一个Q…

浅谈权限系统在多利熊业务应用

作者 | 百度智能小程序团队 导读 本文首先引入多利熊业务介绍&#xff0c;引出多利熊业务建设权限系统的痛点&#xff0c;接着分别从权限系统模型、权限系统设计以及多利熊业务业务应用方面详细探讨了具体的方案和设计&#xff0c;最后对权限系统设计思考&#xff0c;对数据维度…

linux连接器脚本前奏-基于x86(一)

从今天开始进入正文,和讲解liteos一样,我们先从连接器脚本开讲。我们知道连接器脚本描述了编译输出程序的布局,那么linux内核编译输出的布局是怎么样的呢?听我慢慢道来,关于连接器脚本的大概使用用途,可以参见 liteos链接器脚本一 liteos链接器脚本二 这里先说明一下对于…

Python进行异步请求,实现多开任务

前言 本文是该专栏的第5篇,后面会持续分享python的各种干货知识,值得关注。 在工作中,你可能或多或少会接到这样一个任务需求。 给你一个任务队列,需要你进行多任务去实现处理,尤其在爬虫项目或者是使用selenium,pyppeteer等任务中比较常见,至于多线程和多进程那些,笔…

OpenCL 是什么

OpenCL 创建Program对象|极客笔记 文章目录 OpenCL标准什么是OpenCL OpenCL全称为Open Computing Language&#xff08;开放计算语言&#xff09;&#xff0c;先由Apple设计&#xff0c;后来交由Khronos Group维护&#xff0c;是异构平台并行编程的开放的标准&#xff0c;也是…

antd 时间类组件的国际化 locale 设置不生效 解决方案汇总

antd 时间类组件的国际化 locale 设置不生效&#xff0c;踩坑之路和解决办法 问题 如图所示&#xff0c;antd 时间类组件中英文混合显示&#xff1a; 初始配置代码如下&#xff1a; import ./index.css; import ./global.less;import { ConfigProvider } from antd; import…

excel表格制作如何设置?新手必备教程!

Excel是一种专门用于制作表格、输入数据和统计分析的办公软件&#xff0c;日常办公中它带给我们极大的便利。下面我们一起来看看excel表格制作如何操作&#xff1f;为了方便理解&#xff0c;下面分为详细的六个步骤。你可以根据下面的操作顺序来操作&#xff08;里面有些顺序是…

Windows版本Tomcat升级openssl版本

本次教程适用于windows版本安装Tomcat调整openssl版本。 下载Tomcat Native Tomcat native提供让Tomcat以APR模式运行&#xff0c;APR的全称是Apache Portable Runtime&#xff0c;它是一个高度可移植的库&#xff0c;它是Apache HTTP Server 2.x的核心。APR有许多用途&#…

element ui Form 自定义校验规则,验证手机号

网站快速成型工具 Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 指南 了解设计指南&#xff0c;帮助产品设计人员搭建逻辑清晰、结构合理且高效易用的产品。 查看详情 组件 使用组件 Demo 快速体验交互细节&#xff1b;使用前端框架…

@开发者:个推小程序消息推送解决方案来了

随着小程序技术和应用场景的不断完善&#xff0c;越来越多的开发者搭建了小程序平台&#xff0c;为用户带来更“轻量”的服务。在小程序用户迅猛增长的同时&#xff0c;开发者对于小程序用户精细化触达的需求也愈加强烈。近日&#xff0c;个推消息推送上线了小程序推送功能&…

Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)

参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量&#xff0c;在统计学里面叫做协变量也叫自变量&#xff0c;在量化投资里面则叫做因子&#xff0c;所谓多因子就是有很多的特征变量。 本次带来的就是多因子模型&#xff0c;并且使用的是机器学习的强大的非…