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

Docker Swarm 搞定高可用集群,生产环境再也不怕服务挂掉了

Docker Swarm是什么Docker Swarm 是 Docker 官方推出的容器集群管理工具基于 Go 语言实现。代码开源在https://github.com/docker/swarm 使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机快速打造一套容器云平台。Docker Swarm 是生产环境中运行 Docker 应用程序最简单的方法。作为容器集群管理器Swarm 最大的优势之一就是 100% 支持标准的 Docker API。各种基于标准 API 的工具比如 Compose、docker-py、各种管理软件甚至 Docker 本身等都可以很容易的与 Swarm 进行集成。大大方便了用户将原先基于单节点的系统移植到 Swarm 上同时 Swarm 内置了对 Docker 网络插件的支持用户可以很容易地部署跨主机的容器集群服务。Docker Swarm 和 Docker Compose 一样都是 Docker 官方容器编排工具但不同的是Docker Compose是一个在单个服务器或主机上创建多个容器的工具而Docker Swarm则可以在多个服务器或主机上创建容器集群服务对于微服务的部署显然 Docker Swarm 会更加适合。为什么选 Docker Swarm 而不是 K8s说实话Kubernetes 确实强大但对我们这种中小团队来说K8s 的学习成本和维护成本都太高了。光是搭建一套高可用的 K8s 集群就得折腾好几天更别说日常维护了。Docker Swarm 就不一样了它是 Docker 原生自带的编排工具学过 Docker 的基本上一个小时就能上手。而且功能足够强大服务发现、负载均衡、滚动更新、健康检查这些该有的都有完全能满足大部分生产场景的需求。客户现在的业务规模大概有 30 多个微服务每天访问量在百万级别用 Docker Swarm 完全够用。如果你的规模跟我差不多真心建议别一上来就搞 K8sSwarm 真的够用了。环境准备5 台服务器配置如下3 台 Manager 节点16G 内存4 核 CPU2 台 Worker 节点8G 内存2 核 CPU为什么 Manager 要 3 台这个后面会详细说。系统用的是 CentOS 7.9Docker 版本是 20.10.14。在开始之前有几件事得先做好1. 主机名和 hosts 配置每台机器都要设置不同的主机名不然等会儿集群建起来都叫 localhost看着就头疼。# 在 manager1 上执行hostnamectl set-hostname manager1# 其他机器类似改成 manager2、manager3、worker1、worker2然后修改 /etc/hosts 文件把所有节点的 IP 和主机名都写进去192.168.1.101 manager1 192.168.1.102 manager2 192.168.1.103 manager3 192.168.1.104 worker1 192.168.1.105 worker22. 关闭防火墙或者开放端口Docker Swarm 需要几个端口2377/tcp集群管理通信7946/tcpudp节点间通信4789/udp覆盖网络流量生产环境建议还是开防火墙只开放这些端口。测试环境图省事直接关了也行systemctl stop firewalld systemctl disable firewalld3. 时间同步这个特别重要如果节点时间不同步集群选举会出问题服务调度也会乱套。我们用 chrony 做时间同步yuminstall-ychrony systemctl start chronyd systemctlenablechronyd初始化 Swarm 集群准备工作做完了现在开始正式搭建集群。在 manager1 上执行初始化命令dockerswarm init --advertise-addr192.168.1.101执行完会输出一串命令大概是这样的Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssm7h7g6w7br5d7vwlh 192.168.1.101:2377 To add a manager to this swarm, run docker swarm join-token manager and follow the instructions.这个 token 特别重要一定要保存好后面添加节点都要用它。现在集群已经有一个 Manager 节点了查看一下集群状态dockernodels输出类似这样ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader 20.10.14能看到 manager1 是 Leader 状态。添加其他 Manager 节点前面说了要用 3 个 Manager 节点为什么要奇数个这个跟 Raft 共识算法有关。Docker Swarm 用 Raft 算法来管理集群状态需要半数以上的 Manager 节点在线才能正常工作。如果你有 2 个 Manager挂掉 1 个剩下 1 个不满足半数以上的条件集群就不可用了。但如果是 3 个 Manager挂掉 1 个剩下 2 个还能正常工作。所以奇数个 Manager 是最佳实践一般 3 个就够用了能容忍 1 个节点故障。如果想要更高的容错能力可以用 5 个能容忍 2 个节点故障。[2]在 manager1 上获取 Manager 加入令牌dockerswarm join-token manager会输出一个命令复制到 manager2 和 manager3 上执行dockerswarmjoin--tokenSWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssm7h7g6w7br5d7vwlh192.168.1.101:2377执行完后再看集群状态dockernodelsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader 20.10.14 rfm5vi4vpxpmhjw6vz0t4wqdv manager2 Ready Active Reachable 20.10.14 y6jcg5z4m7x0tz1f0qz3n5k8s manager3 Ready Active Reachable 20.10.14看到 3 个 Manager 都在线了manager1 是 Leader其他两个是 Reachable 状态。添加 Worker 节点Worker 节点只负责运行容器不参与集群管理。在 manager1 上获取 Worker 加入令牌dockerswarm join-token worker复制输出的命令到 worker1 和 worker2 上执行dockerswarmjoin--tokenSWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssm7h7g6w7br5d7vwlh192.168.1.101:2377再看集群状态dockernodelsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader 20.10.14 rfm5vi4vpxpmhjw6vz0t4wqdv manager2 Ready Active Reachable 20.10.14 y6jcg5z4m7x0tz1f0qz3n5k8s manager3 Ready Active Reachable 20.10.14 n8xkp2z3m5q1rt7v9w2j4h6c0 worker1 Ready Active 20.10.14 t3h7m9k2p8q5wv1n4x6j0r2b8 worker2 Ready Active 20.10.145 个节点的集群就搭建完成了。创建覆盖网络集群搭好了但服务之间怎么通信呢这就需要创建覆盖网络Overlay Network。覆盖网络允许不同节点上的容器互相通信就像在同一个局域网里一样。dockernetwork create--driveroverlay--attachablemy-overlay--attachable参数很重要它允许独立容器连接到这个网络。如果不加这个参数只有 Swarm 服务才能用这个网络。查看网络dockernetworklsNETWORK ID NAME DRIVER SCOPE n33wq0p5m6q7 ingress overlay swarm r2t5v8x1p4m9 my-overlay overlay swarm部署一个测试服务光搭集群没意思咱们部署一个实际的服务试试。我这里用 Nginx 做演示部署 3 个副本dockerservicecreate\--namenginx-test\--replicas3\--networkmy-overlay\--publish80:80\nginx:latest参数解释一下--name服务名称--replicas副本数量这里启动 3 个容器--network使用的网络--publish端口映射把容器的 80 端口映射到宿主机的 80 端口查看服务状态dockerservicelsID NAME MODE REPLICAS IMAGE PORTS k8z2m9p4n7q1 nginx-test replicated 3/3 nginx:latest *:80-80/tcpREPLICAS 显示 3/3说明 3 个副本都正常运行。查看服务详情dockerservicepsnginx-testID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS t3h7m9k2p8q5 nginx-test.1 nginx:latest worker1 Running Running 2 minutes ago r2t5v8x1p4m9 nginx-test.2 nginx:latest manager2 Running Running 2 minutes ago n8xkp2z3m5q1 nginx-test.3 nginx:latest worker2 Running Running 2 minutes ago能看到 3 个容器分别运行在 worker1、manager2 和 worker2 上。Swarm 会自动把容器调度到不同的节点保证负载均衡。现在随便访问哪个节点的 80 端口都能看到 Nginx 的欢迎页面。这就是 Swarm 的负载均衡功能外部请求会自动分发到各个容器。服务高可用测试说了半天高可用到底高可用在哪里我们来模拟一下节点故障。直接把 worker1 关机# 在 worker1 上执行shutdown-hnow然后等个几十秒再查看服务状态dockerservicepsnginx-testID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS t3h7m9k2p8q5 nginx-test.1 nginx:latest worker1 Shutdown Shutdown 30 seconds ago k7v2m9p4n7q1 nginx-test.1 nginx:latest manager3 Running Running 10 seconds ago r2t5v8x1p4m9 nginx-test.2 nginx:latest manager2 Running Running 5 minutes ago n8xkp2z3m5q1 nginx-test.3 nginx:latest worker2 Running Running 5 minutes ago看到了吗原来在 worker1 上运行的容器自动关闭了Swarm 在 manager3 上重新启动了一个新的容器。整个过程完全自动不需要人工干预。这就是高可用的核心当某个节点挂掉上面的服务会自动迁移到其他健康节点上运行。再测试一下 Manager 节点故障。我们把 manager1Leader关机# 在 manager1 上执行shutdown-hnow等一会儿在 manager2 或 manager3 上查看集群状态dockernodelsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION dxn1zf6l61qsb1josjja83ngz manager1 Down Active Unreachable 20.10.14 rfm5vi4vpxpmhjw6vz0t4wqdv * manager2 Ready Active Leader 20.10.14 y6jcg5z4m7x0tz1f0qz3n5k8s manager3 Ready Active Reachable 20.10.14 n8xkp2z3m5q1rt7v9w2j4h6c0 worker1 Ready Active 20.10.14 t3h7m9k2p8q5wv1n4x6j0r2b8 worker2 Ready Active 20.10.14manager1 显示 Down 和 Unreachable而 manager2 自动变成了 Leader。这就是 Raft 协议的功劳剩下的 2 个 Manager 节点重新选举manager2 成了新的 Leader。集群依然正常工作服务不受影响。部署真实业务服务测试服务跑通了现在部署一个真实的业务。我们有个用户中心服务用 Spring Boot 写的依赖 MySQL 和 Redis。1. 创建 MySQL 服务dockerservicecreate\--namemysql\--replicas1\--networkmy-overlay\--mounttypevolume,sourcemysql-data,target/var/lib/mysql\-eMYSQL_ROOT_PASSWORDyour_password\-eMYSQL_DATABASEuser_center\--constraintnode.roleworker\mysql:5.7这里用了--constraint node.roleworker强制 MySQL 只运行在 Worker 节点上。因为 Manager 节点已经够忙了数据库这种重服务还是放 Worker 上比较好。--mount参数挂载了数据卷保证数据持久化。如果不挂载卷容器重建后数据就丢了。2. 创建 Redis 服务dockerservicecreate\--nameredis\--replicas1\--networkmy-overlay\--mounttypevolume,sourceredis-data,target/data\--constraintnode.roleworker\redis:6.23. 创建用户中心服务dockerservicecreate\--nameuser-center\--replicas2\--networkmy-overlay\-eSPRING_PROFILES_ACTIVEprod\-eMYSQL_HOSTmysql\-eREDIS_HOSTredis\--publish8080:8080\your-registry.com/user-center:latest注意这里的环境变量MYSQL_HOSTmysql和REDIS_HOSTredis直接用服务名就能访问这就是服务发现的好处。Swarm 内置了 DNS 服务器会自动把服务名解析到对应的容器 IP。服务部署完了看看整体状态dockerservicelsID NAME MODE REPLICAS IMAGE PORTS k7v2m9p4n7q1 mysql replicated 1/1 mysql:5.7 r2t5v8x1p4m9 redis replicated 1/1 redis:6.2 t3h7m9k2p8q5 user-center replicated 2/2 your-registry.com/user-center:latest *:8080-8080/tcp所有服务都正常运行。使用 Docker Compose 文件部署上面的命令行方式适合单个服务如果服务多了管理起来很麻烦。Docker Swarm 支持用 Docker Compose 文件部署方便多了。创建一个 docker-compose.yml 文件version:3.8services:mysql:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:your_passwordMYSQL_DATABASE:user_centervolumes:-mysql-data:/var/lib/mysqlnetworks:-my-overlaydeploy:replicas:1placement:constraints:-node.role workerredis:image:redis:6.2volumes:-redis-data:/datanetworks:-my-overlaydeploy:replicas:1placement:constraints:-node.role workeruser-center:image:your-registry.com/user-center:latestenvironment:SPRING_PROFILES_ACTIVE:prodMYSQL_HOST:mysqlREDIS_HOST:redisports:-8080:8080networks:-my-overlaydeploy:replicas:2update_config:parallelism:1delay:10sfailure_action:rollbackrestart_policy:condition:on-failuredelay:5smax_attempts:3networks:my-overlay:external:truevolumes:mysql-data:redis-data:这个文件里加了几个重要的配置deploy.update_config滚动更新配置一次更新 1 个容器间隔 10 秒失败自动回滚deploy.restart_policy重启策略失败后重启最多重试 3 次部署服务dockerstack deploy-cdocker-compose.yml myapp查看 stackdockerstacklsNAME SERVICES myapp 3查看 stack 里的服务dockerstack services myapp用 stack 的好处是一次性部署多个服务而且更新的时候也很方便改完配置文件重新执行 deploy 命令就行。滚动更新实战业务迭代是常事更新服务是家常便饭。传统方式更新服务得先停掉旧版本再启动新版本中间会有服务中断。Docker Swarm 的滚动更新就优雅多了它会逐步用新版本替换旧版本保证服务始终可用。假设我们要把 user-center 服务从 v1.0 更新到 v2.0dockerserviceupdate\--imageyour-registry.com/user-center:v2.0\--update-parallelism1\--update-delay 10s\--update-failure-action rollback\myapp_user-center参数说明--update-parallelism 1一次更新 1 个容器--update-delay 10s更新间隔 10 秒--update-failure-action rollback更新失败自动回滚更新过程中查看状态dockerservicepsmyapp_user-centerID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS k7v2m9p4n7q1 myapp_user-center.1 your-registry.com/user-center:v2.0 worker1 Running Running 5 seconds ago t3h7m9k2p8q5 \_ myapp_user-center.1 your-registry.com/user-center:v1.0 worker1 Shutdown Shutdown 6 seconds ago r2t5v8x1p4m9 myapp_user-center.2 your-registry.com/user-center:v1.0 worker2 Running Running 2 minutes ago能看到 worker1 上的容器已经更新到 v2.0worker2 上的还是 v1.0。等 10 秒后worker2 上的也会更新。如果新版本有问题比如容器启动失败Swarm 会自动停止更新并回滚到旧版本。这个功能太实用了再也不用担心更新把服务搞挂了。服务扩缩容业务高峰期服务扛不住了需要快速扩容。Docker Swarm 扩容只需要一条命令dockerservicescale myapp_user-center5瞬间就把 user-center 服务扩展到 5 个副本。Swarm 会自动把新容器调度到空闲的节点上。查看扩容结果dockerservicelsID NAME MODE REPLICAS IMAGE PORTS t3h7m9k2p8q5 myapp_user-center replicated 5/5 your-registry.com/user-center:v2.0 *:8080-8080/tcp缩容也一样简单dockerservicescale myapp_user-center2Swarm 会自动选择要停止的容器保证负载均衡。私有镜像仓库配置生产环境的镜像一般都存在私有仓库里Docker Swarm 拉取私有镜像需要认证。假设我们用 Harbor 搭建了私有仓库地址是 registry.example.com。1. 创建 Docker 登录认证在任意 Manager 节点登录私有仓库dockerlogin registry.example.com输入用户名和密码登录成功后认证信息会保存在~/.docker/config.json文件里。2. 创建 Docker Secret把认证信息创建成 Swarm Secretdockersecret create registry-auth ~/.docker/config.json3. 创建服务时使用 Secretdockerservicecreate\--nameuser-center\--replicas2\--networkmy-overlay\--secretsourceregistry-auth,target/root/.docker/config.json\--publish8080:8080\registry.example.com/user-center:latest这样服务就能从私有仓库拉取镜像了。监控和日志集群跑起来了监控不能少。我们用 Portainer 来管理 Swarm 集群用 ELK 收集日志。部署 PortainerPortainer 是个轻量级的容器管理界面支持 Docker Swarm。dockerservicecreate\--nameportainer\--replicas1\--publish9000:9000\--mounttypebind,src/var/run/docker.sock,dst/var/run/docker.sock\--mounttypevolume,srcportainer-data,dst/data\portainer/portainer-ce:latest访问任意节点的 9000 端口就能看到 Portainer 的管理界面。可以查看所有服务、容器、网络、卷还能在 Web 界面直接操作非常方便。[5]日志收集容器的日志默认存在本地不方便查看和分析。我们用 ELKElasticsearch Logstash Kibana来收集日志。不过 ELK 部署比较复杂这里就不展开了。简单点的方案是用 Filebeat 收集日志发送到 Elasticsearch然后用 Kibana 查看。踩过的坑搭建过程中遇到不少坑记录下来给大家避雷。坑 1Manager 节点不要跑太多服务刚开始我把所有服务都往 Manager 节点上放结果 Manager 负载太高集群管理都受影响。后来加了--constraint node.roleworker把重服务都限制在 Worker 节点上问题解决。坑 2数据卷挂载要小心MySQL 这种有状态的服务一定要挂载数据卷不然容器重建后数据就丢了。而且挂载的时候要用typevolume不要用typebind因为 bind 挂载依赖宿主机的目录结构迁移起来很麻烦。坑 3端口冲突多个服务不能用同一个宿主机端口。我有次部署两个服务都用 8080 端口结果第二个服务启动失败。解决办法是每个服务用不同的端口或者用 Ingress 路由。[4]坑 4节点时间不同步前面说过节点时间不同步会导致集群选举出问题。我有次重启服务器后时间同步服务没起来结果集群状态一直不正常。后来加了监控定期检查时间同步状态。坑 5网络问题Docker Swarm 用覆盖网络实现跨节点通信如果网络配置有问题容器之间会无法通信。有次我忘了开放 4789/UDP 端口结果容器之间 ping 不通。排查了半天才发现是防火墙的问题。生产环境的一些建议在测试环境跑通了上生产环境还得注意几点1. 资源限制给每个服务设置资源限制防止某个服务占用太多资源影响其他服务dockerserviceupdate\--limit-cpu2\--limit-memory 4G\--reserve-cpu1\--reserve-memory 2G\myapp_user-center2. 健康检查给服务加上健康检查Swarm 会定期检查容器状态不健康就自动重启healthcheck:test:[CMD,curl,-f,http://localhost:8080/health]interval:30stimeout:10sretries:3start_period:40s3. 备份策略定期备份 Manager 节点的/var/lib/docker/swarm目录里面存着集群的状态数据。如果所有 Manager 都挂了可以用备份恢复集群。4. 监控告警部署监控Prometheus Grafana设置告警规则。集群状态、服务状态、资源使用情况都要监控。5. 灰度发布更新服务时不要一次性全部更新。可以先更新 1 个副本观察没问题后再继续更新。用--update-parallelism参数控制。写在最后Docker Swarm 虽然不如 Kubernetes 强大但对中小团队来说绝对够用了。搭建简单维护成本低功能也齐全。我们公司用了快一年除了刚开始踩了几个坑后面一直很稳定。最重要的是它真的解决了我们单点故障的问题。现在随便挂一台服务器服务都能自动迁移到其他节点再也不用半夜起来重启服务了。如果你们团队也在考虑容器编排方案不妨先试试 Docker Swarm。等业务规模大了再考虑迁移到 Kubernetes 也不迟。这篇文章写了好久把搭建过程和踩过的坑都详细记录下来了。如果你也在用 Docker Swarm或者准备搭建 Swarm 集群希望这篇文章能帮到你。有问题欢迎在评论区留言我会尽量回复。如果觉得文章有用点个赞再走呗也欢迎转发给需要的朋友。公众号运维躬行录个人博客躬行笔记关注公众号获取更多运维干货文章一起成长一起进步

