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

Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

  • 一: `server.xml` 配置文件
    • 1)`Server` 节点
    • 2)`Listener` 节点
    • 3)`GlobalNamingResources` 节点
    • 4)`Service` 节点
    • 5)`Connector` 节点
    • 6)`Engine` 节点
    • 7)`Host` 节点
  • 二:端口
    • 1)**8005:关闭端口(Shutdown Port)**
    • 2)**8080:HTTP 端口**
    • 3)**8443:HTTPS 端口**
    • 4)**8009:AJP 端口**
  • 三:规范 tomcat 访问日志格式
  • 四:部署 `zrlog` 应用
    • 1)环境准备
    • 2)部署 `MySQL`
    • 3)部署 `Tomcat`
    • 4)部署 `Nginx`
    • 5)**访问**
  • 五:Tomcat + Nginx 动静分离
    • 1)概述
    • 2)部署
  • 六:Tomcat + HTTPS
    • 1)概述
    • 2)部署
  • 七:Tomcat 多实例
    • 1)概述
    • 2)部署
  • 总结


🚀 Tomcat 系列文章导航
本系列系统讲解 Linux 环境下 Apache Tomcat 的部署、配置、管理与优化,并最终带你完成 企业级前后端分离项目上线。无论你是初学者还是想进阶的运维人员,这份路线图都能帮你快速构建完整的知识体系。

⚠️ 该系列所有涉及的软件包和项目都可以私信博主免费获取

  • 👉 第一部分:Tomcat 核心概念与基础部署
  • 👉 第二部分:Tomcat 系统化管理与应用部署
  • 👉 第三部分:Tomcat 配置解析与集群化部署
  • 👉 第四部分:Tomcat 企业级监控
  • 👉 第五部分:Tomcat 优化和安全加固
  • 👉 第六部分:综合项目实战:Java 前后端分离架构部署

一: server.xml 配置文件

1)Server 节点

<Server port="8005" shutdown="SHUTDOWN">
  • 作用:定义 Tomcat 服务器的最外层容器。
  • port=“8005”:这是 关闭端口,当有人本地连接这个端口并输入字符串 SHUTDOWN 时,Tomcat 就会安全关闭。
  • shutdown=“SHUTDOWN”:规定关闭指令,默认是字符串 SHUTDOWN,可以修改。

2)Listener 节点

<Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />	
  • 作用:这些是监听器,在 Tomcat 启动或运行时监听并执行一些特定任务。常见功能:
    • VersionLoggerListener:输出 Tomcat 版本、JVM 版本、操作系统信息。
    • AprLifecycleListener:检测并初始化 APR(Apache Portable Runtime),提高性能和 SSL 支持。
    • JreMemoryLeakPreventionListener:防止某些 JRE 类库引起的内存泄漏。
    • GlobalResourcesLifecycleListener:初始化全局 JNDI 资源。
    • ThreadLocalLeakPreventionListener:减少 ThreadLocal 引起的内存泄漏。

3)GlobalNamingResources 节点

<GlobalNamingResources><Resource name="UserDatabase" auth="Container"type="org.apache.catalina.UserDatabase"description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
  • 作用:配置全局的 JNDI 资源。

  • 这里的 Resource:定义了一个用户数据库 UserDatabase,数据存放在 conf/tomcat-users.xml

  • 这个数据库主要用于 Tomcat 管理后台(/manager, /host-manager) 的认证。

4)Service 节点

<Service name="Catalina">
  • 作用:一个 Service = 一组连接器(Connector) + 一个引擎(Engine)

  • name=“Catalina”:这是默认的 Service 名字。

5)Connector 节点

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
  • 作用:定义 Tomcat 如何接收请求。
  • port=“8080”:接收 HTTP 请求的端口。
  • protocol=“HTTP/1.1”:采用 HTTP/1.1 协议。
  • connectionTimeout=“20000”:连接超时 20 秒。
  • redirectPort=“8443”:如果应用要求安全(HTTPS),Tomcat 会把请求重定向到 8443 端口。

6)Engine 节点

<Engine name="Catalina" defaultHost="localhost">
  • 作用:处理来自 Connector 的请求。

  • defaultHost=“localhost”:指定默认虚拟主机。

Realm(认证域)

<Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/>
</Realm>
  • 作用:用户认证与授权机制。
  • UserDatabaseRealm:使用前面定义的 UserDatabasetomcat-users.xml)来校验用户。
  • LockOutRealm:防止密码爆破(例如连续输错几次账号就会暂时锁定)。

