基于Nginx深入浅出亿级流量架构设计(更新至2023.7.18)

news2024/10/5 14:42:15

基于Nginx深入浅出亿级流量架构设计

  • 环境准备/安装部署
    • Nginx四个发行版本简单介绍
    • Nginx的安装
  • Nginx的目录结构与基本运行原理及其最小配置解析
  • Nginx虚拟主机与域名配置
  • ServerName匹配规则
  • 反向代理在系统结构中的应用场景
    • Nginx的反向代理配置
    • 基于反向代理的负载均衡器

在这里插入图片描述

环境准备/安装部署

虚拟机使用VMware Workstation Pro 16版本
省略安装系统过程,可参考VMware 安装 Centos7(超详细教程)
本次实验学习基于源码编译安装 nginx 1.21.6
在这里插入图片描述

# 系统环境
3.10.0-862.el7.x86_64
CentOS Linux release 7.5.1804 (Core)

# 设置Yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache fast

# 必备工具安装
yum install wget vim net-tools telnet yum-utils -y

# 关闭firewalld selinux
systemctl disable --now firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
reboot

# 如未关闭防火墙也可放行端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重启防火墙
firewall-cmd --reload

学习时的电脑配置
内存:建议8G以上
磁盘:建议使用SSD
CPU:4核以上主流即可

主机IP地址主机配置安装的软件
lr-nginx-01192.168.100.1112核4GNginx
lr-nginx-02192.168.100.1122核4GNginx
lr-nginx-02192.168.100.1132核4GNginx

Nginx四个发行版本简单介绍

常用版本分为四大阵营

  1. Nginx开源版 http://nginx.org/
  2. Nginx plus 商业版 https://www.nginx.com
  3. Openresty http://openresty.org
  4. Tengine http://tengine.taobao.org

Nginx的安装

基于rpm包进行离线安装

http://nginx.org/packages/centos/7/x86_64/RPMS/

wget -P /opt/ http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.0-1.el7.ngx.x86_64.rpm
rpm -ivh /opt/nginx-1.20.0-1.el7.ngx.x86_64.rpm

基于源码编译安装

# 安装相关依赖
yum install gcc pcre pcre-devel zlib zlib-devel -y

# 编译安装
wget -P /opt/ http://nginx.org/download/nginx-1.21.6.tar.gz
tar xf nginx-1.21.6.tar.gz
cd nginx-1.21.6
./configure --prefix=/opt/nginx && make && make install

# 启动Nginx
cd /opt/nginx/sbin/

./nginx           # 启动
./nginx -s stop   # 快速停止
./nginx -s quit   # 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload #重新加载配置

在这里插入图片描述

安装成系统服务并创建服务脚本

vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/opt/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/sbin/nginx -s stop
ExecQuit=/opt/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

# 加载系统服务
systemctl daemon-reload
# 启动nginx并设置开机启动
systemctl enable nginx.service --now

Nginx的目录结构与基本运行原理及其最小配置解析

Nginx的目录结构

在这里插入图片描述

基本请求流程

在这里插入图片描述
启动nginx后,/sbin/nginx可执行文件运行,①master开启主进程读取nginx.conf文件并校验配置文件②开启多个子进程响应请求,运行时会有两种进程,主进程master不处理业务协调子进程,子进程worker
等待用户请求接入,读取nginx.conf站点目录,由worker响应并解析,再加载index.html
nginx启动后是多进程的,由主进程fork出的子进程响应请求,master协调子进程

Nginx最小配置解析


worker_processes  1;            # 工作的子进程个数默认为1,对应物理服务器内核CPU数,一个内核对应一个worker_processes

events {                                     # 事件驱动模块
    worker_connections  1024;                # 每一个worker创建多少连接(单个业务进程可接受连接数),默认1024
}

