Gateway-网关-分布式服务部署
前言
什么是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: Retryargs:retries: 3statuses: 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是开放所有的权限,*.*表示对所有的库和表
- 修改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
这样不同的机器就要开放不同的端口号—》服务器控制台来开放
- 开放3306端⼝号
- 测试授权结果
使⽤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也是一样的
总结
相关文章:
Gateway-网关-分布式服务部署
前言 什么是API⽹关 API⽹关(简称⽹关)也是⼀个服务, 通常是后端服务的唯⼀⼊⼝. 它的定义类似设计模式中的Facade模式(⻔⾯模式, 也称外观模式). 它就类似整个微服务架构的⻔⾯, 所有的外部客⼾端访问, 都需要经过它来进⾏调度和过滤. 常⻅⽹关实现 Spring Cloud Gateway&a…...
c++STL——string学习的模拟实现
文章目录 string的介绍学习的意义auto关键字和范围forstring中的常用接口构造和析构对string得容量进行操作string的访问迭代器(Iterators):运算符[ ]重载 string类的修改操作非成员函数 string的模拟实现不同平台下的实现注意事项模拟实现部分所有的模拟实现函数预…...
【寻找Linux的奥秘】第四章:基础开发工具(下)
请君浏览 前言1. 自动化构建1.1 背景1.2 基本语法1.3 make的运行原理1.4通用的makefile 2. 牛刀小试--Linux第一个小程序2.1 回车与换行2.2 行缓冲区2.3 倒计时小程序2.4 进度条小程序原理代码 3. 版本控制器git3.1 认识3.2 git的使用三板斧 3.3 其他 4. 调试器gdb/cgdb4.1 了解…...
RK3588上Linux系统编译C/C++ Demo时出现BUG:The C/CXX compiler identification is unknown
BUG的解决思路 BUG描述:解决方法:首先最重要的一步:第二步:正确设置gcc和g的路径方法一:使用本地系统中安装的 aarch64-linux-gnu-gcc 和 aarch64-linux-gnu-g方法二:下载使用官方指定的交叉编译工具方法三…...
记录一次/usr/bin/ld: 找不到 -lOpenSSL::SSL
1、cmake 报错内容如下: /usr/bin/ld: 找不到 -lOpenSSL::SSL /usr/bin/ld: 找不到 -lOpenSSL::Crypto2、一开始以为库没有正确安装 sudo yum install openssl-devel然后查看openssl 结果还是报错! 3、尝试卸载安装都不管用,网上搜了好多…...
[16届蓝桥杯 2025 c++省 B] 水质检测
思路:分类讨论,从左到右枚举,判断当前的河床和下一个河床的距离是第一行更近还是第二行更近还是都一样近,分成三类编写代码即可 #include<iostream> using namespace std; int main(){string s1,s2;cin>>s1>>…...
基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析
引言:工程图纸自动化处理的技术革新 在机械设计领域,CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6pycatia技术栈,提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案…...
四、Appium Inspector
一、介绍 Appium Inspector 是一个用于移动应用自动化测试的图形化工具,主要用于检查和交互应用的 UI 元素,帮助生成和调试自动化测试脚本。类似于浏览器的F12(开发者工具),Appium Inspector 的主要作用包括: 1.检查 UI 元素 …...
玩转Docker | 使用Docker部署MicroBin粘贴板
玩转Docker | 使用Docker部署MicroBin粘贴板 前言一、MicroBin介绍MicroBin 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署MicroBin服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问MicroBin服务访问MicroBin首页登录管理后台…...
BGP分解实验·23——BGP选路原则之路由器标识
在选路原则需要用到Router-ID做选路决策时,其对等体Router-ID较小的路由将被优选;其中,当路由被反射时,包含起源器ID属性时,该属性将代替router-id做比较。 实验拓扑如下: 实验通过调整路由器R1和R2的rout…...
MQTT:单片机中MQTTClient-C移植定时器功能
接下来我们完善MQTTTimer.c和MQTTTimer.h两个功能 MQTTTimer.h void TimerInit(Timer* timer); 功能:此函数用于对 Timer 结构体进行初始化。在 MQTT 客户端里,定时器被用于追踪各种操作的时间,像连接超时、心跳包发送间隔等。初始化操作会…...
可拖动的关系图谱原型案例
关系图谱是一种以图结构形式组织和呈现实体间复杂关联关系的可视化数据模型。它通过节点和线构建多维度网络,能直观揭示隐藏的群体特征和传播路径。在社交网络分析、智能推荐系统、知识图谱构建等领域广泛应用。 软件版本:Axure RP 9 作品类型…...
CST1016.基于Spring Boot+Vue高校竞赛管理系统
计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统,基于 DeepSeek Spring AI Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 系统共有两类用户,分别是学生用户和管理员用户&a…...
从三次方程到复平面:复数概念的奇妙演进(二)
注:本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第二篇。 生料,不同的文章不同的点。 机翻,未校。 History of Complex Numbers 复数的历史 The problem of complex numbers dates back to …...
PCL 点云投影至指定平面
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前的文章中介绍过一个点在平面上的投影坐标,其主要的思路就是利用投影垂线与平面法向量平行的特性,通过推导出的投影公式可以很容易的计算出在某点在某一平面内的投影点。因此只需要重复该过程就可以将整个点云…...
批量将文件名称、文件路径、文件扩展名提取到 Excel 清单
在数字化时代,文件的高效管理至关重要。当我们想要对磁盘中的文件进行整理,想要获取多个文件夹中的文件和路径信息,就需要现将这些文件的名称及路径信息提取出来。本文将介绍一种实用的批量提取技术,帮助用户优化文件管理流程&…...
KWDB创作者计划—KWDB场景创新:多模态数据融合与边缘智能的产业实践
引言:AIoT时代的数据基座重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年,传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB(KaiwuDB Community Edition)通过…...
计算机系统概论
1. 计算机系统的基本组成 计算机系统由 硬件系统 和 软件系统 两大部分协同工作: 硬件系统: 基于冯诺依曼体系结构(存储程序原理),包含五大核心部件: 运算器(ALU):执行算…...
Android Cmake构建的项目,需不需要配置指定ndk及版本
在 CMake 构建的 Android 项目中,是否需要显式配置 NDK 及其版本,取决于项目的具体需求和环境。以下是详细分析和建议: 1. 是否需要显式配置 NDK 及版本? 情况 1:Android Studio 自动管理 NDK(推荐&#x…...
国内AI大模型卷到什么程度了?
目录 1.开源大模型更有前景吗? 2.参数越大真的越牛逼吗? 3.榜单排名有意义吗? 大家好这里是AIWritePaper官方账号,官网👉AIWritePaper~ 大模型开源更有前景? 参数越大真的越牛逼吗? 榜单排…...
【HDFS入门】Hadoop 2.0+ HDFS核心架构深度解析:高可用设计揭秘
目录 1 HDFS核心架构概述 2 高可用设计背景 3HDFS核心组件 3.1 Active与Standby NameNode 3.2 JournalNode 3.3 ZKFailoverController(ZKFC) 3.4 DataNode 4 高可用设计的工作流程 写入阶段: 元数据同步: 健康监测&…...
RabbitMQ安装
RabbitMQ安装 Ubuntu环境安装 一、安装Erlang #更新软件包 sudo apt-get update #安装erlang sudo apt-get install erlang 二、安装RabbitMQ #更新软件包 sudo apt-get update #安装rabbitmq sudo apt-get install rabbitmq-server #确认安装结果 systemctl status rabbitmq-…...
2022 CCPC Henan Provincial Collegiate Programming Contest K 复合函数
补题链接 看网上题解很少,来写一份,这题个人觉得思维难度不是特别大,难度主要在于代码准确度,首先将问题转化成 x x x 向 f ( x ) f(x) f(x) 连边,这一步转化应该是比较容易想到的,通过手模样例,会有类…...
Linux : 多线程互斥
目录 一 前言 二 线程互斥 三 Mutex互斥量 1. 定义一个锁(造锁) 2. 初始化锁 3. 上锁 4. 解锁 5. 摧毁锁 四 锁的使用 五 锁的宏初始化 六 锁的原理 1.如何看待锁? 2. 如何理解加锁和解锁的本质 七 c封装互斥锁 八 可重入…...
【数学建模】佳点集(Good Point Set)在智能优化算法中的应用与实现
佳点集(Good Point Set)在智能优化算法中的应用与实现 文章目录 佳点集(Good Point Set)在智能优化算法中的应用与实现1. 佳点集概述2. 佳点集的数学原理3. 佳点集在智能优化算法中的应用3.1 改进麻雀搜索算法(SSA)3.2 改进量子粒子群优化算法(QPSO)3.3 自适应分组差分变异狼群…...
redis linux 安装简单教程(redis 3.0.4)
redis.3.0.4.tar.gz 下载地址 链接: https://pan.baidu.com/s/19VAcrA6XS4mIesH6e5Jftg 提取码: bn2r (1)以安装目录:/home/zsl (2)将redis-3.0.4.tar.gz 拷贝到/home/zsl (3)tar xzvf redis-3.…...
探秘 Python 网络编程:构建简单聊天服务器
在计算机网络的世界里,网络编程是实现不同设备之间通信的关键技术。Python 凭借其简洁的语法和强大的库支持,在网络编程领域有着广泛的应用。无论是构建简单的聊天服务器,还是开发复杂的网络应用,Python 都能轻松胜任。 1 理论基础…...
debian转移根目录
如何在 BIOS 启动的 Debian 虚拟机中将根目录转移到 /dev/sda 设备上?本文将从硬盘分区,根目录复制,重新启动等几个方面介绍。 硬盘分区 1.检查磁盘:查看当前的磁盘和分区情况,确认新添加的磁盘设备名称。 parted -…...
vue3 element-plus表单验证
第一准备一个表单 form.vue <template><div><el-form><el-form-item label"姓名" prop"name"><el-input v-model"data.name" placeholder"请输入姓名"></el-input></el-form-item></e…...
Deepseek IP-Adapter与InstantID的区别
IP-Adapter与InstantID均为基于扩散模型的图像生成控制技术,但两者的算法设计目标、核心模块及应用场景存在显著差异。以下从技术架构、特征处理、条件控制等维度对比两者的差异: 1. 核心设计目标 IP-Adapter 由腾讯团队提出(2023年8月&…...
OSI 七层模型与 TCP/IP 协议栈详解
OSI 七层模型与 TCP/IP 协议栈详解 网络协议模型是理解计算机网络和通信的基础,而 OSI 七层模型和 TCP/IP 协议栈是最常见的两种网络通信模型。虽然这两者有些不同,但它们都提供了一种分层的结构,帮助我们理解和设计网络通信。本文将详细介绍…...
synchronize 或者lock 锁常见的使用场景
在 Java 多线程编程中,synchronized 和 Lock(如 ReentrantLock)是两种常见的线程同步机制。以下是它们的核心区别和典型使用场景,结合代码示例说明: 一、synchronized 的常见场景 1. 简单的临界区保护 public class …...
Redis之缓存更新策略
缓存更新策略 文章目录 缓存更新策略一、策略对比二、常见的缓存更新策略三、如何选择策略四、实际应用示例五、使用 Cache-Aside TTL 的方式,实现缓存商铺信息详情1.引入StringRedisTemplate2.将查询商铺信息加入缓存3.更新商铺信息时移除缓存总结 六、注意事项 一…...
【操作系统学习篇-Linux】进程
1. 什么是进程 课本概念:程序的一个执行实例,正在执行的程序等 内核观点:担当分配系统资源(CPU时间,内存)的实体。 如果你就看这个来理解进程,那么恭喜你,作为初学者,你…...
Docker 前瞻
一、namespace 指令 1.1 dd 命令 dd 命令用于读取、转换并输出数据。 dd 命令可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。 语法 dd option if 文件名:输入文件名,默认为标准输入…...
【maxENT】最大熵模型(Maximum Entropy Model)R语言实现
文章目录 一、相关package介绍1.1 dismo 包1.2 raster包1.3 常见问题与解决 二、代码示例 🟢🟠先看:【maxENT】最大熵模型(Maximum Entropy Model)介绍与使用(maxENT软件) ASCII文件太大&#…...
高负载WEB服务器--Tomcat
高负载WEB服务器–Tomcat Tomcat介绍 Tomcat 是一个开源的轻量级应用服务器,在 Java Web 应用开发中被广泛使用。 发展历程:Tomcat 最初由 Sun Microsystems 开发,后来成为 Apache 软件基金会的一个项目。它的发展与 Java 技术的发展密切相…...
分页查询列表每页1000条的优化
项目中有一个客户列表,要求每页显示1000条,并且字段很多,接口返回大概要10秒钟,进行优化. 原本逻辑:使用mybatisplus构建查询条件,分页查询客户表,查出数据库DO对象,然后for循环转化成回显的VO对象.在转化的过程中出现了查库代码,导致当每页条数1000时,每一个客户转化都需要查询…...
深入浅出一下Python面向对象编程的核心概念与实践应用
本篇技术博文摘要 🌟 本文系统讲解了Python面向对象编程的核心概念与实践应用。通过电商系统用户订单模拟、动态权限账户系统等案例,深入剖析了类与对象、属性方法、实例方法等基础要素。重点解析了__init__构造方法、__str__对象描述、__lt__比较运算符…...
2025阿里云AI 应用-AI Agent 开发新范式-MCP最佳实践-78页.pptx
2025阿里云AI 应用-AI Agent 开发新范式-MCP最佳实践,包含以下内容: 1、AI 应用架构新范式 2、云原生API网关介绍 3、云原生API网关底座核心优势 4、流量网关最佳实践 5、AI 网关代理 LLM 最佳实践 6、MCP网关最佳实践 7、MSE Nacos MCP Server 注册中心…...
github进阶使用教程
目录索引 一、基本内容 repository fork star codespaces issue 在一个仓库创建话题讨论,可以由仓库主人选择开始和结束话题的讨论 pull request(也称 pr) 协同其他仓库开发,请求仓库主人拉取自己的代码合并到仓库的主分支&…...
【C++】 —— 笔试刷题day_16
刷题_day16,继续加油啊 一、字符串替换 题目解析 这道题是一道简单的字符题目,题目给我们一个字符串A,和n表示A字符串的长度,再给出一个字符数组arg,m表示arg中是数据个数。 然我们在字符串A中找到%s然后替换成arg中的…...
5.3 GitHub订阅系统核心架构解密:高并发设计与SQLite优化实战
GitHub Sentinel 分析报告功能实现:订阅管理核心逻辑解析 关键词:GitHub API 订阅管理, SQLite 数据库设计, RESTful API 开发, 原子操作封装, 异常处理机制 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过清晰的接口隔离实现高内聚低耦合: #mermaid-svg-bW…...
P5738 【深基7.例4】歌唱比赛
P5738 【深基7.例4】歌唱比赛 题目描述 n ( n ≤ 100 ) n(n\le 100) n(n≤100) 名同学参加歌唱比赛,并接受 m ( m ≤ 20 ) m(m\le 20) m(m≤20) 名评委的评分,评分范围是 0 0 0 到 10 10 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 …...
从三次方程到复平面:复数概念的奇妙演进(三)
注:本文为 “复数 | 历史 / 演进” 相关文章。 因 csdn 篇幅限制分篇连载,此为第三篇。 生料,不同的文章不同的点。 机翻,未校。 Complex Numbers History: Complex numbers were first introduced by G. Cardano (1501-1576)…...
2025年七星棋牌跨平台完整源码解析(200+地方子游戏+APP+H5+小程序支持,附服务器镜像导入思路)
目前市面上成熟的棋牌游戏源码很多,但能做到平台全覆盖、地方玩法丰富、交付方式标准化的系统却不多。今天这套七星棋牌2023完整源码具备安卓/iOS/H5/微信小程序端四端互通能力,附带200多款地方子游戏,还配备了后台管理与自动热更系统&#x…...
从三次方程到复平面:复数概念的奇妙演进(四)
注:本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第四篇。 生料,不同的文章不同的点。 机翻,未校。 Complex number and its discovery history 复数及其发现历史 Wenhao Chen, †, Dazheng …...
UE5角色状态机中跳跃落地移动衔接问题
UE5系列文章目录 文章目录 UE5系列文章目录前言一、状态机设置二、主要蓝图 前言 先说说遇到的问题,在我按空格键跳跃落地以后,角色落地再按WSAD键移动就出现了画面中角色抽搐的情况 一、状态机设置 在Unreal Engine 5中创建角色时,处理跳…...
25软考中级*高项网课+历年真题+笔记+电子书+刷题【计算机软考】
两个月逆袭25年软考程序员?这份高效备考指南请收好 25软考中级*高项网课download 📂 软考中级科目备考资料介绍 ✅ 【01】2025 年软件测评师 聚焦软件测试全流程,涵盖 需求分析、测试设计、用例编写、缺陷管理 等核心技能。 📘 备…...
C++STL——容器-list(含模拟实现,即底层原理)(含迭代器失效问题)(所有你不理解的问题,这里都有解答,最详细)
目录 1.迭代器的分类 2.list的使用 2.1 list的构造 2.2 list iterator 2.3 list capacity 2.4 list element access 编辑 2.5 list modifiers 编辑2.5.1 list插入和删除 2.5.2 insert /erase 2.5.3 resize/swap/clear 编辑 2.6 list的一些其他接口…...