7)Host 节点

<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">
  • 作用:定义一个虚拟主机(相当于 Apache/Nginx 的虚拟主机)。

  • name=“localhost”:域名是 localhost

  • appBase=“webapps”:应用的目录(默认在 webapps 下)。

  • unpackWARs=“true”:部署时会解压 .war 文件。

  • autoDeploy=“true”:支持热部署,直接放到 webapps 就会加载。

Valve(阀门)

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  • 作用:类似过滤器,可以对请求进行拦截、记录。
  • AccessLogValve:访问日志组件。
  • pattern:定义日志格式(客户端IP、用户、时间、请求内容、状态码、响应大小等)。
  • 日志会写到 logs/localhost_access_log*.txt
# vim conf/server.xml<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><GlobalNamingResources><Resource name="UserDatabase" auth="Container"type="org.apache.catalina.UserDatabase"description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" /></GlobalNamingResources><Service name="Catalina">  <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host></Engine></Service>
</Server>

二:端口

⚠️ 很多人初学 Tomcat 都以为只有 8080,其实 Tomcat 内部默认会开多个端口,各自有不同作用:

1)8005:关闭端口(Shutdown Port)

  • 作用:专门用来关闭 Tomcat 的。

  • server.xml 里配置:

    <Server port="8005" shutdown="SHUTDOWN">
    
  • 如果有人(通常是本地)连接 8005 端口并发送字符串 SHUTDOWN,Tomcat 就会安全关闭。

  • ⚠️ 安全风险:生产环境常常 禁用/修改 这个端口,否则可能被恶意关闭。

2)8080:HTTP 端口

  • 作用:这是最常见的端口,处理普通 HTTP 请求。

  • 浏览器访问 http://localhost:8080/,就是通过这个端口。

  • server.xml 中:

    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
    

3)8443:HTTPS 端口

  • 作用:处理 HTTPS(加密的 HTTP)请求。
  • 一般情况下你配置了 SSL 证书,Tomcat 就会监听 8443,用来接收 HTTPS 连接。
  • 如果在 8080 配置了 redirectPort="8443",当应用要求安全访问时,Tomcat 会把请求重定向到 8443

4)8009:AJP 端口

  • AJP (Apache JServ Protocol)

    • 一种二进制协议,效率比 HTTP 高。
    • 主要用于 Apache HTTPD / Nginx 等 Web 服务器和 Tomcat 通信。
    • 好处:前端 Apache 接收请求 → 转发给 Tomcat,能做负载均衡、安全控制等。
  • server.xml 中原本会有:

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
  • 从 Tomcat 8.5 之后

    • 默认 注释掉/禁用 了 8009,
    • 因为过去曾爆出 Ghostcat 漏洞(CVE-2020-1938),攻击者可通过 8009 读取 Tomcat 文件甚至执行代码。

三:规范 tomcat 访问日志格式

说明tomcatnginx
定义访问日志的格式Host 部分的pattern 定义http 区域 log_format 部分
客户端 ip 地址%h$remote_addr
访问的时间%t$local_time
请求起始行%r$request
状态码%s$status
大小%b$body_bytes_sent
从哪里跳转来的(用户如何访问网站)%{Referer}i$http_referer
客户端类型,浏览器%{User-Agent}i$http_user_agent
XFF 头记录%{X-Forwarded-For}i$http_x_forwarded_for
pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{Referer}i&quot;&quot;%{User-Agent}i&quot; &quot;%{X-Forwarded-For}i&quot;" />

四:部署 zrlog 应用

1)环境准备

角色主机外网IP内网IP
MySQLdb01192.168.2.109172.16.1.109
Tomcat + Nginx + zrlogweb01192.168.2.104172.16.1.104

2)部署 MySQL

  1. 连接数据库

    [root@db01 ~]# mysql -u root -p
    Enter password: # 123456
    
  2. 创建数据库

    MariaDB [(none)]> create database zrlog;
    Query OK, 1 row affected (0.00 sec)
    
  3. 赋予权限

    MariaDB [(none)]> grant all on zrlog.* to 'zrlog'@'172.16.1.%' identified by 'zrlog';
    Query OK, 0 rows affected (0.00 sec)
    
  4. 验证

    MariaDB [(none)]> select user, host, password from mysql.user;
    +------------+------------+-------------------------------------------+
    | user       | host       | password                                  |
    +------------+------------+-------------------------------------------+
    | root       | localhost  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | root       | 127.0.0.1  | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | root       | ::1        | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
    | zrlog      | 172.16.1.% | *09CB1653907CD6E8B66284F7442626F9A83E9F32 |
    +------------+------------+-------------------------------------------+
    4 rows in set (0.00 sec)
    

