当前位置: 首页 > news >正文

【Nginx08】Nginx学习:HTTP核心模块(五)长连接与连接处理

Nginx学习:HTTP核心模块(五)长连接与连接处理

HTTP 基础知识大家掌握的怎么样呀?对于长连接这一块的内容应该也不是什么新鲜东西了吧。毕竟 HTTP1.1 都已经发布这么久了。今天主要来看的就是长连接相关的配置,另外还会介绍几个和连接有关的内容。同时,今天的内容除了 HTTP 外,还需要一点 TCP 的知识。没办法,毕竟 Ngxin 本身就是一个网络代理服务器软件,离不开的就是各种网络相关的知识。相信大家肯定没问题的,毕竟很早前在短视频中就说过,基础能比我差的程序员估计在全国范围内都找不到几个了。

但是不要脸和硬着头皮啃的水平咱还是有的,因此,如果有遗漏或错误的地方,也恳请各位大佬在评论区指出。

好了,不多废话了,进入主题吧。

长连接

关于长连接的知识,属于 HTTP 的基础知识了,咱们不多说,不了解的小伙伴可以去查阅下相关资料。简单来说,一次 HTTP 连接,就要经历 TCP 的三次握手四次挥手,毕竟它是处于网络的第七层,同时也是基于第四层的 TCP 来实现的。如果请求很多,需要不停地建立 TCP 连接,效率明显下降。而长连接则是一次连接后保持这个连接一段时间,如果有其它的请求就可以复用这条连接,从而减少网络连接开销,提升效率。比如很多门户或者电商站,一打开就是一大堆的 JS、图片之类的请求。如果每一个都要单独建立连接,势必会影响页面的整体打开速度。

同时,在进行反向代理的时候,也可以启用长连接功能,减少后端代理的连接次数。反向代理相关的配置我们在后面学习反向代理相关的内容时再说,现在学习的主要是针对 http、server、location 模块的长连接配置。

在 Nginx 中,有完整的长连接配置。

keepalive_disable

指定哪些浏览器不使用长连接功能,或者说是针对行为异常的浏览器关闭长连接功能。

keepalive_disable none | browser ...;

默认 msie6 , 值为 msie6 表示在遇到POST请求时,关闭与老版本 MSIE 浏览器建立长连接。 值为 safari 表示在遇到 Mac OS X 和类 Mac OS X 操作系统下的 Safari 浏览器和类 Safari 浏览器时,不与浏览器建立长连接。 值为none表示为所有浏览器开启长连接功能。

在 nginx 1.1.18 版本及以前,safari 将匹配所有操作系统上的 Safari 和类 Safari 浏览器,并默认不与这些浏览器建立长连接。

我本地是 Mac 电脑,因此,直接设置一个 safari 的配置。

http {……keepalive_disable safari;……
}

配置完成后,使用 Safari 和 Chrome 分别测试,可以看到 Safari 的 Response Header 中的 Connection 的值变成了 close ,而 Chrome 还是正常的 keep-alive 。

keepalive_requests

设置通过一个长连接可以处理的最大请求数。 请求数超过此值,长连接将关闭。

keepalive_requests number;

在版本1.19.10之前,默认值为100,现在默认值是 1000 。定期关闭连接对于释放每个连接的内存分配是必要的。因此,使用过高的最大请求数可能会导致内存使用过多,因此不建议使用。

我们直接配置一个,将它的 number 设置为 2 ,然后建立一个 html 页面以及一堆空的 js 文件。

// nginx.conf
http {……keepalive_requests 2;……
}// testkeepalive1.html
~
~
"testkeepalive1.html" 23L, 461C                                                                                                                                                  20,19-26      All
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>This is testkeepalive1.html<script src="js1/1.js"></script>
<script src="js1/2.js"></script>
<script src="js1/3.js"></script>
<script src="js1/4.js"></script>
<script src="js1/5.js"></script></body>
</html>

好了,现在访问 http://192.168.56.88/testkeepalive1.html 页面,查看所有的请求,目前我们算上这个 html 页面,一共会有 6 个请求。你会发现有的请求的 Connection 会变成 Close ,也就是说一条长连接在请求数量达到设置的值之后就断了,然后又是一个新的请求连接。

