Nginx 实战系列(四)—— Nginx反向代理与负载均衡实战指南

文章目录

  • 前言
  • 一、反向代理
    • 1.1 反向代理原理
    • 1.2 实验配置示例
  • 二、负载均衡
    • 2.1 负载均衡基本原理
    • 2.2 常见负载均衡策略
      • 2.2.1 轮询(Round Robin)(最常用)
      • 2.2.2 最少连接数(Least Connections)
      • 2.2.3 IP 哈希(IP Hash)
      • 2.2.4 加权轮询(Weighted Round Robin)
      • 2.2.5 最少时间算法(Least Time)
      • 2.2.6 一致性哈希(Consistent Hashing)
    • 2.3 配置示例
      • 2.3.1 基础轮询配置
      • 2.3.2 带权重和故障转移的配置
    • 2.4 高可用与健康检查
    • 2.5 负载均衡总结
  • 三、Tomcat 后端服务器
    • 3.1 Tomcat 概述
    • 3.2 运行原理
    • 3.3 主要配置文件
    • 3.4 调用应用接口
    • 3.5 调用数据库接口
    • 3.6 Tomcat 部署步骤
      • 3.6.1 环境准备
      • 3.6.2 JDK 安装与环境变量配置
      • 3.6.3 安装与启动 Tomcat
    • 3.7 Tomcat总结
  • 四、Nginx + Tomcat 实战:反向代理与负载均衡
    • 4.1 环境规划
    • 4.2 Nginx 负载均衡器部署
    • 4.3 Tomcat 应用服务器部署
    • 4.4 动静分离配置
      • 4.4.1 Tomcat1 配置
      • 4.4.2 Tomcat2 配置
      • 4.4.3 Nginx 配置
    • 4.5 效果测试
  • 总结

前言

在现代 Web 架构中,Nginx 作为高性能的反向代理和负载均衡服务器,被广泛应用于生产环境中。它不仅可以有效提升系统的并发处理能力、可用性和扩展性,还能实现动静分离、请求分发等关键功能。本文将从原理到实践,系统介绍 Nginx 的反向代理与负载均衡机制,并结合 Tomcat 后端服务器的部署与配置,提供一个完整的实战指南。


一、反向代理

1.1 反向代理原理

反向代理是Nginx的核心功能之一,其工作原理如下:

  • 用户请求首先到达 Nginx 服务器
  • Nginx根据配置将请求转发给后端应用服务器/业务服务器(如Tomcat、Node.js、Spring Boot等)
    • 后端:php python java(java后端 、tomcat 、微服务)
  • Nginx 在这一过程中充当“中转站”的角色,客户端并不知道真正提供服务的后端服务器是哪一台,从而实现了请求的转发与隐藏后端服务器的作用

在这里插入图片描述

基本流程如下

客户端 → Nginx → 后端服务器集群

1.2 实验配置示例

要配置 Nginx 作为反向代理,需编辑 nginx.conf 文件,在 server 块中添加如下配置:

server {listen 80;server_name localhost;location / {proxy_pass http://127.0.0.1(后端IP):8080;   # 将请求转发至后端8080端口==========================================================proxy_set_header Host $host;        # 保留原始 Host 头信息proxy_set_header X-Real-IP $remote_addr;   # 传递客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;==========================================================}
}

保存配置后,执行以下命令重新加载 Nginx:

nginx -s reload
或者
systemctl reload nginx

此时访问 http://localhost/,实际请求将由 Nginx 转发至 http://127.0.0.1:8080/


二、负载均衡

2.1 负载均衡基本原理

负载均衡(Load Balancing)是 Nginx 的核心功能之一,通过将客户端请求分发到多台后端服务器,显著提升系统的并发处理能力、可用性和稳定性。

主要优势包括

  • 提升性能:分散单台服务器压力;
  • 高可用性:某台服务器故障时,自动将请求转发至其他正常节点;
  • 良好的扩展性:可灵活增删后端服务器节点。

在这里插入图片描述

2.2 常见负载均衡策略

Nginx 支持多种负载均衡算法,可根据实际业务场景选择合适的策略。

2.2.1 轮询(Round Robin)(最常用)

轮询算法是 Nginx 的默认分流算法。它按顺序将请求依次分配给每一台后端服务器,直到最后一台服务器,然后重新从第一台服务器开始。这种方法简单且均匀地分配了流量。

数据流向:每个请求依次被分配到下一个服务器。假设有三台服务器(Server A、Server B、Server C),第一个请求被分配到 Server A,第二个请求分配到 Server B,第三个请求分配到 Server C,第四个请求又回到 Server A,依此类推。

特点​​:

  • Nginx默认的负载均衡算法
  • 请求按顺序均匀分配到每台后端服务器,无视服务器的当前负载和响应时间
  • 简单高效,适合服务器性能相近的场景

配置示例:

upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.2.2 最少连接数(Least Connections)

最少连接数算法将请求分配给当前活动连接数最少的服务器。这种算法适用于请求处理时间不均匀的情况,可以有效平衡服务器的负载。

数据流向:每个请求被分配到当前连接数最少的服务器。例如,Server A 有 2 个连接,Server B 有 5 个连接,新的请求会被分配到 Server A。

特点​​:

  • 将请求分配给当前活动连接数最少的服务器
  • 动态均衡负载,适用于请求处理时间不一的场景
  • 有效避免服务器过载

配置示例:

upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.2.3 IP 哈希(IP Hash)

IP 哈希算法通过计算客户端 IP 地址的哈希值,将请求始终分配给同一台服务器。适用于需要将特定客户端的请求固定在同一台服务器上的场景。

数据流向:每个客户端的 IP 地址被哈希计算,然后根据哈希值将请求固定分配到某一台服务器。假设客户端 X 的哈希值指向 Server A,客户端 Y 的哈希值指向 Server B,则无论多少次请求,X 的请求总是流向 Server A,Y 的请求总是流向 Server B。

特点​​:

  • 基于客户端IP地址计算哈希值
  • 同一个客户端总是被分配到同一台服务器,有助于会话保持

配置示例:

upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.2.4 加权轮询(Weighted Round Robin)

加权轮询算法允许为每台服务器设置权重,权重越大的服务器将会获得更多的请求。适用于服务器性能不均衡的情况。

数据流向:根据服务器设置的权重值分配请求。假设 Server A 权重为 3,Server B 权重为 1,则 4 个请求中,3 个会被分配到 Server A,1 个会被分配到 Server B。

​特点​​:

  • 允许为每台服务器设置权重值
  • 权重越高的服务器获得更多请求
  • 适合服务器性能不均衡的环境

配置示例:

upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1;server backend3.example.com weight=2;
}

2.2.5 最少时间算法(Least Time)

最少时间算法基于请求的响应时间,将请求分配给响应时间最短的服务器。这种算法在 Nginx 1.15.3 及以后版本中可用,适用于需要最大化响应速度的场景。

数据流向:每个请求分配到响应时间最短或平均连接时间最短的服务器。假设 Server A 的响应时间较快,Server B 较慢,则新的请求更可能流向 Server A。

特点​​:

  • 基于服务器响应时间进行智能分配
  • 将请求分配给响应时间最短的服务器,适用于对响应速度要求较高的场景
  • Nginx 1.15.3及以上版本支持
  • 进一步优化了最少连接算法,适用于高负载环境下的动态负载均衡

配置示例:

upstream backend {least_time header;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.2.6 一致性哈希(Consistent Hashing)

一致性哈希将服务器和请求的键(如URL)映射到一个​​哈希环​​上,当集群中某台服务器故障时,只有部分请求会重新分配到其他服务器,而不是全部重新分配(IP哈希会全部分配,因为它是计算出哈希值后取余)。这在缓存等场景中非常有用。

数据流向:根据请求的某个特定参数(如 URL、Cookie 或其他 Header),进行哈希计算,将请求分配到哈希值对应的服务器。假设 Server A 和 Server B,参数 “foo” 的哈希值指向 Server A,参数 “bar” 的哈希值指向 Server B,则 “foo” 请求总是流向 Server A,“bar” 请求总是流向 Server B。

特点​​:

  • 基于特定参数(如URL)计算哈希值,服务器节点变动时仅影响部分请求
  • 适应服务器节点变动,减少请求的重新分配,适合缓存敏感的场景
  • 需要第三方模块支持

配置示例:(需要第三方模块如ngx_http_upstream_hash_module

upstream backend {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

2.3 配置示例

2.3.1 基础轮询配置

http {upstream backend {server 192.168.0.101;server 192.168.0.102;}server {listen 80;location / {proxy_pass http://backend;}}
}

2.3.2 带权重和故障转移的配置

upstream backend {server 192.168.0.101 weight=3 max_fails=3 fail_timeout=30s;server 192.168.0.102 weight=1 max_fails=3 fail_timeout=30s;
}

max_fails 表示允许失败的次数,fail_timeout 表示失败后暂停转发的时间。

2.4 高可用与健康检查

Nginx 开源版自带被动健康检查,仅在请求失败时标记服务器不可用。如需主动健康检查(定时探测后端状态),可选用:

  • Nginx Plus 版本;
  • 第三方模块如 nginx_upstream_check_module

2.5 负载均衡总结

Nginx 负载均衡就是通过反向代理把客户端请求按策略分配到多台后端服务器,实现高性能、高可用、可扩展的服务访问。


三、Tomcat 后端服务器

3.1 Tomcat 概述

Tomcat 是一个轻量级的 Web 应用服务器(Web Server + Servlet Container),也是一个 Servlet 容器,主要用于托管基于 Servlet、JSP、Spring MVC 等技术的 Java Web 应用。

主要功能包括

  • 接收 HTTP 请求(内置了一个简单的 HTTP 服务器)
  • 将请求分发给对应的 Web 应用(基于 URL 映射)
  • 执行 Servlet / JSP 并生成响应
  • 返回 HTTP 响应给客户端

换句话说,Tomcat 是一个 Java Web 应用运行环境,可以托管基于 Servlet、JSP、Spring MVC、Spring Boot(war 部署)等的应用。

3.2 运行原理

1、请求入口与代理​​

  • 用户通过浏览器发起请求(如访问网站),首先由​​Nginx服务器​​(监听80端口)接收。
  • Nginx作为反向代理,将请求转发至Tomcat的​​8080端口​​(Tomcat默认服务端口)。

2、Web容器处理请求​​

  • Tomcat的​​Web容器​​接收转发后的请求,解析请求类型(例如识别到需要处理index.jsp动态页面)。
  • 容器根据URL映射确定对应的Web应用资源。

3、JSP到Servlet的转换​​

  • ​​JSP容器​​将index.jsp文件中的Java代码(如<% … %>标签)翻译成完整的​​Servlet代码​​(本质是一个Java类)。
  • 此步骤会生成Servlet的.java文件,并编译为.class字节码文件(仅首次请求或修改时触发)。

4、​​Servlet执行与业务逻辑​​

  • ​​Servlet容器​​(如Tomcat中的Catalina)加载并执行编译后的Servlet。
  • Servlet处理业务逻辑,可能包含:
    • 调用API接口​​(如与淘宝/京东等第三方服务交互);
    • 连接MySQL数据库​​(执行查询或更新操作);
    • 生成动态内容(如HTML响应)。

5、响应返回客户端​​

  • Servlet将处理结果返回给Web容器,容器封装为HTTP响应。
  • 响应通过Nginx原路返回至用户浏览器,完成整个流程。

在这里插入图片描述

3.3 主要配置文件

Tomcat 的核心配置文件主要有:

文件作用
conf/server.xmlTomcat 的主配置文件,定义 Connector(端口、协议)、EngineHostContext
conf/web.xml全局的 Web 应用默认配置(比如默认的 MIME 映射、默认 Servlet)
context.xml定义 Web 应用级别的配置,如数据源(JNDI)、Session 配置
tomcat-users.xml用户、角色和安全相关配置,用于 Manager App、Admin Console 登录
应用内的 WEB-INF/web.xml每个 Web 应用自己的 Servlet、Filter、Listener 配置

3.4 调用应用接口

应用接口:Tomcat 负责将请求转交给指定的 Servlet 或框架(如 Spring MVC);

当你的应用部署到 Tomcat 中时,Tomcat 会:

  • 在启动时加载你的 web.xml 或注解(如 @WebServlet
  • 创建并初始化 Servlet
  • 当有 HTTP 请求时,将请求参数封装成 HttpServletRequest
  • 调用你的 Servlet 或框架(如 Spring MVC 的 DispatcherServlet)
  • 你的业务代码处理完成后返回 HttpServletResponse

也就是说,Tomcat 并不关心业务逻辑,只负责把请求转给你的代码执行。


3.5 调用数据库接口

数据库接口:可通过 JNDI 数据源实现数据库连接池的配置与管理,提升性能与可维护性。

Tomcat 提供了 JNDI 数据源 支持,让应用能复用数据库连接池:

  1. 配置数据源
    context.xml 或某个应用的 META-INF/context.xml

    <Resource name="jdbc/MyDB" auth="Container"type="javax.sql.DataSource"maxActive="20"maxIdle="10"maxWait="10000"username="root"password="123456"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/test"/>
    
  2. 应用代码获取数据源

    Context initCtx = new InitialContext();
    DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/MyDB");
    Connection conn = ds.getConnection();
    // 执行 SQL ...
    

这样做的好处:

  • 连接池由 Tomcat 管理,性能更好
  • 数据源配置与应用解耦,方便运维

3.6 Tomcat 部署步骤

3.6.1 环境准备

关闭防火墙 与增强功能

systemctl stop firewalld
setenforce 0

3.6.2 JDK 安装与环境变量配置

# 配置JDK,现在系统基本自带openJDK 
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ 
vim /etc/profile

添加以下内容:

export JAVA_HOME=/usr/local/jdk1.8.0_91 #指定JDK安装目录
export JRE_HOME=${JAVA_HOME}/jre #指定JDK目录中的JRE
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib #包含当前目录和JAVA库目录
export PATH=${JAVA_HOME}/bin:$PATH #将JDK bin目录添加到PATH,使得JAVA相关命令可以全局执行

执行 source /etc/profile 使配置生效。

# 使配置生效
source /etc/profile# 验证安装
java -version

3.6.3 安装与启动 Tomcat

#先下载安装包,然后再解压
tar zxvf apache-tomcat-8.5.35.tar.gz
#修改服务名字
mv apache-tomcat-8.5.35 /usr/local/tomcat
# 启动/停止命令
/usr/local/tomcat/bin/startup.sh		# 启动
/usr/local/tomcat/bin/shutdown.sh       # 关闭 
# 验证端口
netstat -ntap | grep 8080
# 查看进程
ps -aux|grep java

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

3.7 Tomcat总结

  • 本质:Tomcat 是 Java Web 应用的运行容器,负责接收 HTTP 请求、调用 Servlet、返回响应
  • 原理:Connector 监听请求 → Mapper 分发 → Servlet 执行 → 返回响应
  • 配置文件:server.xml(端口、Host)、web.xml(全局)、context.xml(数据源)、tomcat-users.xml(用户)
  • 应用接口调用:Tomcat 把请求交给你的 Servlet/框架
  • 数据库接口调用:通过 JNDI 数据源或自己管理 JDBC 连接

四、Nginx + Tomcat 实战:反向代理与负载均衡

4.1 环境规划

  • Nginx 负载均衡器:192.168.10.110:80
  • Tomcat 服务器1:192.168.10.123:8080
  • Tomcat 服务器2:192.168.10.123:8081

4.2 Nginx 负载均衡器部署

如已安装可跳过,否则执行:

# 安装依赖与编译安装
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \									#启用文件修改支持
--with-http_stub_status_module \					#启用状态统计
--with-http_gzip_static_module \					#启用 gzip静态压缩
--with-http_flv_module \							#启用 flv模块,提供对 flv 视频的伪流支持
--with-http_ssl_module								#启用 SSL模块,提供SSL加密功能
--with-stream										#启用 stream模块,提供4层调度----------------------------------------------------------------------------------------------------------
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-stream  --with-http_ssl_modulemake && make install# 创建系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
# 添加服务配置内容
systemctl start nginx
systemctl enable nginx

在这里插入图片描述

4.3 Tomcat 应用服务器部署

systemctl stop firewalld
setenforce 0tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/vim /etc/profile
export JAVA_HOME=/usr/local1/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATHsource /etc/profile
==============================================================
tar zxvf apache-tomcat-8.5.35.tar.gzmv /opt/apache-tomcat-8.5.35/ /usr/local/tomcat/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.shnetstat -ntap | grep 8080第二台直接拷贝即可  
cp -r /usr/local/tomcat     /usr/local/tomcat1

在这里插入图片描述

4.4 动静分离配置

4.4.1 Tomcat1 配置

cd /usr/local/tomcat/webapps/ROOT/
mv index.jsp index.jsp.bak		# 备份默认的index.jsp
vim index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>    #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html># 重启Tomcat
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

也可以这么配置:

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"></Context>
</Host>

在这里插入图片描述

4.4.2 Tomcat2 配置

cd /usr/local/tomcat1/webapps/ROOT/
mv index.jsp index.jsp.bak		# 备份默认的index.jsp
vim index.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html># 修改server.xml
vim /usr/local/tomcat/tomcat1/conf/server.xml
22 <Server port="8006" shutdown="SHUTDOWN">  # 8005 换成8006
69     <Connector port="8081" protocol="HTTP/1.1"   # 8080 改成8081
116     <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />  # 把8009 改成8010
# 重启Tomcat
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

在这里插入图片描述

4.4.3 Nginx 配置

#准备静态页面和静态图片
echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
cp /root/game.jpg /usr/local/nginx/html/img

在这里插入图片描述

# 修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstream tomcat_server {server 192.168.10.123:8080 weight=1;server 192.168.10.123:8081 weight=1;}server {listen 80;server_name www.yjs.com;charset utf-8;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;#设置后端的Web服务器可以获取远程客户端的真实IP##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。proxy_set_header HOST $host;   ##把$remote_addr赋值给X-Real-IP,来获取源IPproxy_set_header X-Real-IP $remote_addr;##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}#配置Nginx处理静态图片请求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;# ​​缓存 10 天expires 10d;}	
......}
......
}# 加载配置文件
systemctl reload nginx

4.5 效果测试

1、测试静态页面效果

  • 静态页面访问:http://192.168.10.110/

在这里插入图片描述

  • 浏览器访问静态图片 http://192.168.10.110/game.jpg

在这里插入图片描述

2、动态页面负载均衡测试:不断刷新 http://192.168.10.110/index.jsp

因为负载均衡策略选择轮询的方式,所以动态请求会轮流转发给Tomcat1和Tomcat2。
在这里插入图片描述
在这里插入图片描述


总结

本文全面介绍了Nginx反向代理与负载均衡的配置实践,以及Tomcat应用服务器的部署与集成方案。主要内容包括:

  • Nginx反向代理​​:工作原理、基础配置方法
  • 负载均衡策略​​:详细解析6种主流算法及适用场景
  • Tomcat核心知识​​:架构原理、关键配置、数据源集成
  • 实战部署方案​​:完整的Nginx+Tomcat负载均衡环境搭建
  • 动静分离实现​​:智能区分处理动态请求和静态资源

通过本指南,您可以构建出高性能、高可用的Web服务架构,有效应对高并发场景,提升系统稳定性和可扩展性。实际生产环境中,建议根据具体业务需求选择合适的负载均衡策略,并配合健康检查机制确保服务可靠性。

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

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

相关文章

深度学习(一):人工智能、机器学习与深度学习

人工智能 (AI)&#xff1a;宏大的目标 人工智能是最广泛、最宏大的概念&#xff0c;它的目标是让机器能够模仿人类的智能行为&#xff0c;例如&#xff1a; 推理&#xff1a;像下棋程序一样&#xff0c;通过逻辑来做决策。规划&#xff1a;为实现一个目标而制定步骤&#xff0c…

[网络入侵AI检测] 纯卷积神经网络(CNN)模型 | CNN处理数据

第5章&#xff1a;纯卷积神经网络&#xff08;CNN&#xff09;模型 欢迎回来 在第1章&#xff1a;分类任务配置&#xff08;二分类 vs. 多分类&#xff09;中&#xff0c;我们学习了如何提出正确的问题&#xff1b; 在第2章&#xff1a;数据加载与预处理中&#xff0c;我们准…

Unity AssetBundle详解

简介 AssetBundle&#xff08;简称&#xff1a;AB包&#xff09; 是 Unity 提供的一种资源压缩包&#xff0c;用于在应用运行时动态地加载和卸载资源。它可以将非代码资源&#xff08;如模型、纹理、预制体、音频、甚至整个场景&#xff09;打包成一个或多个文件&#xff0c;这…

golang-gin包

文章目录一、了解gin二、html渲染三、gin中get/post获取值四、路由分组五、中间件六、文件上传七、gin中的cookie一、了解gin Gin 是一个用 Golang编写的 高性能的web 框架, 由于http路由的优化&#xff0c;速度提高了近 40 倍。 Gin的特 点就是封装优雅、API友好。 特性类别…

基于脚手架微服务的视频点播系统-界面布局部分(二):用户界面及系统管理界面布局

基于脚手架微服务的视频点播系统-界面布局部分:二.首页及播放界面布局一.用户界面布局1.1用户界面布局分析与实现1.2更新用户图像按钮及逻辑1.3修改按钮及逻辑1.4上传视频对话框实现逻辑1.4.1页面跳转逻辑处理1.4.2页面控件响应处理二.系统界面布局2.1系统管理页框架2.2审核管理…

STL库——二叉搜索树

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言&#xff1b; 文章目录 前言 一、二叉搜索树的概念 二、二叉搜索树的性能分析 三、二叉搜索树的插入 四、二叉搜索树的查…

【Linux】线程概念与控制

一. 线程的概念1.什么是线程线程是进程内部的一个执行流&#xff0c;是进程调度的基本单位。它具有轻量的特点&#xff0c;它的创建和销毁所消耗的资源更少&#xff0c;线程间切换比进程间切换消耗的资源更少&#xff1b;它与进程共享一张虚拟地址空间表&#xff0c;通过进程来…

双轴倾角传感器厂家与物联网角度传感器应用全解析

本文主要探讨双轴倾角传感器厂家的核心技术优势&#xff0c;以及物联网角度传感器在智能监测中的创新应用。同时&#xff0c;也详细介绍了水平监测传感器厂家的解决方案特点&#xff0c;并分析了专业进口倾角传感器代理所提供的原厂品质保障与本地化服务支持。以深圳瑞惯科技有…

容器-资源隔离机制

一. 引言&#xff1a; 大家都知道&#xff0c;在一台机器上&#xff0c;可以运行任意(根据系统资源)个容器实例。且各容器间是相互独立&#xff0c;不做任何关联的。那么&#xff0c;docker是通过什么方式来实现容器隔离的呢&#xff1f; 接下来我们了解下。 二. 关于容器隔离…

Agentic RL Survey: 从被动生成到自主决策

Agentic RL Survey: 从被动生成到自主决策 本文将系统解读《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》这篇综述。该综述首次将智能体强化学习&#xff08;Agentic RL&#xff09;与传统LLM-RL范式正式区分&#xff0c;通过MDP/POMDP理论框架梳理…

彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声

在 VMware 虚拟机中安装的 CentOS 7.9 系统&#xff0c;即使通过修改 /etc/inputrc 禁用了终端铃声&#xff08;set bell-style none&#xff09;&#xff0c;vi 或 vim 编辑时仍可能发出滴滴声。这是因为 vi/vim 有自己独立的铃声控制机制。以下是解决方法&#xff1a;方法 1&…

基于A2A和ADK的内容规划代理

项目概述 Content Planner Agent 是一个基于 Google Agent Development Kit (ADK) 和 Python A2A SDK 构建的智能内容规划代理。该代理能够根据高层次的内容描述&#xff0c;创建详细的内容大纲。 什么是A2A Protocol A2A Protocol&#xff08;Agent2Agent 协议&#xff09;…

Linux-条件变量

文章目录条件变量概述条件变量的优缺点条件变量相关函数pthread_cond_init函数pthread_cond_destroy函数pthread_cond_wait函数pthread_cond_signal函数测试生产者和消费者模型条件变量 概述 与互斥锁不同&#xff0c;条件变量是用来等待而不是用来上锁的&#xff0c;条件变量…

[硬件电路-166]:Multisim - SPICE与Verilog语言的区别

SPICE与Verilog语言在电子设计领域中扮演不同角色&#xff0c;SPICE是电路仿真语言&#xff0c;用于精确模拟电路行为&#xff1b;Verilog是硬件描述语言&#xff0c;用于描述数字电路的结构和行为。以下是两者的详细区别&#xff1a;一、核心定位与用途SPICE&#xff1a;电路仿…

玩转Docker | 使用Docker部署Umbrel操作系统

玩转Docker | 使用Docker部署Umbrel操作系统 前言 一、 Umbrel 介绍 Umbrel简介 Umbrel主要特点 二、系统要求 环境要求 环境检查 Docker版本检查 检查操作系统版本 三、部署Umbrel服务 下载Umbrel镜像 编辑部署文件 创建容器 检查容器状态 检查服务端口 安全设置 四、访问Umbr…

Flink Task线程处理模型:Mailbox

Task的线程 和 MailboxProcessor 的绑定executingThread 是 Task 类&#xff08;StreamTask 的父类&#xff09;在构造时创建的物理线程。MailboxProcessor 是 StreamTask 用来处理异步事件和驱动其主要处理逻辑&#xff08;processInput&#xff09;的核心组件。它们之间的绑定…

OpenCV 银行卡号识别

目录 一、项目原理与核心技术 二、环境准备与工具包导入 1. 环境依赖 2. 工具包导入 三、自定义工具类 myutils.py 实现 四、主程序核心流程&#xff08;银行卡识别.py&#xff09; 1. 命令行参数设置 2. 银行卡类型映射 3. 辅助函数&#xff1a;图像展示 五、步骤 1…

计算机二级Python

一.静态语言和脚本语言高级语言根据计算机执行机制的不同分为两类&#xff1a;静态语言和脚本语言静态语言的核心特征&#xff1a;变量的类型在编译时&#xff08;写代码时&#xff09;就必须确定并固定下来&#xff0c;即在使用一个变量前必须显式地声明它地类型一旦声明&…

Mybatis Log Plugin打印日志,会导致CPU升高卡死

原因 大量日志输出:MyBatis Log Plugin 会打印大量的 SQL 日志,包括 SQL 语句及其参数。如果项目中 SQL 查询频繁且复杂,日志量会非常大,导致 CPU 使用率升高,甚至卡死。 日志级别设置不当:如果将日志级别设置为 DEBUG 或 TRACE,MyBatis 会输出非常详细的日志信息,这会…

鸿蒙:深色模式适配和浅色模式的切换

前言&#xff1a; 有些时候我们需要对应用进行深色模式的适配处理&#xff0c;并且在不需要的时候切换到浅色状态&#xff0c;下面和大家一起照着官方文档来学习。 下面是官方文档的链接&#xff1a; https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-dark-…