Gateway-网关-分布式服务部署

news2025/4/15 20:04:29

前言

什么是API⽹关

API⽹关(简称⽹关)也是⼀个服务, 通常是后端服务的唯⼀⼊⼝. 它的定义类似设计模式中的Facade模式(⻔⾯模式, 也称外观模式). 它就类似整个微服务架构的⻔⾯, 所有的外部客⼾端访问, 都需要经过它来进⾏调度和过滤.
在这里插入图片描述
常⻅⽹关实现
Spring Cloud Gateway,Nginx

快速入门

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
因为要动态路由找到我们的服务,所以要用nacos,所以要引入nacos依赖
在这里插入图片描述
因为还有负载均衡,所以也要引入负载均衡的jar包
在这里插入图片描述
在这里插入图片描述

然后是写启动类
然后是写配置文件
在这里插入图片描述

在这里插入图片描述
现在我们通过网关服务来调用order-service

在这里插入图片描述
这样就调用成功了
在这里插入图片描述
没有配置的路径是访问不成功的
在这里插入图片描述
配置多个接口用逗号隔开就可以了

在这里插入图片描述

这样就成功了
在这里插入图片描述
在这里插入图片描述
这样的话,如果8080,9090端口没有开放的话,也是可以访问里面的东西了

Gateway-Predicate学习

在这里插入图片描述
predicates就是路由条件

这个就是path满足条件就会去调用url,调用对应的服务
predicate其实就是一个接口
在这里插入图片描述
这样子predicate就写好了,接下来就是使用了
在这里插入图片描述
引入这个测试依赖
在这里插入图片描述
这样就可以run了
在这里插入图片描述
我们还可以用匿名内部类的方式来创建predicate
在这里插入图片描述
在这里插入图片描述

这样也是可以的
因为提示了灰色–》可以优化
在这里插入图片描述
这里有提示
在这里插入图片描述
在这里插入图片描述

这样还是可以的

然后就是predicate还有其他的方法
在这里插入图片描述
negate就是对test的值取反而已
在这里插入图片描述
然后还有and,or这些
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个就是predicate的使用。and

Route Predicate Factories

路由断言工厂,就是路由的条件判断-》比如path
官网

在这里插入图片描述

这个的意思就是请求的时间必须在这个之后
在这里插入图片描述
这个意思就是请求必须在这个日期之前
在这里插入图片描述
请求必须在这两个日期之间
在这里插入图片描述
这个意思就是请求里面必须带一个cookie
名字为chocolate,value为ch.p,可能是一个值,也可能是一个正则表达式
在这里插入图片描述
意思就是请求要有这个header
key是X-Request-Id,值是\d+(数字类型),值是正则表达式
在这里插入图片描述
在这里插入图片描述
这个表示请求的方式为get或者post
在这里插入图片描述
在这里插入图片描述

这个是请求查询的字符串,第一个表示请求里面必须有gree这个参数
第二个表示请求参数必须有red,值为gree.,可以为正则表达式

多个参数用逗号分开

在这里插入图片描述
表示请求的ip

我们现在演示一下时间

在这里插入图片描述
存在多个路由条件的时候,关系是and

在这里插入图片描述
在这里插入图片描述
这样就不能访问了

日期格式怎么写呢
在这里插入图片描述
这样就可以直到当前日期了

在这里插入图片描述

GatewayFilter Factories(⽹关过滤器⼯⼚)

Predicate决定了请求由哪⼀个路由处理,如果在请求处理前后需要加⼀些逻辑,这就是Filter(过滤器)的作⽤范围了.
Filter分为两种类型:Pre类型和Post类型.
Pre类型过滤器:路由处理之前执⾏(请求 转发到后端服务之前执⾏),在Pre类型过滤器中可以做鉴权,限流等.
Post类型过滤器:请求执⾏完成后,将结果返回给客⼾端之前执⾏.
Spring Cloud Gateway从作⽤范围上,把Filter可分为GatewayFilter和GlobalFilter.
GatewayFilter: 应⽤到单个路由或者⼀个分组的路由上.
GlobalFilter: 应⽤到所有的路由上,也就是对所有的请求⽣效.