相关文章:

Docker Swarm 搞定高可用集群,生产环境再也不怕服务挂掉了

Docker Swarm是什么? Docker Swarm 是 Docker 官方推出的容器集群管理工具,基于 Go 语言实现。代码开源在:https://github.com/docker/swarm 使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平…...

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南

如何5分钟搞定抖音批量下载:douyin-downloader完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

如何实现零训练深度换脸:roop-unleashed终极指南

如何实现零训练深度换脸:roop-unleashed终极指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 在当今数字内容创作爆炸的时代,视频…...

OneMore插件终极指南:3步解锁OneNote隐藏的160+效率神器

OneMore插件终极指南:3步解锁OneNote隐藏的160效率神器 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 还在为OneNote功能单一而烦恼?OneMore插…...

04 前端 Web 开发 HTML5 + CSS3 + 移动 web 视频教程,前端web入门首选黑马程序员

04 前端 Web 开发 HTML5 CSS3 移动 web 视频教程,前端web入门首选黑马程序员 一、参考资料 【前端Web开发HTML5CSS3移动web视频教程,前端web入门首选黑马程序员】 https://www.bilibili.com/video/BV1kM4y127Li/?p44&share_sourcecopy_web&vd…...

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览

Markdown Viewer:浏览器中的终极Markdown渲染神器,让你告别单调预览 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为Markdown文件的预览效果发愁吗&…...