一般情况下不需要刻意设置这个值,上面文档的说明中也说过了使用过高的最大请求数可能会导致内存使用过多,正常来说 1000 已经相当够用了,即使是淘宝这样的网站,首页上的请求数也没多少,毕竟大家还会合并请求及图片来进行连接的优化。

keepalive_time

限制通过一个保持活动连接处理请求的最长时间。

keepalive_time time;

达到此时间后,连接在后续请求处理后关闭,默认值是 1h 。它是 Nginx 1.19.10 之后新出的配置,咱们就不做详细的测试了,如果想要测试的同学,可以根据下面的 keepalive_timeout 测试,然后访问一个动态能够 sleep 的请求路径,让 sleep 时间超过这个配置的时间,接着使用一个静态页面来定时发送 ajax 请求查看连接复用情况。比较麻烦,日常估计使用的小伙伴也不会很多,它默认的 1h 估计很多耗时连接也不可能去做这么长时间的操作。

keepalive_timeout

设置客户端的长连接在服务器端保持的最长时间

keepalive_timeout timeout [header_timeout];

在 timeout 设置的时间内,客户端未发起新请求,则长连接关闭。第二个参数为可选项,设置 “Keep-Alive: timeout=time” 响应头的值,可以为这两个参数设置不同的值。“Keep-Alive: timeout=time” 响应头可以被 Mozilla 和 Konqueror 浏览器识别和处理,MSIE 浏览器在大约 60 秒后会关闭长连接。

默认安装完成之后的 Nignx 配置中,这个选项被设置为 65 。如果发现 Nginx 占用服务器的 CPU 特别高,可以尝试调低这个时间,或者直接设置成 0 ,设置成 0 后将整个关闭 keepalive 长连接的功能。

现在我们一起来进行测试,首先添加如下配置。

http {……keepalive_timeout  0;……
}

重载配置后使用一个 Linux 命令查看连接情况。

[root@localhost html]# netstat -nat|grep -i "80"
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN

看来目前还没有连接过来,我们可以访问之前的 /testkeepalive1.html ,马上就能看到有新的连接建立了。

[root@localhost html]# netstat -nat|grep -i "80"
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 192.168.56.88:80        192.168.56.1:49816      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49811      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49810      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49814      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49805      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49812      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:49813      TIME_WAIT

因为我们将 keepalive_timeout 设置成 0 了,所以现在有 7 条连接建立成功,注意,我使用的是 Chrome ,所以还会自带一个 /favicon.ico 请求,加上前面的 html 以及 5 个 js ,正好 7 个连接。如果速度快点过来查看的话,可以看到连接是 ESTABLISHED 状态,表示连接正在使用,TIME_WAIT 表示连接在等待中。

接下来,我们修改 keepalive_timeout 为 5 ,意思就是 5 秒,如果没有使用,就会用新的连接。现在再次访问,会看到依然建立了 5 个连接,毕竟我们相当于同时请求本地的虚拟机,速度还是够快的,只有两个连接被复用了,其它的还是建立了连接。另外,默认 Chrome 可以同时建立 6 个连接,你可以测试再多加几个 js ,然后试试,最多它就只能建立 6 个连接,前面的 js 没有加载完,后面的就会等待加载,这里和长连接无关,即使不使用长连接,也会在 6 个连接中的某一个连接释放之后才会建立新的连接。

[root@localhost html]# netstat -nat|grep -i "80"
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 192.168.56.88:80        192.168.56.1:52469      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52471      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52470      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52472      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52465      ESTABLISHED

在 5 秒内,刷新页面,不会有新的连接出现,但是等待 5 秒后,再次刷新,就会发现又有新的连接建立了。

[root@localhost html]# netstat -nat|grep -i "80"
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 192.168.56.88:80        192.168.56.1:52469      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:52471      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:52692      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52691      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52690      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52686      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52693      ESTABLISHED
tcp        0      0 192.168.56.88:80        192.168.56.1:52470      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:52472      TIME_WAIT
tcp        0      0 192.168.56.88:80        192.168.56.1:52465      TIME_WAIT