http {
    include       mime.types;                # mime.types(请求头),对应文件后缀名,引入http mime类型
    default_type  application/octet-stream;  # 如果mime类型没有匹配上,默认使用二进制流的的方式传输

    sendfile        on;                      # 数据0拷贝,使用Linux的sendfile(socket,file,len)高效网络传输

    keepalive_timeout  65;                   # 保持连接,超时断开时间

    server {                                 # 虚拟主机(vhost),一个nginx可以运行多个主机,一个主机有自己独立的站点
        listen       80;                     # 当前主机监听端口号,不能重复
        server_name  localhost;              # 主机名(配置域名)或IP地址
        
        charset utf-8;
                                             # location匹配路径, uri(资源)+server_name=url
        location / {                         # http://atguigu.com/xxoo/index.html
            root   html;                     # 文件根目录(相对路径),相对于nginx主目录/opt/nginx
            index  index.html index.htm;     # 默认页名称
        }
                                                 # 服务器端内部错误报错,资源无法访问
        error_page   500 502 503 504  /50x.html; # 报错编码对应页面
        location = /50x.html {
            root   html;
        }
    }
}

Nginx虚拟主机与域名配置

域名、DNS和IP之间的关系

  1. 因为在网络上机器彼此连接只能互相识别IP,而数字标识较难记忆,所以才演化出域名来代替IP地址,当我们将在地址栏输入域名欲跳转到某个页面时,点击提交后会由专门的域名解析服务器(DNS服务器)对我们的域名进行解析,得出域名对应的IP地址再进行连接。所以如果我们直接在地址栏输入与域名对应的IP也可以跳转到同一个页面。
  2. 虽然同一个域名只能绑定一个IP地址,但是因为一个域名可以设定多个DNS服务或者服务器进行解析,同一个域名的每个解析就可以指向不同的IP地址,这样应答快的DNS优先进行解析,能保证最快定向到指定的网站空间去,这是用户所不知道的。

总结

  1. 地址栏输入域名后,会由专门的域名解析服务器
  2. 同一个域名只能绑定一个IP地址
  3. 一个域名可以设定多个DNS服务或者服务器进行解析,同一个域名的每个解析就可以指向不同的IP地址
  4. 应答快的DNS优先进行解析

http协议

HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。
HTTP是一种无状态 (stateless) 协议, HTTP协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie。

虚拟主机原理

Nginx虚拟主机:Nginx部署在一个物理服务器上,却通过ip、端口、域名对外实现多个访问入口,让客户端以为是多个服务器,这就是虚拟主机
参考文章: Nginx从基本原理到开发实践
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
Notepad++可以更改hosts文件,Nodepad++ 下载:https://notepad-plus.en.softonic.com/download

# 本机hosts文件路径
C:\Windows\System32\drivers\etc
...
192.168.100.111     nginx-devops.com

本机hosts文件设置解析
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 虚拟主机环境准备

# 准备站点
mkdir /www && cd /www  && mkdir web video
[root@lr-nginx-01 www]# ls
video  web
echo "this is video web site." > video/index.html
echo "this is master web site." > web/index.html