3)部署 Tomcat

  1. 上传站点代码

    [root@web01 ~]# mv /opt/software/zrlog-2.2.1-efbe9f9-release.war /opt/software/zrlog.war
    
  2. 部署代码

    [root@web01 ~]# mv /opt/software/zrlog.war /opt/module/tomcat-8.5.87/webapps/
    

    在这里插入图片描述

  3. 启动 tomcat 服务

    [root@web01 ~]# systemctl start tomcat
    
  4. 浏览器安装

    http://192.168.2.104:8080/zrlog/install/

    在这里插入图片描述

4)部署 Nginx

  1. 编辑 zrlog.conf 文件

    [root@web01 ~]# vim /etc/nginx/conf.d/zrlog.conf
    
    server {listen 80;server_name zrlog.cn;error_log /var/log/nginx/zrlog-error.log notice;access_log /var/log/nginx/zrlog-access.log main;location / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
    }
    
  2. 刷新 Nginx

    [root@web01 ~]# nginx -t
    [root@web01 ~]# nginx -s reload
    
  3. 配置 hosts

    192.168.2.104 zrlog.cn
    

5)访问

  • 用户端访问

    http://zrlog.cn/zrlog/

    在这里插入图片描述

  • 管理端访问

    http://zrlog.cn/zrlog/admin/

    在这里插入图片描述


五:Tomcat + Nginx 动静分离

1)概述

📖Tomcat:主要用于处理动态请求(Java Servlet、JSP)。

📖Nginx:作为前端服务器,处理静态资源请求(HTML、CSS、JS、图片等),并将动态请求反向代理给 Tomcat。

目的:减轻 Tomcat 压力,提高静态资源访问速度,方便后续代码拆分和维护

2)部署

  1. 修改访问权限

    确保 nginx 用户 有权限访问 Tomcat 的 Web 应用目录

    # 修改整个 webapps 目录所属为 nginx 用户
    [root@web01 ~]# chown -R nginx:nginx /opt/module/tomcat-8.5.87/webapps/# 修改目录权限
    [root@web01 ~]# chmod 755 /opt/module/tomcat-8.5.87/webapps/
    [root@web01 ~]# chmod -R 755 /opt/module/tomcat-8.5.87/webapps/zrlog# 普通文件 644,目录 755
    [root@web01 ~]# find /opt/module/tomcat-8.5.87/webapps/ -type f | xargs chmod 644
    [root@web01 ~]# find /opt/module/tomcat-8.5.87/webapps/ -type d | xargs chmod 755
    
  2. 编辑 zrlog.conf 文件

    zrlog 应用配置虚拟主机,静态资源交由 Nginx 处理,其余动态请求转发到 Tomcat

    [root@web01 ~]# vim /etc/nginx/conf.d/zrlog.conf
    
    server {listen 80;server_name zrlog.cn;error_log /var/log/nginx/zrlog-error.log notice;access_log /var/log/nginx/zrlog-access.log main;# 动态请求 -> Tomcatlocation / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 静态资源 -> 直接由 Nginx 处理location ~* \.(html|js|css|png|jpeg|bmp|webp)$ {root /opt/module/tomcat-8.5.87/webapps/zrlog;expires 7d;   # 缓存 7 天}
    }
    
  3. 刷新 Nginx

    [root@web01 ~]# nginx -t
    [root@web01 ~]# nginx -s reload
    

六:Tomcat + HTTPS

1)概述

  • Tomcat 本身支持 HTTPS,可以在 server.xml 中直接配置证书。
  • 实际生产中,更推荐在 Nginx 层配置证书,Tomcat 只跑 HTTP(未加密),由 Nginx 做 TLS 终结,性能更好。