再等待一段时间后,所有连接全部关闭。这里关闭连接的时间是操作系统决定的,与操作系统被动断开 TCP 连接的配置有关,主要是 net.ipv4.tcp_tw_reuse 这个配置,大家可以自己查阅相关的资料。正常情况下是在 TIME_WAIT 状态后等待大约 2 分钟,最低可以修改为 1 分钟,通过下面的命令。这个是操作系统的固定值,最低只能是 60 秒,也就是这个 1 分钟。

[root@localhost html]# sysctl net.ipv4.tcp_tw_reuse=1
[root@localhost html]# sysctl -p

这样一分钟以后这些连接信息就会消失了。设置成 0 不管用的,一样会等待,客户端关掉浏览器也没用。这个命令真实的作用其实是如果连接是安全可控的,可以复用 TIME_WAIT 的连接为新的连接所用。它可以快速复用处于 TIME_WAIT 状态的 TCP 连接,也就相当于缩短 TIME_WAIT 状态的持续时间。只有客户端主动关闭连接才会让服务器的正常关闭,使用 curl 命令测试就可以看到效果,你不会看到任何等待的连接。

关于 TIME_WAIT ,其实是为了能够正确、自然地进行 TCP 四次挥手而预留的等待时间,更具体的内容,大家可以再自行查阅 WSL(最大报文生产周期) 相关的知识点。同时,net.ipv4.tcp_tw_reuse 也要慎用,当客户端与服务端主机时间不同步时,客户端的发送的消息有可能会被直接拒绝掉。正式环境使用时,建议:别动!保持默认就好。

长连接总结

关于长连接的内容写了这么多,但其实也仅仅只是四个配置指令而已。更重要的其实是对于 HTTP 基础知识的学习,长连接现在在 Nginx 中是默认打开的,这几个选项也都是有默认值配置好的。所以平常其实我们不太需要去关心他们的配置。就像上面说的,如果发现 CPU 莫名升高,而且是因为 Nginx 的话,那么可以适当调节部分参数。但 CPU 的问题也不一定仅仅是连接的问题,gzip 同样也会带来 CPU 的压力。因此,调优是一个综合的活,要找到问题所在才好应对,比如我们还可以查看连接中 TIME_WAIT 的情况来看是不是连接非常多,这时更好的方案其实是要做负载均衡分散压力了。

连接处理

连接处理主要是针对 Nginx 如何来关闭客户端连接的一些配置操作。Nginx 在接收客户端的请求时可能由于客户端或服务端出错了,要立即响应错误信息给客户端,而 Nginx 在响应错误信息后大分部情况下是需要关闭当前连接的。Nginx 执行完 write() 系统调用(操作系统函数,参考网络编程或操作系统相关资料)把错误信息发送给客户端,write() 系统调用返回成功并不表示数据已经发送到客户端,有可能还在 tcp 连接的 write buffer 里。所以当在某些场景下出现 tcp write buffer 里的数据在 write() 系统调用之后到 close() 系统调用执行之前没有发送完毕,且 tcp read buffer 里面还有数据没有读,close() 系统调用会导致客户端收到 RST 报文且不会拿到服务端发送过来的错误信息数据。

所以,解决问题的重点是,让服务端别发 RST 包。或者说延迟发送,这就是下面要讲的 lingering_close 所要解决的问题。

上面的概念看着就很晕吧,如何测试我也没找到相关的资料,自己也尝试了半天没有什么效果。所以对这一块有了解的同学可以评论区留言哦。在实际应用中,是否应该打开 lingering_close 呢?这个就没有固定的推荐值了,lingering_close 的主要作用是保持更好的客户端兼容性,但是却需要消耗更多的额外资源(比如连接会一直占着)。因此,秉承对于不懂的东西,默认的就是最好的原则,咱们保持默认状态就好了。将来如果学习或者接触到这一块的内容了,再写文章和录视频进行详细的学习吧。

lingering_close

控制 Nginx 如何关闭客户端连接。

lingering_close off | on | always;