GatewayFilter 同Predicate 类似,都是在配置⽂件application.yml 中配置,每个过滤器的逻辑都是固定的.⽐如AddRequestParameterGatewayFilterFactory 只需要在配置⽂件中写AddRequestParameter ,就可以为所有的请求添加⼀个参数,我们先通过⼀个例⼦来演⽰GatewayFilter如何使⽤.
在这里插入图片描述

添加filters,

  • AddRequestParameter=userName,bite
  • 这个就表示给当前路由的所有请求添加请求参数key=userName,value=bite

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
官网

在这里插入图片描述
在这里插入图片描述
AddRequestHeader 为当前请求添加Header
RequestRateLimiter
为当前⽹关的所有请求执⾏限流过滤,如果被限流,默认会响应HTTP 429-Too ManyRequests默认提供了RedisRateLimiter的限流实现,采⽤令牌桶算法实现限流功能.此处不做具体介绍

RemoveResponseHeader
从响应结果删除某个Header

Retry
针对不同的响应进⾏重试.当后端服务不可⽤时,⽹关会根据配置参数来发起重试请求.

filters:
    - name: Retry
      args:
        retries: 3
        statuses: BAD_REQUEST

就是针对不同的状态码进行重试
retries:重试次数,默认为3
status:HTTP请求返回的状态码,针对指定状态码进⾏重试.对应org.springframework.http.HttpStatus
RequestSize
设置允许接收最⼤请求包的⼤⼩.如果请求包⼤⼩超过设置的值,则返回413PayloadToo Large.请求包⼤⼩,单位为字节,默认值为5M
默认过滤器
添加⼀个filter并将其应⽤于所有路由,这个属性需要⼀个filter的列表4

要对全部的路由生效,就要使用默认的过滤器了

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Red, Default-Blue
      - PrefixPath=/httpbin

属性配置内容就是上面的内容
在这里插入图片描述
这个就是针对BAD_REQUEST重试三次,就是错误路径
针对所有的路径
在这里插入图片描述
这个就是返回的状态码为502的时候就重启
我们请求
在这里插入图片描述

发现直接打印了四次,说明请求响应了三次,第一次是正常的请求,失败了在请求三次
在这里插入图片描述
但是状态码并不影响我们界面的展示

GlobalFilter

GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作⽤是相同的. GlobalFilter 会应⽤到所有的路由请求上,全局过滤器通常⽤于实现与安全性,性能监控和⽇志记录等相关的全局功能.
Spring Cloud Gateway内置的全局过滤器也有很多,⽐如:
GatewayMetricsFilter: ⽹关指标,提供监控指标
ForwardRoutingFilter: ⽤于本地forword,请求不转发到下游服务器
LoadBalancerClientFilter: 针对下游服务,实现负载均衡.

官网
在这里插入图片描述
我们用的这个就是全局的路由器,就是GlobalFilter
在这里插入图片描述
GatewayMetricsFilter要先添加依赖

在这里插入图片描述
然后修改这个属性spring.cloud.gateway.metrics.enabled为true
在这里插入图片描述
在这里插入图片描述
默认监控的很少,我们配置一下,就监控很多了

然后开始启动
在这里插入图片描述
这个网关给我们提供了很多链接,都是json格式的

在这里插入图片描述
然后这些链接都是可以访问的

在这里插入图片描述
因为配置了这个所以显示很详细
在这里插入图片描述
因为配置了这个,所以显示很多链接·

⼀个项⽬中,既有GatewayFilter,⼜有GlobalFilter时,执⾏的先后顺序是什么呢?
请求路由后,⽹关会把当前项⽬中的GatewayFilter和GlobalFilter合并到⼀个过滤器链(集合)中,并进⾏排序,依次执⾏过滤器.