# 基于端口的虚拟主机vhost
...
    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        location / {
            root   /www/web/;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }       
    server {
        listen       88;
        server_name  localhost;
        
        charset utf-8;
            
        location / {
            root   /www/video;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
...

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

...
# 基于域名的虚拟主机vhost
    server {
        listen       80;
        server_name  www.cloud611.fun;

        charset utf-8;

        location / {
            root   /www/web/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  video.cloud611.fun;

        charset utf-8;

        location / {
            root   /www/video;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
...

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

公网域名解析与泛域名解析实战

在这里插入图片描述
在这里插入图片描述
DNS解析记录类型及分别代表什么含义?

  1. A记录:所对应的域名匹配一个独立的IP地址,把域名转向到IP地址记录在DNS服务器上
  2. CNAME记录:将域名指向另外一个域名地址上,好处:有可能IP地址主机地址不是固定的,故直接解析到域名
  3. AAAA记录:暂未普及
  4. NS记录:DNS服务器
  5. MX记录:邮件服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于阿里云直接解析内网IP并且可以访问的问题

  1. DNS只是记录了你要解析的IP,无论是内网还是外网,你在当前环境下用域名访问你的内网IP,跟直接访问内网IP一样的道理
  2. 又或者说这种配置是本地hosts作用域提升到了局域网,简单来说是在公网DNS注册了一条记录,这条记录最后会返回给你,本机拿到记录会去找对应的IP

在这里插入图片描述

ServerName匹配规则

可以在同一个servername中配置多个域名
需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了

# 完整匹配,我们可以在同一servername中匹配多个域名
server_name www.cloud611.fun video.cloud611.com;

# 通配符匹配
server_name *.cloud611.fun

# 通配符结束匹配
server_name cloud611.*;

# 正则匹配
server_name ~^[0-9]+\.cloud611\.fun$;

server_name的配置格式之正则匹配

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

正则匹配格式,必须以~开头,比如:server_name ~^www\d+\.example\.net$;如果开头没有~,则nginx认为是精确匹配,或者如果匹配字符中含有*号,则会被认为是通配符匹配,不过非法的通配符格式。在逻辑上,需要添加^$锚定符号。注意,正则匹配格式中.为正则元字符,如果需要匹配.,则需要反斜线转义。如果正则匹配中含有{}则需要双引号引用起来,避免nginx报错,如果未加双引号,则nginx会报如下错误:directive "server_name" is not terminated by ";" in ...
特殊匹配格式

server_name "";   匹配Host请求头不存在的情况。
server_name "-";  无任何意义。
server_name "*";  它被错误地解释为万能的名称,它从不用作通用或通配符服务器名称.
                  相反,它提供了server_name_in_redirect指令现在提供的功能.
                  现在不建议使用特殊名称"*",而应使用server_name_in_redirect指令. 

匹配顺序

  1. 精确的名字
  2. 以*号开头的最长通配符名称,例如 *.example.org
  3. 以*号结尾的最长通配符名称,例如 mail.*
  4. 第一个匹配的正则表达式(在配置文件中出现的顺序)

优化

  1. 尽量使用精确匹配;
  2. 当定义大量server_name时或特别长的server_name时,需要在http级别调整server_names_hash_max_sizeserver_names_hash_bucket_size,否则nginx将无法启动。

参考文章:Nginx系列之server_name定义与匹配规则

反向代理在系统结构中的应用场景

在这里插入图片描述

何为反向代理?

  1. 在介绍反向代理之前,先来了解一下正向代理。
  2. 正向代理: 如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。下面是正向代理的原理图。
  3. 由于工作环境原因,日常工作只能局限于单位的局域网,如果想要访问互联网,怎么办呢?这就需要用到正向代理。本人经常用正向代理来进行上网。

在这里插入图片描述

  1. 反向代理:看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

在这里插入图片描述

  1. 正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果实在服务器用,我们用户无感知,就是反向代理。
  2. 这里有个问题:反向代理服务器,怎么选择挂在它后面的哪一台具体服务器呢?答案在后文揭晓,这就是负载均衡

参考文章:https://zhuanlan.zhihu.com/p/451825018

Nginx的反向代理配置

# nginx01主机nginx.conf配置
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    server_tokens   off;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  www.cloud611.fun;

        charset utf-8;

        location / {
             proxy_pass http://www.atguigu.com;# 如果不添加www,地址会自动跳转www.atguigu.com而不是阿里云DNS解析
#            root   /www/web/;
#            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在这里插入图片描述

基于反向代理的负载均衡配置

<!-- 修改192.168.100.112&192.168.100.113 index.html文件 112&113 -->
<!DOCTYPE html>
<html>
 <head>
 <meta charset='utf-8'>
 <title>开始HTML</title>
 </head>
 <body>
 <h1>我是192.168.100.112!!!</h1>
 </body>
</html>

将后端代理服务器转到192.168.100.112上

...
location / {
     proxy_pass http://192.168.100.112;
}
...

在这里插入图片描述

基于反向代理的负载均衡器

轮询负载均衡配置

轮询:默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。无法保持会话


worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    
# upstream和server同一级 http模块下
    upstream httpds {
        server 192.168.100.112:80; # 80端口可以不写,但是后端可能会定义很多服务器,这样好区分
        server 192.168.100.113:80;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
             proxy_pass http://httpds; # 定义后端服务器组
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置完成后的设置
在这里插入图片描述
在这里插入图片描述

权重负载均衡配置

weight(权重):指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。


worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream httpds {
        server 192.168.100.112 weight=8;        # weight:默认为1 weight越大,负载的权重就越大
        server 192.168.100.113 weight=2;
      # server 192.168.100.114 weight=10 down;  # down:表示当前的server暂时不参与负载
      # server 192.168.100.115 weight=1 backup;  # backup:其它所有的非backup机器down或者忙的时候,请求backup机器.
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
             proxy_pass http://httpds;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

这几种负载均衡其实都并不常用,每次配置nginx.conf文件后都需要重新reload当前服务器,很多时候是来不及的,想要做到服务器动态上下线,靠nginx基础命令是不行的,负载均衡的weight还是很有用的。

其他不太常用负载均衡策略(基本不会出现生产环境)

  1. ip_hash:根据客户端的ip地址转发同一台服务器可以保持回话
  2. least_conn:最少连接访问
  3. url_hash(需要三方插件):根据用户访问的url定向转发请求定向流量转发
  4. fair(需要第三方插件):根据后端服务器响应时间转发请求

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

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

相关文章

自洽性改善语言模型中的思维链推理

自洽性改善语言模型中的思维链推理 摘要介绍对多样化路径的自洽实验实验设置主要结果当CoT影响效率时候&#xff0c;SC会有所帮助与现有方法进行比较附加研究 相关工作总结 原文&#xff1a; 摘要 本篇论文提出了一种新的编码策略——自洽性&#xff0c;来替换思维链中使用的…

【STM32】SPI屏幕刷图总结:GPIO模拟,硬件SPI,DMA+硬件SPI

文章目录 GPIO模拟SPI硬件SPI外设DMA硬件SPI外设总结 代码工程&#xff1a;https://github.com/liefyuan/stm32-spi-st7789-tft.git 前言 我的屏幕的分辨率是&#xff1a;240*320 驱动是&#xff1a;ST7789V 线驱动方式&#xff1a;四线SPI&#xff08;CS&#xff0c;DC&#…

206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…

PageObject+Python+Appium

目录 前言&#xff1a; 简介 功能 常用目录 配置 实例 - 第一次启动 app 实例 - 登录 代码入口实例 结果展示 前言&#xff1a; Page Object模式是一种常用的设计模式&#xff0c;用于组织和管理自动化测试脚本中的页面对象。它将页面的元素和操作封装在一个独立的类…

数据质量相关问题系列

数据质量问题是什么&#xff1f; 数据质量&#xff0c;是指在业务环境下&#xff0c;数据符合数据消费者的使用目的&#xff0c;能满足业务场景具体需求的程度。而数据质量问题是指数据集中存在无法容忍的缺陷&#xff0c;从而降低该数据的可靠性和可信度。简单理解就是数据很脏…

【JAVA】云HIS系统功能菜单知识(一)

一、云HIS特色 云HIS滚动消息栏&#xff1a;质控消息、住院时长、药库结转、患者入院、医嘱停止、新开医嘱、门诊用药不良、出院审核、药品调拨、排班提醒、药品库存、药品过期、药品临期等帮助医生、护士和相关管理人员实时接收院内消息并作出处理。 二、云HIS功能菜单 【预约…

【MySQL】MySQL事务保姆级教程(适合MySQL初学者学习)

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;重…

桥接模式——连接抽象维度和实现维度

桥接模式 bridge pattern 一 定义 桥接模式&#xff0c;是将抽象部分与它的具体实现部分分离&#xff0c;使它们都可以独立地变化。它是将两个不同的维度建立联系。这两个维度通常是指&#xff1a;抽象维度和实现维度。 使用场景 在抽象和具体实现之间需要增加更多的灵活性…

找不到dll的问题解决,loadlibrary 126错误

症状&#xff1a;loadlibrary时&#xff0c;getlasterror返回126&#xff0c;表示是找不到模块错误。来到目录下看到依赖所需的dll均存在 解决办法&#xff1a; 1.下载ProcmonProcmom-监视进程所有的动作资源-CSDN文库https://download.csdn.net/download/gergul/880597622.运…

RocketMQ第四节(部署模式、监控面板等)

1&#xff1a;mq的部署模式 部署方式 | RocketMQ 参考官网。 单机模式&#xff1a;抗风险能力差&#xff0c;单机挂机没服务&#xff0c;单机硬盘损坏&#xff0c;丢失数据 多机&#xff08;多master没有Slave副本&#xff09;: 多个master采用RAID10磁盘&#xff0c;不会丢…

[java安全]类加载器CommonsCollections3

文章目录 【java安全】类加载器&CommonsCollections3前言java类加载器URLClassLoader利用ClassLoader#defineClass()直接加载字节码 使用TemplatesImpl加载字节码TemplatesImpl中字节码实现AbstractTranslet类 构造未完成POCTrAXFilter类调用newTransformer()InstantiateTr…

【AI绘画Stable Diffusion】高清图像放大+面部修复+一键抠图,谈谈你可能不知道的优化技巧!

一提起后期处理&#xff0c;我猜你可能立马想到的就是图像放大。 今天&#xff0c;我要向你展示的后期处理手法&#xff0c;以及优化技巧。 图片放大算法 如果你常用的是秋叶大佬的整合包&#xff0c;那么你对"R-ESRGAN 4x"和"R-ESRGAN 4x Anime6B"应该…

FPGA单端口RAM——IP核

文章目录 前言一、RAM简介1、随机存储器IP核分类1、RAM IP核2、ROM IP核 2、RAM IP核 二、IP核配置步骤三、源码1、ram_rw驱动文件2、ip_1port_ram顶层文件3、仿真文件4、仿真波形 四、SignalTap II在线调试五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、vsco…

Leetcode-每日一题【1019.链表中的下一个更大结点】

题目 给定一个长度为 n 的链表 head 对于列表中的每个节点&#xff0c;查找下一个 更大节点 的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第一个节点的值&#xff0c;这个节点的值 严格大于 它的值。 返回一个整数数组 answer &#xff0c;其中 answer[…

Servlet的监听器

Servlet常用的监听器 ServletContextAttributeListener 用来感知ServlerContext对象属性变化&#xff0c;比如添加或删除属性变化 ServletContextListener 用来感知ServlerContext对象的创建和销毁的 ServletRequestListener 可以用来监听感知ServletRequest对象的创建和销毁的…

大语言模型(LLM)评估综述

论文地址&#xff1a;https://arxiv.org/abs/2307.03109 Github地址&#xff1a;https://github.com/MLGroupJLU/LLM-eval-survey 一 、背景 随着ChatGPT和GPT-4的推出&#xff0c;大型语言模型&#xff08;LLM&#xff09;在学术界和工业界的热度日益升高&#xff0c;这主要…

优雅的设计测试用例

⭐️前言⭐️ 入职以后接触到了公司的具体业务&#xff0c;提升了设计测试用例的能力&#xff0c;于是沉淀出这篇文档与大家分享。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&…

Acwing.905 区间选点(贪心)

题目 给定N个闭区间[a,bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N&#xff0c;表示区间数。 接下来N行&#xff0c;每行包含两个整数…

Linux内核《CPU负载计算》

目录 前言一、什么是CPU负载&#xff1f;二、如何计算CPU负载三、计算CPU负载的一个脚本四、top命令详解 前言 在实际的产品开发中&#xff0c;我们往往需要关注CPU的负载&#xff0c;确保程序可以长久稳定的运行&#xff0c;并且能够重复发挥SOC的性能。Linux中提供了一些命令…

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素&#xff0c;包括空值&#xff0c;任何元素&#xff0c;且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector&#xff0c;除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…