如何用5分钟彻底解决BT下载速度慢的问题?终极Tracker列表指南

如何用5分钟彻底解决BT下载速度慢的问题?终极Tracker列表指南 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 还在为BT下载速度慢如蜗牛而烦恼吗?每…...

SEATA分布式事务——AT模式云

简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...

从数据采集到回放验证:ADTF 适配 ROS 的 ADAS 测试实践胃

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) { private readonly SqlSource _source new(builder.DataSource); private readonly IParamQuery_accountQuery b…...

Java中ThreadPoolExecutor 深度剖析

ThreadPoolExecutor 深度剖析(基于Java 21) 这是 JUC 中最核心、最复杂的并发组件之一。以下按维度逐一展开,辅以源码与图示。一、底层实现原理 1.1 核心控制字段:ctl ThreadPoolExecutor 用一个 AtomicInteger 类型的 ctl 字段同…...

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码)

OpenCV实战:SimpleBlobDetector参数调优全攻略(附完整代码) 在工业视觉检测和医学图像分析领域,斑点检测是一项基础但至关重要的任务。想象一下这样的场景:生产线上的零件表面缺陷检测、显微镜下的细胞计数、PCB板焊点…...

旧安卓手机别扔!手把手教你搭建个人隐私安全检测环境(Kali+Metasploit实战)

