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

Nginx+Tomcat 负载均衡群集

一、Tomcat 基础与案例部署

(一)Tomcat 概述与应用场景

  1. 起源与命名
    Tomcat 最初由 Sun 公司的詹姆斯・邓肯・戴维森开发,后贡献给 Apache 软件基金会。项目早期名为 “Catalina”,因此安装目录中包含大量与 Catalina 相关的文件(如配置目录、日志文件等)。最终以 “Tomcat”(公猫)命名,其 Logo 也设计为公猫形象。
  2. 定位与功能 124
    Tomcat 是开源的轻量级 Web 应用服务器,主要作为 Servlet 和 JSP 容器,用于处理动态请求(如 Java 后端逻辑)。尽管具备处理 HTML 的能力,但其静态资源处理效率低于 Apache 或 Nginx,因此常与这些服务器配合使用,形成 “前端静态服务器 + 后端 Tomcat” 的架构。
  3. 应用场景 56
    适用于中小型系统和并发用户较少的场景,如 JSP 开发的电子商务网站、企业内部管理系统等。对于访问量较大的生产环境,需结合负载均衡技术扩展。

(二)案例环境与36准备

  1. 环境配置
    • 主机:Tomcat 服务器
    • IP 地址:192.168.10.101
    • 操作系统:OpenEuler24
    • 应用版本:apache-tomcat-9.0.8。
  2. 前置条件 7
    • 关闭防火墙:需停止 firewalld 服务并禁用 SELinux,确保网络通信正常。
    • 安装 JD89K:Tomcat 依赖 Java 运行环境,需提前安装 JDK(本案例使用 1.8.0_171 版本),通过java -version命令验证安装。

(三)Tomca101112t 安装与配置

  1. 安装步骤
    • 解压文件:将 Tomcat 源码包(apache-tomcat-9.0.8.tar.gz)解压到指定目录。
    • 目录移动1314:将解压后的文件夹移动至 /usr/local/,并重命名为 “tomcat9”,便于统一管理。
    • 启动服务1516:通过startup.sh脚本启动 Tomcat,默认监听 8080 端口,使用netstat -anpt | grep 8080命令检查端口状态。
    • 访问测试171819:浏览器输入 “http:// 服务器 IP:8080/”,若出现 Tomcat 欢迎页面,则安装成功。
  2. 主目录结构 2021
    • bin/:存放启动 / 关闭脚本(如 startup.sh、shutdown.sh)。
    • conf22/:包含核心配置文件(如 server.xml、web.xml),用于定义端口、虚拟主机、安全策略等。
    • weba23pps/:默认的 Web 应用部署目录,存放站点文件和应用程序。
    • work24/:存储 JSP 编译生成的 Class 文件。

(四)主配置文件25server.xml 解析

  1. 核心组件架构
    • Server:代表整个 Catalina 容器,包含一个或多个 Service。
    • Serv27ice:由一组 Connector 和一个 Engine 组成,负责处理请求的接收与处理逻辑。
    • Conn28ector:监听特定端口的请求,常见类型包括 HTTP 连接器(默认 8080 端口)和 AJP 连接器(默认 8009 端口,用于与其他服务器通信)。
    • Engi293031ne:管理多个虚拟主机(Host),根据请求域名匹配到对应的 Host 处理。
    • Host32:代表虚拟主机,通过域名绑定部署的 Web 应用(Context),支持 “最长匹配” 规则定位请求路径。
    • Cont3334ext:对应一个 Web 应用,定义应用的文档根目录、访问路径等。
  2. 关键配置示例35
    • 端口修改:在 Connector 标签中调整port属性,如将 HTTP 端口改为 80。
    • 虚拟主机26定义:在 Host 标签中配置name(域名)和appBase(应用根目录),并通过 Context 标签关联物理路径。