2)部署

  1. 上传证书 → 修改 server.xml → 配置 HTTPS Connector
  2. 支持 PFX / JKS 格式证书
  3. 重启 Tomcat 后验证 8443 端口
  4. 可选:配置 web.xml 实现 HTTP 跳转 HTTPS
  1. 创建证书目录

    [root@web01 ~]# mkdir -p /opt/module/cert/tomcat
    
  2. 创建自签名证书

    keytool 是 JDK 自带的证书工具,可以直接生成 JKS/PKCS12 格式的证书文件

    参数说明:

    • -alias tomcat:证书别名
    • -keyalg RSA:加密算法
    • -keysize 2048:密钥长度
    • -validity 365:证书有效期(天)
    • -keystore:证书保存路径(JKS/PKCS12 文件)
    • -storepass:keystore 密码
    • -keypass:私钥密码
    • -dname:证书的身份信息(常用 CN=域名,其他随意)
    # 生成 JKS 
    [root@web01 ~]# keytool -genkeypair \-alias zrlog \-keyalg RSA \-keysize 2048 \-validity 365 \-keystore /opt/module/cert/tomcat/zrlog.keystore \-storepass 123456 \-keypass 123456 \-dname "CN=zrlog.cn, OU=IT, O=MyCompany, L=Beijing, ST=Beijing, C=CN"
    
    # 转换为 PKCS12
    [root@web01 ~]# keytool -importkeystore \-srckeystore /opt/module/cert/tomcat/zrlog.keystore \-destkeystore /opt/module/cert/tomcat/zrlog.pfx \-deststoretype pkcs12 \-srcstorepass 123456 \-deststorepass 123456
    
  3. 修改 server.xml 配置

    • port="8443" → HTTPS 端口

    • keystoreFile → 证书路径

    • keystoreType → 证书类型(PKCS12 / JKS,JKS 格式配置时,去掉 keystoreType="PKCS12" 即可)

    • keystorePass → 证书密码

    [root@web01 ~]# vim /opt/module/tomcat-8.5.87/conf/server.xml
    
        <Connector port="8443"protocol="HTTP/1.1"SSLEnabled="true"scheme="https"secure="true"keystoreFile="/opt/module/cert/tomcat/zrlog.pfx"keystoreType="PKCS12"keystorePass="123456"clientAuth="false"SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3"ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
    

    在这里插入图片描述

  4. 配置 HTTP 自动跳转 HTTPS(可选)

    [root@web01 ~]# vim /opt/module/tomcat-8.5.87/conf/server.xml
    
    <login-config><auth-method>CLIENT-CERT</auth-method><realm-name>Client Cert Users-only Area</realm-name>
    </login-config><security-constraint><web-resource-collection><web-resource-name>ssl</web-resource-name><url-pattern>/*</url-pattern></web-resource-collection><user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint>
    </security-constraint>
    

    在这里插入图片描述

  5. 重启 Tomcat

    [root@web01 ~]# systemctl restart tomcat
    
  6. 验证

    [root@web01 ~]# ss -lntup | grep 8443
    tcp    LISTEN     0      100    [::]:8443               [::]:*                   users:(("java",pid=130829,fd=57))
    


七:Tomcat 多实例

1)概述

  • Tomcat 多实例:在同一台 Linux 主机上运行多个 Tomcat 进程,每个实例独立运行、互不干扰。
  • 目的
    • 充分利用服务器资源
    • 一个实例挂掉不影响其他实例
    • 支持不同应用独立运行、隔离管理

2)部署

  1. 解压 JDK 二进制包

    [root@web02 ~]# tar -xzvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
    
  2. 解压 Tomcat 二进制包

    [root@web02 ~]# tar -xzvf /opt/software/apache-tomcat-8.5.87.tar.gz -C /opt/module/
    
  3. 准备两个 Tomcat

    [root@web02 ~]# cd /opt/module[root@web02 module]# mv apache-tomcat-8.5.87/ tomcat1[root@web02 module]# cp -r tomcat1 tomcat2
    
  4. 修改 server.xml 文件

    每个实例的 conf/server.xml 里需要修改端口,避免冲突

    [root@web02 module]# sed -i 's#8005#8006#g' tomcat1/conf/server.xml 
    [root@web02 module]# sed -i 's#8080#8081#g' tomcat1/conf/server.xml[root@web02 module]# sed -i 's#8005#8007#g' tomcat2/conf/server.xml 
    [root@web02 module]# sed -i 's#8080#8082#g' tomcat2/conf/server.xml
    
  5. 创建管理用户

    [root@web02 ~]# useradd -Ms /sbin/nologin tomcat
    
  6. 修改 tomcat1tomcat2 所属

    [root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat1[root@web02 ~]# chown -R tomcat:tomcat /opt/module/tomcat2
    
  7. 创建 tomcat1.servicetomcat2.service

    [root@web02 ~]# vim /etc/systemd/system/tomcat1.service
    
    [Unitt]
    Description=Tomcat java web container
    After=network.target[Service]
    Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖)
    Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本
    ExecStart=/opt/module/tomcat1/bin/startup.sh
    ExecStop=/opt/module/tomcat1/bin/shutdown.sh# 运行身份(推荐非 root)
    User=tomcat
    Group=tomcat[Install]
    WantedBy=multi-user.target
    
    [root@web02 ~]# vim /etc/systemd/system/tomcat2.service
    
    [Unitt]
    Description=Tomcat java web container
    After=network.target[Service]
    Type=forking# 设置环境变量(如 JAVA_HOME 或其他依赖)
    Environment=JAVA_HOME=/opt/module/jdk1.8.0_212# 指定启动与关闭脚本
    ExecStart=/opt/module/tomcat2/bin/startup.sh
    ExecStop=/opt/module/tomcat2/bin/shutdown.sh# 运行身份(推荐非 root)
    User=tomcat
    Group=tomcat[Install]
    WantedBy=multi-user.target
    
  8. 重新加载 systemctl 配置

    [root@web02 ~]# systemctl daemon-reload
    
  9. 启动服务

    [root@hadoop105 module]# systemctl start tomcat1.service 
    [root@hadoop105 module]# systemctl start tomcat2.service 
    

    在这里插入图片描述


总结

📌 本节重点回顾

  • server.xml 配置解析

    • 掌握了 Server / Service / Connector / Engine / Host 五大核心节点及其常用配置。

    • 重点理解 Connector 端口(8005/8080/8443/8009) 的作用与安全风险。

    • 熟悉 Realm、Valve、Listener 等功能组件。

  • 日志与端口管理

    • 学会了 规范 Tomcat 访问日志格式,并对比了 Tomcat 与 Nginx 日志字段。

    • 明确了 Tomcat 默认端口的用途及生产环境的调整建议。

  • 应用部署与优化

    • 完成了 zrlog 博客系统 在 Tomcat 上的部署,并结合 Nginx 实现动静分离。

    • 掌握了 Tomcat HTTPS 配置(证书生成、导入、配置、启用)。

    • 能在同一主机上运行 多实例 Tomcat,实现应用隔离与高可用。

至此,你已经掌握了 Tomcat 配置解析、应用部署、动静分离、HTTPS、安全与多实例管理 等企业级运维必备技能。
下一篇我们将进入 Tomcat 企业级监控,迈向真正的生产级环境!

http://www.dtcms.com/a/358462.html

相关文章:

  • Qt实战:如何打开摄像头并实现视频的实时预览
  • 生成式 AI 重构内容生产:效率提升背后的创作版权边界争议
  • react虚拟列表实现及原理
  • leetcode2(移除元素)
  • 本地部署音效生成器 Moodist 并实现外部访问
  • Spring Cloud 和 Dubbo 是目前主流的两大微服务框架,分别代表了两种不同的技术路线
  • HarmonyOS 应用开发:基于API 12及以上的现代化实践
  • I2C多点触控驱动开发详解
  • Elasticsearch logsdb 索引模式和 TSDS 的业务影响
  • 【小白笔记】基本的Linux命令来查看服务器的CPU、内存、磁盘和系统信息
  • 网络编程4-并发服务器、阻塞与非阻塞IO、信号驱动模型、IO多路复用..
  • MQTT 连接建立与断开流程详解(二)
  • 项目管理在企业中的作用
  • 小迪Web自用笔记7
  • Redission 实现延迟队列
  • 鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
  • Notepad++常用设置
  • 金仓数据库迁移评估系统(KDMS)V4正式上线,助力企业高效完成数据库国产化替代
  • 果蔬采摘机器人:自动驾驶融合视觉识别,精准定位,高效作业
  • 【SoC】【W800】基于W800的PWM实现
  • 类和反射的机制
  • hashmap计算key的hash的时候为什么要右移16位
  • 鸿蒙ArkTS 核心篇-16-循环渲染(组件)
  • Ruoyi-vue-plus-5.x第一篇Sa-Token权限认证体系深度解析:1.3 权限控制与注解使用
  • 【计算机组成原理】LRU计数器问题
  • Vue3 + GeoScene 地图点击事件系统设计
  • Selenium + PO 框架进阶实践:接入 Allure 报告与 Jenkins 持续集成
  • macOs上ffmpeg带入libx264库交叉编译
  • docker 启动一个clickhouse , docker 创建ck数据库
  • Python远程文件管理移动端适配与跨平台优化实战