旧安卓设备重生计划:构建家庭隐私安全实验室的5个关键步骤 那部抽屉里积灰的旧安卓手机,或许是你提升数字安全意识的最佳教具。当科技媒体不断报道数据泄露事件时,大多数人依然对手机应用的权限滥用缺乏直观认知。本文将带你用退役设备搭建一…...

KDE桌面Mac化实战:从Launchpad到全局菜单的完整改造指南

1. 为什么要把KDE桌面改造成macOS风格? 作为一个长期使用Linux的老用户,我完全理解大家对macOS那种简洁优雅界面的向往。但说实话,macOS的封闭性总是让人感觉束手束脚。直到有一天我发现,原来用KDE Plasma可以完美复刻macOS的视觉…...

从Bulk CMOS到先进工艺:Sentaurus TCAD中几何结构与掺杂如何‘捏’出你的Ion和Ioff

从Bulk CMOS到先进工艺:Sentaurus TCAD中几何结构与掺杂如何‘捏’出你的Ion和Ioff 在半导体器件设计中,Ion(导通电流)和Ioff(关断电流)是衡量器件性能的两个关键指标。就像雕塑家通过调整黏土的形状和质地…...

探秘Text2Vec:智能文本处理的新利器

探秘Text2Vec:智能文本处理的新利器 【免费下载链接】text2vec Fast vectorization, topic modeling, distances and GloVe word embeddings in R. 项目地址: https://gitcode.com/gh_mirrors/tex/text2vec Text2Vec是一款强大的R语言文本处理工具包&#xf…...