每⼀个过滤器都必须指定⼀个int类型的order值,默认值为0,表⽰该过滤的优先级.order值越⼩,优先级越⾼,执⾏顺序越靠前.
Filter通过实现Order接⼝或者添加@Order注解来指定order值.
SpringCloudGateway提供的Filter由Spring指定.⽤⼾也可以⾃定义Filter,由⽤⼾指定.
当过滤器的order值⼀样时,会按照defaultFilter>GatewayFilter>GlobalFilter的顺序执⾏

自定义Filter

Spring Cloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务来⾃定义过滤器,同样⾃定义过滤器也⽀持GatewayFilter和GlobalFilter两种

⾃定义GatewayFilter

⾃定义GatewayFilter,需要去实现对应的接⼝GatewayFilterFactory ,SpringBoot默认帮我们实现的抽象类是AbstractGatewayFilterFactory ,我们可以直接使⽤
在这里插入图片描述
因为过滤器还要有优先级,所以我们设定一个Ordered的优先级
在这里插入图片描述

我们定义一个接收参数的类型
在这里插入图片描述
然后来接收
在这里插入图片描述
然后是实现方法
Component还要有注解,打入spring
然后还要有构造方法,指定接收参数类型
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这样我们的过滤器就实现了,然后就是开始配置了
原来:
在这里插入图片描述
现在:
在这里插入图片描述
注意我们的过滤器名称前面自定义,后面必须是GatewayFilterFactory
所以名字就是Custom
在这里插入图片描述
在这里插入图片描述
和这里是对应的,这个就是自定义过滤器的使用了

然后我们用网关来访问订单服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⾃定义GlobalFilter

GlobalFilter的实现⽐较简单,它不需要额外的配置,只需要实现GlobalFilter接⼝,⾃动会过滤所有的Filter

因为这个是全局的过滤器
在这里插入图片描述

因为这个方法直接返回的就是Mono,所以直接就可以返回了

在这里插入图片描述
然后写pre和post
在这里插入图片描述
因为全局的过滤器直接作用于全局路由,所以不用配置的

在这里插入图片描述
所以我们知道了,同样的优先级的情况下,执行的优先是GatewayFilter

服务部署

在这里插入图片描述
没什么好配置的
直接打包
在这里插入图片描述
点这个,对集体打包,打出多个jar包

在这里插入图片描述

但是这个jar包很小,是因为没有打进来依赖,只打进来了代码

我们给gateway项目打进一个maven打包的插件

在这里插入图片描述
在这里插入图片描述
然后上传三个jar包order,product,gateway
因为product-api不是一个服务,所以不用上传
它是是作为依赖进去的
在这里插入图片描述

nohup java -jar gateway-1.0-SNAPSHOT.jar > logs/gateway.log &

nohup java -jar order-service-1.0-SNAPSHOT.jar > logs/order.log &

nohup java -jar product-service-1.0-SNAPSHOT.jar > logs/product.log &

我是两核两G的,启动多个服务的时候就会比较卡

分布式服务部署

部署介绍

在这里插入图片描述
分布式部署,就是部署到不同的机器上面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一个机器配置好的话,就可以配置网关,nacos,mysql

服务器1
MySQL,Nacos
服务器2
产品服务实例1,订单服务实例1
服务器3
产品服务实例2,订单服务实例2
服务器4
⽹关服务

Mysql安装

apt list | grep “mysql-server”

sudo apt install mysql-server
sudo systemctl status mysql检查状态

sudo mysql_secure_installation安装安全设置,一直Y,2,2是密码必须包含大小写和特殊字符
sudo mysql

alter user ‘root’@‘localhost’ identified with mysql_native_password by “bit@yyds66”
然后数据初始化

MySQL默认情况下,只允许本地连接,即localhost,如果其他服务器需要连接到MySQL,需要MySQL对这个服务器授权

意思就是机器2和机器3要访问机器1的mysql,mysql要授权才可以