它的默认值是 on ,指示 Nginx 在完成关闭连接前等待和处理客户端发来的额外数据。但只有在预测客户端可能发送更多数据的情况才会做此处理。为了控制关闭HTTP/2连接,必须在 server 下(1.19.1)指定该指令。

  • always 指示 Nginx 无条件等待和处理客户端的额外数据。

  • off 指示nginx立即关闭连接,而绝不等待客户端传送额外数据。 这样做破坏了协议,所以正常条件下不应使用。

lingering_time

lingering_close 生效时(非off),这条指令定义 Nginx 处理(读取但忽略)客户端额外数据的最长时间。

lingering_time time;

默认值是 30s,超过这段时间后,Nginx 将关闭连接,不论是否还有更多数据待处理。

lingering_timeout

lingering_close 生效时(非off),这条指令定义 Nginx 等待客户端更多数据到来的最长时间。

lingering_timeout time;

默认值是 5s ,如果在这段时间内,Nginx 没有接收到数据,Nginx 将关闭连接。否则,Nginx 将接收数据,忽略它,然后再等待更多数据。 这个“等待——接收——忽略”的循环一直重复,但总时间不会超过 lingering_time 指令定义的时间。

总结

怎么说呢,学这些真的想回去好好再补补网络知识了。就这么点内容,也已经是边查资料边测试边写了,后面还有那么多配置以及牵涉到的相关知识,想想都头大。不过没关系,谁让自己喜欢这行呢,各位同学是不是也感觉到每次看完文章或者视频也会跟我一样多少会有一点点的进步呢?

长连接一般我们都会简单配置一下,通常也是以 keepalive_time 和 keepalive_time_out 的配置为主,其它两个说实话,没学之前我都不知道有这俩货。另外一个连接处理相关的配置更是从来没用过。但是,现在起码我们了个印象,将来或许哪天它们就能为我们解决大问题呢。

参考文档:

http://nginx.org/en/docs/http/ngx_http_core_module.html

相关文章:

【Nginx08】Nginx学习:HTTP核心模块(五)长连接与连接处理

Nginx学习&#xff1a;HTTP核心模块&#xff08;五&#xff09;长连接与连接处理 HTTP 基础知识大家掌握的怎么样呀&#xff1f;对于长连接这一块的内容应该也不是什么新鲜东西了吧。毕竟 HTTP1.1 都已经发布这么久了。今天主要来看的就是长连接相关的配置&#xff0c;另外还会…...

第八十五天学习记录:C++核心:内存分区模型

内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理 2、全局区&#xff1a;存放全局变量和静态变量以及常量 3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数…...

Chrome远程调试webview

网址 谷歌远程调试解决方案 https://blog.csdn.net/m0_56516186/article/details/131260563Chrome远程调试webview https://blog.csdn.net/weixin_44801980/article/details/117755550...

爬虫与反爬虫的攻防对抗

一、爬虫的简介 1 概念 爬虫最早源于搜索引擎&#xff0c;它是一种按照一定的规则&#xff0c;自动从互联网上抓取信息的程序&#xff0c;又被称为爬虫&#xff0c;网络机器人等。按爬虫功能可以分为网络爬虫和接口爬虫&#xff0c;按授权情况可以分为合法爬虫和恶意爬虫。恶…...

【机器学习】特征工程 - 字典特征提取

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 字典特征提取 一、特征提取API一、提取数字特征二、特征名字三、返回原始数据特征工…...

用户交互----进入游戏

一、增加交互----点击和拖动 1、点击鼠标画点的程序 设置 import pygame # Setup pygame.init() screen pygame.display.set_mode([800,600]) pygame.display.set_caption("单击画圆点") keep_going True RED (255,0,0) …...

排序算法 - 快速排序(4种方法实现)

快速排序 快速排序是啥&#xff1f;三数取中&#xff1a;1.挖坑法&#xff08;推荐掌握&#xff09;2.前后指针法&#xff08;推荐掌握&#xff09;3.左右指针法&#xff08;霍尔版本&#xff09;&#xff08;容易出错&#xff09;4.非递归实现 本篇文章的源代码在这&#xff0…...

