大白话实战Gateway

网关功能

网关在分布式系统中起了什么作用?参考下图:
在这里插入图片描述

前端想要访问业务访问,就需要知道各个访问的地址,而业务集群服务有很多,前端需要记录非常多的服务器地址,这种情况下,我们需要对整个业务集群做一个整体屏蔽,这个时候就引入Gateway网关,它就是所有服务的请求入口。以后前端不需要记住每个微服务的地址,只需要记住网关的地址,它把请求发给网关,由网关来判断这个请求发给哪个服务,从而完成请求路由。
而网关如何实现把订单的需求转给订单服务而不是其他服务呢?依然要依赖服务注册/发现流程。所有的服务启动后,会注册到注册中心,这样网关就可以从注册中心中获取到所有微服务所在的地址,网关可以根据前端发送请求的路径可以判断该请求发给哪个服务,比如请求以order开头的就转给订单服务,这个时候,网关就可以从注册中心找到所有订单服务的机器列表端口号和访问地址。接下来随便挑个地址,把请求转发。挑选地址的时候,可以融入负载均衡算法,这个就是网关存在的意义。所以网关的功能如下:
在这里插入图片描述

  1. 统一入口

以后所有流量的统一入口都可以经过网关。

  1. 请求路由

交给网关的请求,网关会自动判断该交给哪个服务。

  1. 负载均衡

在路由的时候,网关可以融入负载均衡算法,均衡集群中每个服务器的负载量。

  1. 流量控制

sentinel可以控制每个服务的QPS,它还能融入网关,由于网关是统一入口,一旦和网关整合后,可以在入口处,对全局的QPS进行统一限流。

  1. 身份认证

比如请求过来后,网关发现是未登录的用户,而访问的资源必须登录,那就可以把这个请求挡回,让重新登录。或者有些是非法攻击请求,也可以拦截。

  1. 协议转换

比如前端发的请求带的是json数据,但后端微服务直接远程调用需要GRPC协议,网关就可以把json数据转为GRPC通用的数据模型,再往下转发。

  1. 系统监控

由于所有的入口都在网关,那就可以监控每个请求,从收到到结束处理了多长时间,来统计全局的慢请求,统计当天的访问总量等等各种监控数据。

  1. 安全防护

从网关层,我们可以配置防止跨站脚本攻击,SQL注入等常见的安全问题。

而我们接下来学的是Spring Cloud Gateway:
在这里插入图片描述
Spring Cloud Gateway有两个版本,一个是Reactive Server,是基于响应式生产的网关,它可以占用少量资源就能实现高并发,Server MVC是个传统的网关,用的是之前Serverlet那一套,现在都推荐使用响应式编程的网关。使用的时候两个的区别就是导入不同的starter。

接下来我们通过一个例子来熟悉网关的用法。

在这里插入图片描述

创建网关

来到项目中,由于网关不属于业务,它属于架构组件的一部分,所以推荐直接创建在cloud-demo下面,新创建个module。
在这里插入图片描述

在网关模块的pom文件中配置:
根据网关的原理,要做路由转发,需要用到路由中心,所以也引入nacos,配置中心可以暂时不需要,还要引入负载均衡

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
 </dependency>

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
 
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 </dependency>

接下来直接启动这个项目,它就是个网关了,即创建一个网关启动类:

在这里插入图片描述

每个项目都脱离不了它的配置文件,我们创建一个application.yml,并配置名称和nacos:

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
# 写上80端口,以后访问就不用加端口了
server:
  port: 80

我们来启动这个项目,然后去nacos服务列表查看:
在这里插入图片描述
我们访问网关如果能看到这个错误页面说明网关启动成功了:
在这里插入图片描述

路由-规则配置

在这里插入图片描述
创建好了网关,解析来在网关里面配置路由规则,让以/api/order/开头的所有请求交给订单服务,/api/product/开头的所有请求交给商品服务,这个怎么做呢?Spring cloud提供了两种方式,第一种在配置文件里面配置路由规则,第二种是使用编码的方式编写路由规则。

我们先来测试第一种,用配置文件,为了方便起见,我们新建一个application-route.yml配置文件:

spring:
  cloud:
    gateway:
      routes:
        - id: order-route
          uri: lb://service-order
          predicates:
            - Path=/api/order/**
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**

说明:
uri: lb://service-order:lb是负载均衡的意思,即负载均衡访问订单服务

  • Path=/api/order/**:访问以/api/order开头的网址

接下来需要给所有微服务的请求都加上前缀:

订单请求:

在这里插入图片描述

商品请求:
在这里插入图片描述

还有所有的远程调用也要加前缀(注意,OpenFeign客户端不能用@RequestMapping注解):
在这里插入图片描述

重启订单和商品服务进行测试:

在这里插入图片描述

我们再启动一个订单服务,测试一下负载均衡:
在这里插入图片描述

请求两次,发现每个服务各打印了一次日志,说明负载均衡也没有问题:
在这里插入图片描述
在这里插入图片描述

路由-工作原理

通过路由配置,我们很容易的就知道网关的工作原理,如下图:
在这里插入图片描述

当请求进来后优先交给网关,网关里面会配置非常多的路由规则,每个路由规则重要的几项有:

  • id

全局唯一不重复,

  • uri

就是我们要去的目的地

  • predicate

最终这个请求一定要交给指定的目的地,但是什么情况下才转给这个目的地,我们需要配置一个断言规则,规则可以有很多,因为它是一个数组的方式,如果多个的话,那就必须同时成立才可以,满足这个规则,就会把请求转给目的地。

  • filter

转的过程中还可以进行一系列的filter过滤器。

所有可配置的参数如源码的变量:
在这里插入图片描述

我们主要就是看有多少断言规则,目前我们只是根据路径进行往下转,再就是看每次转的时候如何使用过滤器,做一些前置和后置的逻辑,另外需要注意,这些规则是有序的,如果第一个匹配上了,就不会匹配第二个了,比如第一个是订单,匹配上后,就不会往下匹配了。

此时我们可以配置order,越小优先级越高

断言-长短写法

前面我们说了网关的三个核心:路由、断言和过滤器。
在这里插入图片描述
接下来我们看一下断言,常用的断言就是Path,看请求路径有没有满足某种规则,而断言功能是有路由断言工厂提供的,官网的路由断言工厂中列举了到底有多少种断言机制,用法都一样,我们测试一个,通过文档再看其他的就可以了。在测试之前,说一下它们的写法,在SpringCloud里面有两种写法,一种叫短写法,另一种叫全写法。区别如下图:
在这里插入图片描述

短写法就是断言的名,比如Path,等于一个值。而全写法,需要配置name是什么,这里是由于要用路径断言,所以写Path,参数args是什么,指的就是那些值。我们点开predicates源码就可以看到每个断言有两个参数:
在这里插入图片描述

name为什么可以配置为Path呢?实际上在底层对应的是:
在这里插入图片描述
这个断言的名字,完全取决于当时类在命名的时候,断言工厂RoutePredicateFactory前面的字符串是什么,这里我们要选择路径,字符串就是Path,而args参数取决于断言里面有个Config配置:
在这里插入图片描述

配置中有两个:
在这里插入图片描述
所以我们args参数第一个是partterns,即规则,第二个是matchTrailingSlash,默认是true。
在这里插入图片描述
设置为true,那么/red/1和/red/1/是一个路径,也就是后面加不加/都可以,否则就是不同路径了。

我们现在把订单改成了全写法后重启服务看看是否正常:

在这里插入图片描述

这里记住一点&#

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用大内存主机下载Visual Studio

用一台内存达到128G的主机下载Visual Studio 2022&#xff0c;用的是公司网络。下载速度让我吃了一惊&#xff0c;没人用网络了&#xff1f;还是网站提速了&#xff1f;以前最大只能达到5MB/秒。记录这段经历&#xff0c;是用来分析公司网络用的......

【C++语言】string 类

一、为什么要学习 string 类 C语言中&#xff0c;字符串是以 “\0” 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些 str 系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合 OOP 的思想&#xff0c;而且底层空间需…

深度学习-123-综述之AI人工智能与DL深度学习简史1956到2024

文章目录 1 AI与深度学习的简史1.1 人工智能的诞生(1956)1.2 早期人工神经网络(1940-1960年代)1.3 多层感知器MLP(1960年代)1.4 反向传播(1970-1980年代)1.5 第二次黑暗时代(1990-2000年代)1.6 深度学习的复兴(21世纪末至今)1.6.1 CNN卷积神经网络(1980-2010)1.6.2 RNN递归神经…

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…

基于Llama 3.2-Vision的医学报告生成

记录运用大模型解决医学报告实例&#xff0c;仅介绍本地调用的情况。 前情提要 已安装 Python 显存不少于8G&#xff08;8G设备上测试成功&#xff0c;其他环境可以自行测试&#xff09;。 需要安装Ollama (Ollama 是一个允许在本地运行多模态模型的平台)。 方式1&#xff1…

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…

DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑

DeepSeek作为一款前沿的人工智能大模型&#xff0c;凭借其强大的多模态理解、知识推理和内容生成能力&#xff0c;正在重构文旅产业的发展逻辑&#xff0c;推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构&#xff1a;打造全域感知的智…

【Python爬虫(26)】Python爬虫进阶:数据清洗与预处理的魔法秘籍

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

支持批量导出的软件,效率拉满!

今天给大家分享一款超实用的软件&#xff0c;它能帮你批量导出PPT里的图片&#xff0c;简直是提升工作效率的神器&#xff01; PPT转jpg PPT逐页导出为图片 这款软件超级简单易用&#xff0c;打开就能直接上手&#xff0c;不需要复杂的设置。 这个软件有三种功能&#xff0c; …

论文笔记(七十二)Reward Centering(二)

Reward Centering&#xff08;二&#xff09; 文章概括摘要2 简单的奖励中心 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…

Jmeter连接数据库、逻辑控制器、定时器

Jmeter直连数据库 直接数据库的使用场景 直连数据库的关键配置 添加MYSQL驱动Jar包 方式一&#xff1a;在测试计划面板点击“浏览”按钮&#xff0c;将你的JDBC驱动添加进来 方式二&#xff1a;将MySQL驱动jar包放入到lib/ext目录下&#xff0c;重启JMeter 配置数据库连接信…

ORM框架详解:为什么不直接写SQL?

想象一下&#xff0c;你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者&#xff0c;你可能会想&#xff1a;“我已经学会了SQL&#xff0c;为什么还要使用ORM框架呢&#xff1f;直接写SQL语句不是更简单、更直接吗&#xff1f;” 如…

RT-Thread+STM32L475VET6实现红外遥控实验

文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟&#xff0c;并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…

推荐一个github star45k+进阶的java项目及知识的网站

mall是github上star 45k的一个java项目 mall项目是一套电商系统&#xff0c;包括前台商城系统及后台管理系统&#xff0c;基于SpringBootMyBatis实现&#xff0c;采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心…

pyside6学习专栏(二):程序图像资源的加载方式

pyside6中的QLabel控件可以加载图像和gif动画&#xff0c;可以直接从外部文件加载&#xff0c;也可以从QRC类型的文件(实际是一脚本文件)经编绎生成对应的资源.PY模块文件(就是将qrc文本中指定的资源文件的16制内容写入.py文件)来使用&#xff0c;本文对两种方式作了一简单的示…

项目管理的核心是什么?

项目管理不仅仅是按照一定的计划进行任务的执行&#xff0c;更重要的是如何在面对复杂和动态的环境下&#xff0c;保证项目顺利进行并达到预期的结果。它的核心在于高效的资源配置、团队的合作与协调、风险管理及变更管理。在这些关键因素的支持下&#xff0c;项目能够高效地从…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

【C++第二十章】红黑树

【C第二十章】红黑树 红黑树介绍&#x1f9d0; 红黑树是一种自平衡的二叉搜索树&#xff0c;通过颜色标记和特定规则保持树的平衡性&#xff0c;从而在动态插入、删除等操作中维持较高的效率。它的最长路径不会超过最短路径的两倍&#xff0c;它的查找效率比AVL树更慢(对于CPU…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

读书笔记:要点提炼《基于大模型的RAG应用开发与优化——构建企业级LLM应用》(严灿平)

文章目录 一、大模型基础与演进1.1 大模型时代与生成式 AI 爆发1.2 大模型应用的纵深演进及实际局限 二、RAG 基础概念与必要性2.1 RAG 的理论基础与应用动机2.2 简单 RAG 场景示例解析 三、RAG 应用技术架构3.1 经典架构与业务流程设计3.1.1 RAG 应用的整体流程与模块划分3.1.…