(五)建立 Jav3640a Web 站点

  1. 目录与文件创建
    • 在根目录下创建 “/web/webapp1” 作为站点目录,并添加 index.jsp 测试页面,包含动态内容(如out.println输出)和静态图片引用(如 logo.jpg)。
  2. 配置虚拟主机3738
    • 修改 server.xml,在 Host 标签内添加 Context 配置,指定docBase="/web/webapp1"(文档根目录)和path=""(默认访问路径),使站点通过根路径访问。
  3. 验证站点 3940
    • 重启 Tomcat 后,访问 “http:// 服务器 IP:8080/”,应显示 JSP 动态内容,但静态图片因未配置 Nginx 暂无法加载。

二、Nginx+T4142omcat 负载均衡与动静分离

(一)架构设计原理

  1. 负载均衡需求
    单一 Tomcat 服务器存在单点故障风险,且高并发下性能不足。通过 Nginx 作为负载均衡器,将请求分发到多个 Tomcat 实例,可提升系统可用性和吞吐量。
  2. 动静分离优势4445
    • Nginx:擅长处理静态资源(如图片、CSS、JS),支持高并发连接,资源消耗低,可快速响应并缓存静态内容。
    • Tomc4546at:专注于动态请求处理(如 JSP、Servlet),释放计算资源用于业务逻辑。
    • 协作流程46:Nginx 接收所有请求,静态资源直接响应,动态请求(如.jsp 后缀)转发至 Tomcat 集群处理。

(二)案例环境与47准备

  1. 环境配置
    主机IP 地址操作系统应用版本
    Tomcat1192.168.10.101OpenEuler24apache-tomcat-9.0.8
    Tomcat2192.168.10.102OpenEuler24apache-tomcat-9.0.8
    Nginx192.168.10.103OpenEuler24nginx-1.26.3
  2. 前置条件
    48 - Tomcat2 配置:与 Tomcat1 一致,需确保 JDK 版本、Tomcat 版本相同,并在 /web/webapp1 目录下创建 index.jsp,内容修改为 “动态页面 2” 以区分节点。
    • Ngin4950x 依赖:安装编译工具(gcc、make)和依赖库(pcre-devel、zlib-devel 等),用于源码编译安装。

(三)Nginx51安装与配置

  1. 安装步骤
    • 用户创建:添加 “nginx” 用户(不允许登录系统),用于运行 Nginx 服务,提升安全性。
    • 解压编译52:解压 Nginx 源码包,通过./configure命令指定安装路径、用户组和模块(如 SSL、HTTP/2),然后执行make & make install完成安装。
  2. 核心配置文件52
    • 负载均衡组定义:在 nginx.conf 的 http 块中,通过upstream指令定义 Tomcat 服务器列表,weight参数设置权重(本案例均为 1,实现轮询负载均衡)。

      ngi{insert_element_34_}nx

      upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1;
      }
      
    • 动静分离规则
      • 动态请求:通过location ~ \.jsp$匹配所有.jsp 结尾的请求,使用proxy_pass转发至 upstream 定义的 Tomcat 集群,并传递客户端 IP 等头部信息。
      location ~ \.jsp$ {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_pass http://tomcat_server;
      }
      
       
      • 静态资源:通过location ~* \.(gif|jpg|png等)匹配图片、CSS 等静态文件,指定root路径为 Nginx 的 html 目录,并设置expires 30d启用缓存。
      location ~* \.(gif|jpg|png|css|js) {root /usr/local/nginx/html/img;expires 30d;
      }
      
    • 默认站点配置location /规则指定根路径请求返回 Nginx 的默认静态页面(index.html)。