AgentCPM-Report实战案例:Pixel Epic在跨境数据合规白皮书撰写中的应用

AgentCPM-Report实战案例:Pixel Epic在跨境数据合规白皮书撰写中的应用 1. 引言:当数据合规遇上像素冒险 跨境数据合规是当前企业出海面临的重要挑战之一。传统白皮书撰写需要耗费大量时间收集法规、分析案例、整理框架,而Pixel Epic这款基…...

STM32步进电机4轴控制源码(相对/绝对/回原点/梯形加减速运动控制 F103 F405版本)

STM32步进电机4轴控制源码,相对,绝对,回原点,梯形加减 STM32步进电机4轴控制源码,相对,绝对,回原点,梯形加减速,运动控制,两份源码,F103&#xff…...

嵌入式语音交互实战:基于树莓派4B与SYN6288的智能语音播报系统设计

1. 智能语音播报系统入门指南 想象一下,当你走进电梯时听到"请注意安全"的语音提示,或者在健身房跑步机上听到"当前速度5公里/小时"的播报,这些场景背后都离不开智能语音播报技术。今天我要分享的,是如何用树…...

7种高效连接方式全解析:php-amqplib连接RabbitMQ的终极指南

7种高效连接方式全解析:php-amqplib连接RabbitMQ的终极指南 【免费下载链接】php-amqplib The most widely used PHP client for RabbitMQ 项目地址: https://gitcode.com/gh_mirrors/ph/php-amqplib php-amqplib作为最广泛使用的PHP RabbitMQ客户端&#xf…...