C++入门知识点

目录 命名空间 命名空间定义 命名空间使用 法一&#xff1a;加命名空间名称及作用域限定符&#xff1a;&#xff1a; 法二&#xff1a;使用using部分展开&#xff08;授权&#xff09;某个命名空间中的成员 法三&#xff1a;使用using对整个命名空间全部展开&#xff08;授权…...

开眼界了,AI绘画商业化最强玩家是“淘宝商家”

图片来源&#xff1a;由无界AI生成 7月&#xff0c;2023世界人工智能大会在上海召开&#xff0c;顶尖的投资人、创业者都去了。 创业者吐槽&#xff1a;投我啊&#xff0c;我很强。 投资人反问&#xff1a;你的商业模式是什么&#xff1f;护城河是什么&#xff1f; 创业者投资人…...

机器学习与深度学习——自定义函数进行线性回归模型

机器学习与深度学习——自定义函数进行线性回归模型 目的与要求 1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图&#xff0c;画出真实值和预测值的散点图&#xff0c;最后进行二维和三维度可视化展示数据区域。 2、通过…...

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…...

c#webclient请求中经常出现的几种异常

WebClient是.NET Framework提供的用于HTTP请求的类&#xff0c;如果在使用WebClient时遇到异常&#xff0c;我们可以根据具体的异常类型进行处理。 以下是一些常见的WebClient异常及其处理方法&#xff1a; System.Net.WebException WebException通常是由于请求超时、网络连…...

设计模式-原型模式

目录 一、传统方式 二、原型模式 三、浅拷贝和深拷贝 克隆羊问题&#xff1a; 现在有一只羊tom&#xff0c;姓名为: tom,年龄为: 1&#xff0c;颜色为: 白色&#xff0c;请编写程序创建和tom羊属性完全相同的10只羊。 一、传统方式 public class Client {public static vo…...

sentinel介绍-分布式微服务流量控制

官网地址 https://sentinelguard.io/ 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自…...

基于Redisson的Redis结合布隆过滤器使用

一、场景 缓存穿透问题 一般情况下&#xff0c;先查询Redis缓存&#xff0c;如果Redis中没有&#xff0c;再查询MySQL。当某一时刻访问redis的大量key都在redis中不存在时&#xff0c;所有查询都要访问数据库&#xff0c;造成数据库压力顿时上升&#xff0c;这就是缓存穿透。…...

BrowserRouter刷新404解决方案

1、本地开发环境 在js脚本命令里加上 --history-api-fallback "scripts": {"serve": "webpack serve --config webpack.dev.js --history-api-fallback" }2、生产环境&#xff0c;可以修改 nglnx 配置&#xff1a; server {listen XXXX; //端口号…...

解决appium-doctor报opencv4nodejs cannot be found

一、下载cmake 在CMake官网下载&#xff1a;cmake-3.6.1-win64-x64.msi 二、安装cmake cmake安装过程 在安装时要选择勾选为所有用户添加CMake环境变量 三、检查cmake安装 重新管理员打开dos系统cmd命令提示符&#xff0c;输入cmake -version cmake -version四、安装opencv4no…...

安卓通过adb pull和adb push 手机与电脑之间传输文件

1.可以参考这篇文章 https://www.cnblogs.com/hhddcpp/p/4247923.html2.根据上面的文章&#xff0c;我做了如下修改 //设置/system为可读写&#xff1a; adb remount //复制手机中的文件到电脑中。需要在电脑中新建一个文件夹&#xff0c;我新建的文件夹为ce文件夹 adb pull …...

java常用的lambda表达式总结

一、概述 lambda表达式是JDK8中的一个新特性&#xff0c;对某些匿名内部类进行简化&#xff0c;是函数式编程&#xff1b; 二、基本格式 (参数列表)->{方法体代码} 三、Stream流 是jdk8中的新特性&#xff0c;将数据以流的形式进行操作 三、常用方法解析 3.1、准备工作 …...

分布式应用之zookeeper集群+消息队列Kafka

一、zookeeper集群的相关知识 1.zookeeper的概念 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能…...