grant 权限 on 数据库对象 to ⽤⼾
使⽤下⾯SQL,创建⽤⼾,并授权

-- 创建⽤⼾bite, 并设置密码, 此步可省略
CREATE USER 'bite'@'%' IDENTIFIED BY 'BITE@yyds.666';
-- 对bite⽤⼾授权
 -- *.* 表⽰所有库的所有表, 也可以指定库和表
 -- %表⽰IP, %表⽰允许所有IP所有的机器访问, 也可以指定IP机器 
GRANT ALL ON *.* TO 'bite'@'%';
-- 让修改⽣效
FLUSH PRIVILEGES;

GRANT ALL是开放所有的权限,*.*表示对所有的库和表

  1. 修改bind-address
    修改⽂件路径:/etc/mysql/mysql.conf.d/mysqld.cnf
    把bind-address =127.0.0.1改为bind-address =0.0.0.0
    #bind-address = 127.0.0.1
    bind-address = 0.0.0.0

vi /etc/mysql/mysql.conf.d/mysqld.cnf

原:
在这里插入图片描述
现在:
在这里插入图片描述
3. 重启MySQL服务器
sudo systemctl restart mysql

在这里插入图片描述
这样不同的机器就要开放不同的端口号—》服务器控制台来开放

  1. 开放3306端⼝号
  2. 测试授权结果
    使⽤CMD客⼾端,连接服务器MySQL,如果可以正确连接,则授权成功

把110.41.51.65改成⾃⼰服务器的IP -u改成设置的账号名 -p后是对应的密码

mysql -h110.41.51.65 -P3306 -ubite -pBITE@yyds.666
在这里插入图片描述
这样就访问到了,表示授权成功了

安装nacos

安装这个之前先安装jdk
sudo apt update更新软件包
apt install openjdk-17-jdk
java -version

然后我们放入nacos
cd /usr/local/src/
在这里插入图片描述
直接拖过来
unzip nacos-server-2.2.3.zip
然后修改端口号
cd naocs/
cd conf
vim application.properties
在这里插入图片描述
然后启动程序
cd bin
bash startup.sh -m standalone
这样第一台机器就完成了

网关&订单&商品部署

这几个都是java服务的部署
在这里插入图片描述
在这里插入图片描述
然后就是分别安装jdk
在这里插入图片描述
在这里插入图片描述

这个就是问我们安装成功之后,要不要重启这个机器的服务
不需要的话,按esc

在这里插入图片描述
yml下的配置都不需要变

prod下的yml就要变了
原:
在这里插入图片描述
127因为原来mysql与order在同一台机器,所以没有问题
所以order就要改mysql的url,name,密码

product
在这里插入图片描述
product的bootstrap的nacos地址没有变化
但是我们的naocs没有配置

在这里插入图片描述
product的controller使用了naocs的配置,所以nacos对应要配置
prod还是要改mysql
在这里插入图片描述
就这两个问题

在这里插入图片描述
就在这里配置
在这里插入图片描述
在这里插入图片描述
不配置的话,product就启动不成功
但是mysql没有配置都启动成功了

网关

第三个机器
现在部署网关服务
还是要安装jdk

拖动记得安装rz
apt install lrzsz

在这里插入图片描述
这样就表面访问成功了

通过网关来访问order
10030/order/1
在这里插入图片描述
在这里插入图片描述
看到日志,数据库链接拒绝
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
然后改一下数据库的链接信息
在这里插入图片描述
授权就是端口开放没有
然后重新打包
记得杀掉原来的进程
然后重启服务
在这里插入图片描述
这样好像成功了

在这里插入图片描述
但是我们这个网关的ip地址不对呢
在这里插入图片描述
其他服务的ip也不对
因为一个服务器有内网ip和外网ip,这个naocs注册的是内网的ip
所以gateway路由到nacos的时候,获取到的是内网的ip–》只能局域网内部访问
如果不在一个局域网里面,访问是会失败的,需要改成外网ip
我们通过spring.cloud.nacos.discovery.ip来设置外网ip