Razer-macos核心组件深度剖析:设备管理器与动画系统

Razer-macos核心组件深度剖析:设备管理器与动画系统 【免费下载链接】razer-macos Color effects manager for Razer devices for macOS. Supports High Sierra (10.13) to Monterey (12.0). Made by the community, based on openrazer. 项目地址: https://gitco…...

如何快速上手Remax:5分钟创建你的第一个跨平台小程序

如何快速上手Remax:5分钟创建你的第一个跨平台小程序 【免费下载链接】remax 使用真正的 React 构建跨平台小程序 项目地址: https://gitcode.com/gh_mirrors/re/remax Remax是一个让开发者能够使用真正的React构建跨平台小程序的强大框架。通过Remax&#x…...

Pixel Epic · Wisdom Terminal 计算机视觉应用:YOLOv5目标检测模型协同优化案例

Pixel Epic Wisdom Terminal 计算机视觉应用:YOLOv5目标检测模型协同优化案例 1. 当大语言模型遇见计算机视觉 在安防监控室里,值班人员正盯着十几个屏幕,突然发现一个可疑身影。"把第三摄像头画面放大,看看那个人手里拿的…...

用App Inventor给ESP8266做个遥控App,5分钟搞定智能灯开关(保姆级教程)

5分钟打造智能灯控系统:零基础玩转App Inventor与ESP8266 第一次尝试物联网项目时,我被各种专业术语和复杂配置搞得晕头转向——直到发现这个组合:App Inventor的可视化编程加上ESP8266的Wi-Fi模块,配合巴法云的MQTT服务&#xff…...

lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂抵

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...

ESLint 9.0+ 配置实战:从零到一构建现代前端代码规范

1. 为什么你需要ESLint 9.0的扁平化配置 最近接手了一个Vue 3 TypeScript的新项目,当我像往常一样准备配置ESLint时,发现官方文档已经全面转向了全新的扁平化配置方式。作为一个从ESLint 6.x时代就开始使用它的老用户,我必须承认这次改动确实…...

如何打造专属AI开发工作流:Forge高级配置的终极指南

如何打造专属AI开发工作流:Forge高级配置的终极指南 【免费下载链接】forgecode AI enabled pair programmer for Claude, GPT, O Series, Grok, Deepseek, Gemini and 300 models 项目地址: https://gitcode.com/gh_mirrors/forge39/forgecode Forge作为一款…...

SMUDebugTool终极指南:7个维度深度解析AMD Ryzen系统硬件调试

SMUDebugTool终极指南:7个维度深度解析AMD Ryzen系统硬件调试 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…...

终极指南:如何选择最佳哈希函数提升uthash程序性能

终极指南:如何选择最佳哈希函数提升uthash程序性能 【免费下载链接】uthash C macros for hash tables and more 项目地址: https://gitcode.com/gh_mirrors/ut/uthash 在C语言开发中,哈希表是提升数据查找效率的关键工具。uthash作为一款轻量级的…...

hidapi项目贡献指南:如何参与开源HID库的开发

hidapi项目贡献指南:如何参与开源HID库的开发 【免费下载链接】hidapi A Simple library for communicating with USB and Bluetooth HID devices on Linux, Mac, and Windows. 项目地址: https://gitcode.com/gh_mirrors/hi/hidapi hidapi是一个跨平台的开源…...

我不是狐狸,我是那Harness Engineering膳

Julia(julialang.org)由Stefan Karpinski、Jeff Bezanson等在2009年创建,目标是融合Python的易用性、C的高性能、R的统计能力、Matlab的科学计算生态。 其核心设计哲学是: 高性能:编译型语言(JIT&#xff0…...