算法(蓝桥杯学习C/C++版)

up: 溶金落梧桐 溶金落梧桐的个人空间-溶金落梧桐个人主页-哔哩哔哩视频 蓝桥杯三十天冲刺系列 BV18eQkY3EtP 网站&#xff1a; OI Wiki OI Wiki - OI Wiki 注意 比赛时&#xff0c;devc勾选c11&#xff08;必看&#xff09; 必须勾选c11一共有两个方法&#xff0c;任用…...

64、js 中require和import有何区别?

在 JavaScript 中&#xff0c;require 和 import 都是用于模块导入的语法&#xff0c;但它们属于不同的模块系统&#xff0c;具有显著的区别&#xff1a; 1. 模块系统不同 require 属于 CommonJS 模块系统&#xff08;Node.js 默认使用&#xff09;。 语法&#xff1a;const…...

go中的接口返回设计思想

go中的接口返回设计思想 前言 在学习AI编码过程中&#xff0c;产生了类似以下结构的代码 &#xff1a; type MQClient interface {PublishMessage(queue string, message interface{}) error...... } ... type RabbitMQClient struct {conn *amqp.Connectionchannel *amqp.C…...

【学习记录】在 Ubuntu 中将新硬盘挂载到 /home 目录的完整指南

文章目录 &#x1f4cb; 一、准备工作1. 备份重要数据2. 确认新硬盘设备信息 &#x1f6e0;️ 二、格式化新硬盘&#xff08;如未格式化&#xff09;1. 格式化为 ext4 文件系统&#xff08;推荐&#xff09; &#x1f501; 三、临时挂载并迁移数据1. 创建临时挂载点2. 挂载新硬…...

【HarmonyOS 5】出行导航开发实践介绍以及详细案例

以下是 ‌HarmonyOS 5‌ 出行导航的核心能力详解&#xff08;无代码版&#xff09;&#xff0c;聚焦智能交互、多端协同与场景化创新&#xff1a; 一、交互革新&#xff1a;从被动响应到主动服务 ‌意图驱动导航‌ ‌自然语义理解‌&#xff1a;用户通过语音指令&#xff08;如…...

监测预警系统重塑隧道安全新范式

在崇山峻岭的脉络间延伸的隧道&#xff0c;曾是交通安全的薄弱环节。智慧隧道监测预警系统的诞生&#xff0c;正在彻底改变这种被动防御格局&#xff0c;通过数字神经网络的构建&#xff0c;为地下交通动脉注入智能守护基因。 一、安全防控体系的质变升级 1.风险感知维度革命…...

Dify工具插件开发和智能体开发全流程

想象一下&#xff0c;你正在开发一个 AI 聊天机器人&#xff0c;想让它能实时搜索 Google、生成图像&#xff0c;甚至自动规划任务&#xff0c;但手动集成这些功能耗时又复杂。Dify 来了&#xff01;这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件&#xff0c;快…...

(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)

题目&#xff1a;2434. 使用机器人打印字典序最小的字符串 思路&#xff1a;贪心栈&#xff0c;时间复杂度0(n)。 字符串t其实就是栈&#xff0c;后进先出。要让p的字典序最小&#xff0c;那当然是t每次弹出的字符&#xff0c;都小于或等于“剩下未入t里的字符串的字符”&#…...

【华为云Astro-服务编排】服务编排使用全攻略

目录 概述 为什么使用服务编排 服务编排基本能力 拖拉拽式编排流程 逻辑处理 对象处理 服务单元组合脚本、原生服务、BO、第三方服务 服务编排与模块间调用关系 脚本 对象 标准页面 BPM API接口 BO 连接器 如何创建服务编排 创建服务编排 如何开发服务编排 服…...

API管理是什么?API自动化测试怎么搭建?

目录 一、API管理是什么 &#xff08;一&#xff09;API管理的定义 &#xff08;二&#xff09;API管理的重要性 二、API管理的主要内容 &#xff08;一&#xff09;API设计 1. 遵循标准规范 2. 考虑可扩展性 3. 保证接口的易用性 &#xff08;二&#xff09;API开发 …...