就是可以在启动服务的时候指定

nohup java -jar xx.jar --spring.cloud.nacos.discovery.ip=自己ip > logs/xx.log &
在这里插入图片描述
在这里插入图片描述
这样ip就变了,别人可以访问它了
然后就是同样的方式启动product,gateway
在这里插入图片描述
在这里插入图片描述
然后是可以访问的

订单2&商品2部署

在这里插入图片描述

现在机器1,3,4都已经完成了,我们现在开始完成机器2
机器2和机器1差不多
先安装jdk
然后把jar拖进来,上面都已经改好了的
在这里插入图片描述
在这里插入图片描述
这样就有两个order了

在这里插入图片描述
product也是一样的

总结

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

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

相关文章

Docker部署MySQL大小写不敏感配置与数据迁移实战20250409

Docker部署MySQL大小写不敏感配置与数据迁移实战 🧭 引言 在企业实际应用中,尤其是使用Java、Hibernate等框架开发的系统,MySQL默认的大小写敏感特性容易引发各种兼容性问题。特别是在Linux系统中部署Docker版MySQL时,默认行为可…

面试题之网络相关

最近开始面试了,410面试了一家公司 问了我几个网络相关的问题,我都不会!!现在来恶补一下,整理到博客中,好难记啊,虽然整理下来了。在这里先祝愿大家在现有公司好好沉淀,定位好自己的…

[春秋云镜] Tsclient仿真场景

文章目录 靶标介绍:外网mssql弱口令SweetPotato提权上线CSCS注入在线用户进程上线 内网chisel搭建代理密码喷洒攻击映像劫持 -- 放大镜提权krbrelayup提权Dcsync 参考文章 考点: mssql弱口令SweetPotato提权CS注入在线用户进程上线共享文件CS不出网转发上线密码喷洒…

数据集 handpose_x_plus 3D RGB 三维手势 - 手工绘画 场景 draw picture

数据集 handpose 相关项目地址:https://github.com/XIAN-HHappy/handpose_x_plus 样例数据下载地址:数据集handpose-x-plus3DRGB三维手势-手工绘画场景drawpicture资源-CSDN文库

deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目

首先去开源网站下载:Release v1.21.2 deskflow/deskflow 两台电脑都要下载这个文件 下载好后直接打开找到你想要的exe desflow.exe 然后你打开他,将两台电脑的TLS都关掉 下面步骤两台电脑都要完成: 电脑点开edit-》preferences 把这个取…

详解MYSQL表空间

目录 表空间文件 表空间文件结构 行格式 Compact 行格式 变长字段列表 NULL值列表 记录头信息 列数据 溢出页 数据页 当我们使用MYSQL存储数据时,数据是如何被组织起来的?索引又是如何组织的?在本文我们将会解答这些问题。 表空间文…

[Windows] 音速启动 1.0.0.0

[Windows] 音速启动 链接:https://pan.xunlei.com/s/VONiGZhtsxpPzze0lDIH-mR9A1?pwdxu7f# [Windows] 音速启动 1.0.0.0 音速启动是一款桌面管理软件,以仿真QQ界面的形式结合桌面工具的特点,应用于软件文件夹网址的快捷操作。

Hyper-V 虚拟机配置静态IP并且映射到局域网使用

环境 win11hyper-v麒麟v10 配置 编辑文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0文件内容 GATEWAY 需要参考网络中配置的网关地址 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes …

操作系统基础:06 操作系统历史

我们前面已经讲过了操作系统的基本轮廓、启动过程以及系统调用等相关内容,就如同揭开了钢琴的盖子,对操作系统有了初步的表面认识。从现在起,我们要更深入地剖析操作系统,就像分解钢琴一样,探究其各个部分的构成、原理…

【大模型微调】如何解决llamaFactory微调效果与vllm部署效果不一致如何解决