(四)测试与验证57

  1. 静态页面测试
    访问 Nginx 服务器 IP(http://192.168.10.103/),应显示 “静态页面” 内容,表明 Nginx 静态服务正常。
  2. 负载均衡测试5859
    • 访问 “http://192.168.10.103/index.jsp”,刷新页面,观察到动态内容在 “动态页面 1” 和 “动态页面 2” 之间交替显示,证明请求被均匀分发到 Tomcat1 和 Tomcat2。
    • 图片加载验证6061:由于静态图片存储在 Nginx 服务器的 /html/img 目录下,测试页面中的 logo.jpg 应正常显示,体现动静分离效果。

(五)常见问题与62优化

  1. 端口冲突
    • 确保 Tomcat 和 Nginx 使用不同端口(Tomcat 默认 8080,Nginx 默认 80),避免占用同一端口导致服务启动失败。
  2. 缓存策略
    • 对静态资源设置更长的缓存时间(如expires 365d),减少重复请求对服务器的压力。
  3. 健康检查
    • 在 Nginx 的 upstream 配置中添加health_check模块(需编译时启用),定期检测 Tomcat 节点状态,自动剔除故障节点,提升集群稳定性。

三、总结与扩展

(一)架构价值

Nginx 与 Tomcat 的组合充分发挥了两者的优势:Nginx 作为高性能前端网关,处理静态资源和负载均衡;Tomcat 专注于动态业务逻辑,实现 “专业分工”。这种架构显著提升了系统的并发处理能力、响应速度和可用性,是中小型 Web 应用的理想解决方案。

(二)扩展方向

43631. 高可用性

引入 Keepalived 实现 Nginx 节点的主备切换,避免单点故障。

使用 Docker 容器化部署 Tomcat 和 Nginx,结合 Kubernetes 实现动态扩缩容。

  1. 性能优化
    • 启用 Nginx 的 Gzip 压缩功能(在 nginx.conf 中设置gzip on),减少数据传输量。
    • 对 Tomcat 进行 JVM 调优,通过CATALINA_OPTS参数设置堆内存大小,如-Xms1024m -Xmx2048m
  2. 安全增强
    • 在 Nginx 中配置 SSL 证书,启用 HTTPS 加密传输。
    • 通过proxy_redirectproxy_set_header防止 URL 重定向攻击和伪造客户端 IP。

Tomcat 核心配置文件详解

1. server.xml 文件结构与关键标签
  • <Server>:Tomcat 容器的顶层标签,包含一个或多个 <Service>port 属性定义 Tomcat 关闭端口(默认 8005),仅允许本地访问。
  • <Servi{insert\_element\_0\_}ce>:封装 <Connector> 和 <Engine>,一个 Service 可包含多个 Connector,但只能有一个 Engine。
  • <Conne{insert\_element\_1\_}ctor>
    • HTTP 连接器:默认端口 8080,处理浏览器直接发起的 HTTP 请求,协议为HTTP/1.1
    • AJP 连接5器:默认端口 8009,用于与前端服务器(如 Apache/Nginx)通信,传输 Servlet/JSP 请求。
  • <Engin{insert\_element\_3\_}e>:管理虚拟主机(<Host>),负责将请求分发到对应的 Host,defaultHost属性指定默认虚拟主机。
  • <Host>{insert\_element\_4\_}:代表一个虚拟主机,name为域名(如localhost),appBase为 Web 应用部署目录(默认webapps),unpackWARs控制是否自动解压 WAR 包。
  • <Conte{insert\_element\_5\_}xt>:定义单个 Web 应用,docBase指向物理路径,path为访问路径(path=""表示根路径),reloadable设为true时自动检测类文件变化并重启。
2. 动态请求9与静态资源的处理逻辑
  • Tomcat 处理动态请求
    所有 JSP/Servlet 请求由 Tomcat 的 Servlet 容器解析,JSP 会先编译为 Java 类再执行,最终生成 HTML 响应。
  • 静态资源处理局1限
    Tomcat 处理静态文件(如图片、CSS)效率较低,需依赖 Java 线程解析,高并发下易成为性能瓶颈。

Nginx10负载均衡策略与配置实践

1. 负载均衡 upstream 配置
  • 轮询策略(默认)
    不指定权重时,Nginx 按顺序将请求均匀分发到后端服务器,适用于各节点性能一致的场景。

    nginx

    11 upstream tomcat_server {
    server 192.168.10.101:8080;
    server 192.168.10.102:8080;
    }
- **权重轮询(weight)**:  
通过`weight`参数为不同服务器分配处理概率,适用于节点性能差异场景(如高配服务器权重更高)。  
```nginx
{insert\_element\_10\_}  upstream tomcat_server {server 192.168.10.101:8080 weight=2;  # 处理2/3的请求server 192.168.10.102:8080 weight=1;  # 处理1/3的请求
}
2. 动静分离的正则匹配规则
  • 动态请求匹配
    使用正则表达式~ \.jsp$匹配所有以.jsp结尾的 URL,通过proxy_pass转发至 Tomcat 集群。

    nginx

    12 location ~ .jsp$ {

proxy_pass http://tomcat_server;

传递客户端真实 IP 等头部信息

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

- **静态资源匹配**:  
使用`~* \.(gif|jpg|png|css|js)`匹配常见静态文件类型,`root`指定文件存储路径,`expires 30d`设置浏览器缓存30天。  
```nginx
{insert\_element\_12\_}  location ~* \.(gif|jpg|png|css|js) {root /usr/local/nginx/html/img;expires 30d;  # 减少重复请求
}

集群故障排查与测试工具

1. 服务状态检查
  • Tomcat 端口监听
    通过netstat -anpt | grep 8080确认 Tomcat 是否正常启动并监听端口。
  • Nginx 进程3与配置验证
    • ps aux | grep nginx查看主进程和工作进程是否存在。
    • nginx {insert\_element\_14\_}-t校验配置文件语法正确性,避免因配置错误导致服务启动失败。
2. 负载均衡15效果验证
  • curl 命令模拟请求
    使用curl http://192.168.10.103/index.jsp反复请求,观察返回内容是否在 Tomcat1 和 Tomcat2 之间切换。
  • 日志分析
    • Tomcat 日志:查看/usr/local/tomcat9/logs/localhost_access_log.txt,确认请求来源 IP 是否为 Nginx 服务器地址(证明请求由 Nginx 转发)。
    • Nginx 日志:分析/usr/local/nginx/logs/access.log,统计各后端服务器的请求分布比例。

生产环境优化建议

1. Tomcat 性能调优
  • JVM 内存配置
    通过修改CATALINA_OPTS环境变量调整堆内存,例如:

    bash

    export CATALINA_OPTS="-Xms2048m -Xmx4096m -XX:MaxPermSize=512m"
    
     
    • Xms:初始堆大小,建议为物理内存的 1/4。
    • Xmx:最大堆大小,建议不超过物理内存的 3/4。
  • 连接器参数优化
    server.xml中调整 HTTP 连接器参数:

    xml

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  # 连接超时时间(毫秒)maxThreads="500"           # 最大工作线程数minSpareThreads="50"       # 最小空闲线程数maxSpareThreads="100"      # 最大空闲线程数acceptCount="1000"/>      # 等待队列长度
    
2. Nginx 安全加固
  • 禁止直接访问敏感文件
    在 Nginx 配置中添加规则,禁止访问.xml.properties等配置文件:

    nginx

    location ~* \.(xml|properties)$ {deny all;
    }
    
  • 限制并发连接数
    使用limit_conn_zonelimit_conn指令限制单个 IP 的并发连接数,防止 DDoS 攻击:

    nginx

    limit_conn_zone $binary_remote_addr zone=per_ip:10m;  # 创建共享内存区域
    server {limit_conn per_ip 10;  # 每个IP最多保持10个连接
    }
    

常见问题与解决方案

问题现象可能原因解决方法
浏览器访问 Tomcat 显示 404 错误1. 站点目录路径错误
2. Context 配置未生效
检查server.xmldocBasepath是否正确,重启 Tomcat 9
静态图片无法加载(404 错误)1. Nginx 静态资源路径配置错误
2. 文件未正确存放
确认location块中root路径与实际文件路径一致,检查文件权限
13负载均衡未生效(始终访问同一 Tomcat)1. upstream 服务器 IP / 端口错误
2. Nginx 配置未重新加载
使用nginx -s reload刷新配置,检查server节点 IP 是否与 Tomcat 实际 IP 一致
Tomcat 启动后端16口未监听1. 端口被其他进程占用
2. 防火墙未放行
使用fuser -k 8080/tcp杀死占用进程,关闭防火墙或添加端口规则

相关文章:

Nginx+Tomcat 负载均衡群集

一、Tomcat 基础与案例部署 &#xff08;一&#xff09;Tomcat 概述与应用场景 起源与命名 Tomcat 最初由 Sun 公司的詹姆斯・邓肯・戴维森开发&#xff0c;后贡献给 Apache 软件基金会。项目早期名为 “Catalina”&#xff0c;因此安装目录中包含大量与 Catalina 相关的文件…...

SCDN如何同时保障网站加速与DDoS防御?

在互联网时代&#xff0c;网站既要面对用户访问量的激增&#xff0c;又要抵御层出不穷的网络攻击&#xff0c;特别是DDoS攻击的威胁。SCDN&#xff08;安全内容分发网络&#xff09;作为融合加速与安全的解决方案&#xff0c;如何实现“加速”与“防御”的双重保障&#xff1f;…...

Trae CN IDE 中 Python 开发的具体流程和配置总结

以下是 Trae CN IDE 中 Python 开发的具体流程和配置总结,结合实例说明,帮助开发者快速上手: 一、环境准备 1. 安装 Trae CN IDE 下载地址:访问 Trae 官网 下载对应操作系统的安装包(Windows .exe / macOS .dmg / Linux .tar.gz)。安装步骤: Windows:双击 .exe 文件,…...

PostgreSQL不同的等级认证体系

PostgreSQL 专家认证有不同的等级和体系&#xff0c;以工业和信息化部人才交流中心推出的认证为例&#xff0c;分为 PGCA 认证专员、PGCP 认证专家、PGCM 认证大师三个等级。以下是学习建议&#xff1a; 明确学习目标与认证等级 PGCA初级认证专员&#xff1a;适合刚接触 Post…...

项目前置知识——不定参以及设计模式

1.C语言不定参宏函数 c语言中&#xff0c;printf就是一个不定参函数&#xff0c;在使用不定参宏函数时&#xff0c;我们使用__VA_ARGS__来解析不定参&#xff1a; #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…...

04powerbi-度量值-筛选引擎CALCULATE()

1、calculate calculate 的参数分两部分&#xff0c;分别是计算器和筛选器 2、多条件calculater与表筛选 多条件有不列的多条件 相同列的多条件 3、calculatertable &#xff08;表&#xff0c;筛选条件&#xff09;表筛选 与calculate用法一样&#xff0c;可以用创建表&…...

JavaScript排序算法详解:从基础到高级

排序是编程中最基本也是最重要的操作之一。JavaScript作为一门广泛应用于Web开发的语言&#xff0c;提供了内置的排序方法&#xff0c;但了解各种排序算法的原理和实现对于开发者来说仍然至关重要。本文将深入探讨JavaScript中常见的排序算法&#xff0c;帮助您理解它们的原理、…...

chromedriver 下载失败

问题描述 chromedriver 2.46.0 下载失败 淘宝https://registry.npmmirror.com/chromedriver/2.46/chromedriver_win32.zip无法下载 解决方法 找到可下载源 https://cdn.npmmirror.com/binaries/chromedriver/2.46/chromedriver_win32.zip &#xff0c;先将其下载到本地目录(D…...

Weather app using Django - Python

我们的任务是使用 Django 创建一个 Weather 应用程序&#xff0c;让用户可以输入城市名称并查看当前天气详细信息&#xff0c;例如温度、湿度和压力。我们将通过设置一个 Django 项目&#xff0c;创建一个视图来从 OpenWeatherMap API 获取数据&#xff0c;并设计一个简单的模板…...

机器视觉2,硬件选型

机器视觉1&#xff0c;学习了硬件的基本知识和选型&#xff0c;现在另外的教材巩固知识 选相机 工业相机选型的保姆级教程_哔哩哔哩_bilibili 1.先看精度多少mm&#xff0c;被检测物体长宽多少mm》分辨率&#xff0c; 选出合理范围内的相机 2.靶面尺寸&#xff0c;得出分…...

自定义序列生成器之单体架构实现

主键 ID VS 业务 ID 在数据库设计中&#xff0c;除了主键 ID&#xff0c;一般还需要一个具有唯一索引的业务 ID。二者承担的职责不一样&#xff0c;它们共同满足了我们对于 技术实现 和 业务需求 的双重目标 1. 职责分离原则 主键 ID 业务唯一标识 ID 作用 保证数据库层面…...

电阻电容的选型

一、电阻选型 1.1安装方式 贴片电阻体积小&#xff0c;适用于SMT生产&#xff1b;功率小&#xff1b;易拆解插件电阻体积大&#xff1b;功率大&#xff1b;不易脱落 1.2阻值 电阻的阻值是离散的&#xff0c;其标称阻值根据精度分为E6、E12、E24、E48、E96、E192六大系列&am…...

12.springCloud AlibabaSentinel实现熔断与限流

目录 一、Sentinel简介 1.官网 2.Sentinel 是什么 3.Sentinel 的历史 4.Sentinel 基本概念 资源 规则 5.Sentinel 功能和设计理念 (1).流量控制 什么是流量控制 流量控制设计理念 (2).断降级 什么是熔断降级 熔断降级设计理念 (3).系统自适应保护 6.主要工作机制…...

Cookie 和 Session:Web 身份验证的核心机制

文章目录 一、Cookie&#xff1a;客户端存储的小数据块**核心特性****典型应用场景**二、Session&#xff1a;服务器端的会话存储**核心特性****典型应用场景**三、Cookie vs Session&#xff1a;核心区别对比四、最佳实践与扩展 一、Cookie&#xff1a;客户端存储的小数据块 …...

vSOME/IP与ETAS DSOME/IP通信的问题解决方案

✅ 一、服务版本不匹配导致 Handover 问题 —— 需要更新 VSOMEIP 代码逻辑 📌 问题描述: 在 SOME/IP 通信中,发布者(offer)与订阅者(subscribe)之间存在服务版本不一致的问题,导致 Handover(切换)失败。 ✅ 解决方案: 需要在 offer_service 和 subscribe 接口中…...

修改vscode切换上一个/下一个标签页快捷键

装了vim后一直没找到切tab页的快捷键 Code>Preferences>Keyboard Shortcuts on macOS 搜索这2个选项 我设置成了commandh 向前切换&#xff0c;commandl向后切换&#xff0c;贴合vim的方向设置 workbench.action.previousEditor commandh workbench.action.nextEdit…...

三大中文wordpress原创主题汉主题

汉主题 汉主题是一款极具特色的 WordPress 主题&#xff0c;由国内专业团队精心打造&#xff0c;专为中文用户设计。其设计灵感源自博大精深的汉文化&#xff0c;将传统文化元素与现代网页设计理念巧妙融合&#xff0c;呈现出独特而典雅的风格。无论是用于个人博客展示文学创作…...

软考-系统架构设计师-第十五章 信息系统架构设计理论与实践

信息系统架构设计理论与实践 15.2 信息系统架构风格和分类15.3 信息系统常用的架构模型15.4 企业信息系统总体框架15.5 信息系统架构设计方法 15.2 信息系统架构风格和分类 信息系统架构风格 数据流体系结构风格&#xff1a;批处理、管道-过滤器调用/返回体系结构风格&#x…...

Redis缓存-数据淘汰策略

数据淘汰策略就是&#xff0c;当redis内存满的时候&#xff0c;此时在向redis添加新的key&#xff0c;那么redis会按照某一种规则将内存中的数据删掉&#xff0c;这种删除数据的规则成为内存的淘汰策略。 redis支持8中淘汰策略 1.noeviction&#xff0c;这种是redis默认的情况…...

52. N 皇后 II【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 52. N 皇后 II 一、题目描述 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。【补充&#xff1a;不能互相攻击就是要求一个皇后的…...

MySQL 8 完整安装指南(Ubuntu 22.04)

MySQL 8 完整安装指南&#xff08;Ubuntu 22.04&#xff09; 本教程详细说明如何在 Ubuntu 22.04 上安装和配置 MySQL 8&#xff0c;包含安全优化及远程访问设置。 1️⃣ 添加 MySQL 官方 APT 仓库 官网仓库下载地址&#xff1a;MySQL APT 仓库下载页 下载仓库配置包&#…...

C++ 标准输入输出 -- <iostream>

<iostream>库是 C++ 标准库中用于输入输出操作的头文件。 <iostream> 定义了几个常用的流类和操作符,允许程序与标准输入输出设备(如键盘和屏幕)进行交互。 以下是<iostream>库的详细使用说明,包括其主要类和常见用法示例。 主要类 std::istream:用于…...

记一次sql按经纬度计算距离

具体代码&#xff1a; ROUND函数在mysql可以用来计算经纬度&#xff0c;代码如下&#xff1a; SELECTa.store_name_sfa as storeName,a.storeid_sfa as store_id,a.link_man_sfa as link_man,a.link_phon_sfa as link_phone,a.photo as image_url,a.district,a.street,ROUND(6…...

安卓jetpack compose学习笔记-UI基础学习

哲学知识应该用哲学的方式学习&#xff0c;技术知识也应该用技术的方式学习。没必要用哲学的态度来学习技术。 学完安卓技术能做事就ok了&#xff0c;安卓技术肯定是有哲学的&#xff0c;但是在初学阶段没必要讨论什么安卓哲学。 学习一们复杂技术的路径有很多&#xff0c;这里…...

线性回归用于分类

线性回归本身是一种用于回归问题的技术&#xff0c;即预测一个连续的目标变量值。然而&#xff0c;线性回归也可以被改造或结合其他技术来用于分类问题&#xff0c;尽管这不是其最直接或最常见的用途。以下是几种将线性回归应用于分类问题的方法或相关概念&#xff1a; 阈值划分…...

解锁电商新势能:商城系统自动 SaaS 多开功能深度解析

在电商行业加速向精细化、多元化运营转型的当下&#xff0c;传统的商城系统部署模式已难以满足企业快速拓展业务的需求。此时&#xff0c;商城系统自动 SaaS 多开功能横空出世&#xff0c;以智能、高效、灵活的特性&#xff0c;成为众多电商企业突破发展瓶颈的关键利器。这一功…...

蓝桥杯_DS18B20温度传感器---新手入门级别超级详细解析

目录 一、引言 DS18B20的原理图 单总线简介&#xff1a; ​编辑暂存器简介&#xff1a; DS18B20的温度转换与读取流程 二、代码配置 maic文件 疑问 关于不同格式化输出符号的使用 为什么要rd_temperature()/16.0&#xff1f; onewire.h文件 这个配置为什么要先读lo…...

C++中锁与原子操作的区别及取舍策略

文章目录 锁与原子操作的基本概念锁&#xff08;Lock&#xff09;原子操作&#xff08;Atomic Operations&#xff09; 锁与原子操作的区别1. **功能**2. **性能**3. **复杂性**4. **适用场景** 锁与原子操作的取舍策略1. **简单变量操作**2. **复杂共享资源**3. **性能敏感场景…...

ESP32对接巴法云实现配网

目录 序言准备工作巴法云注册与使用Arduino准备 开发开始配网 序言 本文部分内容摘抄原创作者巴法云-做优秀的物联网平台 代码有部分修改并测试运行正常 巴法云支持免费用户通过开发对接实现各智能音箱设备语音控制智能家居设备&#xff0c;并有自己的App进行配网和控制&…...

《深度剖析:基于Meta的GameFormer构建自博弈AI游戏代理》

自博弈AI游戏代理&#xff0c;是一种具备自主学习和自我提升能力的人工智能系统。它打破了传统AI依赖预设规则和固定策略的局限&#xff0c;能够在游戏过程中不断与自身进行对战&#xff0c;通过反复博弈来积累经验、优化策略&#xff0c;从而实现智能水平的持续提升 。这种独特…...