以下个人没整理太全 一、生成式语言模型的对话模板介绍 使用Qwen/Qwen1.5-0.5B-Chat训练 对话模板不一样。回答的内容就会不一样。 我们可以看到例如qwen模型的tokenizer_config.json文件,就可以看到对话模板,一般同系列的模型,模板基本都…

【2025最新】windows本地部署LightRAG,完成neo4j知识图谱保存

之前在服务器部署neo4j失败,无奈只能在本地部署,导致后期所有使用的知识图谱数据都存在本地,这里为了节省时间,先在本地安装LigthRAG完成整个实验流程,后续在学习各种服务器部署和端口调用。从基础和简单的部分先做起来…

14、nRF52xx蓝牙学习(串口 UART 和 UARTE 外设应用)

一、UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用了通信接口,在 nRF52 芯片中, UART 具有以下特点: ● 全双工操作 ● 自动流控 ● 奇偶校验产生第 9 位数据 串口 UART 的数据发送与接收流程 : ◆硬件配置…

DeepSeek轻松入门教程——从入门到精通

大家好,我是吾鳴。 今天吾鳴要给大家分享一份DeepSeek小白轻松入门指导手册——《DeepSeek 15天指导手册,从入门到精通》。指导手册分为基础入门对话篇、效率飞跃篇、场景实战篇、高手进化篇等,按照指导手册操作,DeepSeek从入门到…

Vue2 老项目升级 Vue3 深度解析教程

Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性,如性能提升、组合式 API、更好的 TypeScript 支持等,将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程,涵盖升级前的准备工作、具体升级步骤…

WXJ196微机小电流接地选线装置使用简单方便无需维护

WXJ196微机小电流接地选线装置,能在系统发生单相接地时,准确、迅速地选出接地线路母 线。使用简单方便,无需维护,可根据用户需要将相关信息通过通信接口传给上级监控系统, 适用于无人值守变电站。 2 功能及特点 全新的…

Java第四节:idea在debug模式夏改变变量的值

作者往期文章 Java第一节:debug如何调试程序(附带源代码)-CSDN博客 Java第二节:debug如何调试栈帧链(附带源代码)-CSDN博客 Java第三节:新手如何用idea创建java项目-CSDN博客 步骤一 在需要修改…

门极驱动器DRV8353M设计(二)

目录 13.3.4.4 MOSFET VDS 感测 (SPI Only) 13.3.5 Gate Driver保护回路 13.3.5.1 VM 电源和 VDRAIN 欠压锁定 (UVLO) 13.3.5.2 VCP 电荷泵和 VGLS 稳压器欠压锁定 (GDUV) 13.3.5.3 MOSFET VDS过流保护 (VDS_OCP) 13.3.5.3.1 VDS Latched Shutdown (OCP_MODE 00b) 13.…

学点概率论,打破认识误区

概率论是统计分析和机器学习的核心。掌握概率论对于理解和开发稳健的模型至关重要,因为数据科学家需要掌握概率论。本博客将带您了解概率论中的关键概念,从集合论的基础知识到高级贝叶斯推理,并提供详细的解释和实际示例。 目录 简介 基本集合…

NVIDIA AI Aerial

NVIDIA AI Aerial 适用于无线研发的 NVIDIA AI Aerial 基础模组Aerial CUDA 加速 RANAerial Omniverse 数字孪生Aerial AI 无线电框架 用例构建商业 5G 网络加速 5G生成式 AI 和 5G 数据中心 加速 6G 研究基于云的工具 优势100% 软件定义通过部署在数字孪生中进行测试6G 标准化…

OpenCV 关键点定位

一、Opencv关键点定位介绍 关键点定位在计算机视觉领域占据着核心地位,它能够精准识别图像里物体的关键特征点。OpenCV 作为功能强大的计算机视觉库,提供了多种实用的关键点定位方法。本文将详细阐述关键点定位的基本原理,深入探讨 OpenCV 中…