浅谈棋牌游戏开发流程二:后端技术选型与基础环境搭建
一、前言:客户端只是台前,后端才是幕后“指挥中心”
在上一篇“客户端技术”中,我们聊到玩家看到的一切动作、动画、界面逻辑,都靠客户端去渲染和交互。但若没有后端的支撑,玩家点了“出牌”可能就像一拳打在空气里——没人理,也无法判定牌局结果。
因此,在一个完整的棋牌游戏体系里,后端往往承担了最核心、最复杂的任务,包括:
- 房间管理:谁进了哪个房间?房间是否满员?
- 游戏逻辑:洗牌、发牌、出牌顺序、结算,这些关键规则判定基本都在后端进行;
- 并发处理:同时在线的成千上万人,各种对局消息纷至沓来,如何保证不卡、不宕机?
- 账户与充值:玩家的金币或钻石数、支付交易、安全校验,都要靠后端来管控;
- 数据存储与统计:战绩记录、玩家行为数据、日志分析……
可以说,后端就像一座“游戏大厦”的地基和框架,没有它,客户端再炫也只是空壳。那接下来,我们就系统地聊一聊,常见的后端技术选型和基础环境搭建要怎么做,才能让我们的棋牌项目既稳又快。
二、后端技术栈选型:Java、Go、Node.js,你该怎么选?
2.1 Java:江湖上的“老前辈”
- 特点:
- 生态非常成熟,大公司常年累月地在用,踩坑资料和经验非常丰富;
- 类库和框架多如牛毛,常见的有 Spring Boot、Spring Cloud、Netty 等;
- 人才储备量大,比较容易招聘或者外包。
- 适用场景:
- 需要复杂业务逻辑或大型平台级项目;
- 组织规模较大时,对技术栈稳妥性要求高;
- 追求依赖成熟社区,且希望快速找到高水平开发者。
- 缺点:
- JVM 运行内存占用会相对高一些;
- 相比 Go 或 Node.js,Java 项目启动和部署流程稍显复杂,需要多加注意性能调优。
2.2 Go(Golang):后起之秀,专治“高并发焦虑”
- 特点:
- 语言层面自带轻量级并发(goroutine),写高并发业务相对轻松;
- 编译成单个可执行文件,部署简单,启动速度快;
- 社区近几年发展迅猛,相关框架(如 Gin、go-zero、Kratos 等)也越来越完善。
- 适用场景:
- 高并发、高吞吐量的即时交互场景,非常适合棋牌游戏这种需要大量“房间实时处理”的项目;
- 团队规模中小,想要简化开发和运维,也很适合。
- 缺点:
- 和 Java 相比,Go 的类库生态仍在成长中,一些特定功能可能需要自行封装或找第三方库;
- 语言特性相对简单,部分人会觉得语法过于“原始”或“简洁”,需要时间适应。
2.3 Node.js:前后端“一条龙”的选择
- 特点:
- 前端是 JavaScript,后端用 Node.js,可以减少“语言切换”带来的心智负担;
- 对 I/O 密集型场景有一定优势,可以在同一台服务器上处理很多连接请求;
- 大量成熟的 npm 包可供使用。
- 适用场景:
- 小型或中小型项目,尤其是以网页或小程序为主要端的情况下;
- 团队主要来自前端背景,对 JS/TS 很熟悉,想快速迭代做 MVP(最小可行产品)。
- 缺点:
- 单线程模型,对 CPU 密集型逻辑不太友好;如果需要强大的并发计算或复杂业务,需要额外用 cluster、微服务等方式拆分;
- 在国内主流棋牌游戏大规模使用 Node.js 作为核心逻辑的案例相对少,资料参考也不如 Java、Go 丰富。
2.4 其他语言或思路
- C++:注重极致性能,可用于底层核心模块,但开发维护成本高。
- Python:写脚本或辅助管理端不错,但高并发游戏服务一般不常见。
简要建议:
- Java 或 Go 基本是当前棋牌游戏后端最常见、最稳妥的两大路线,前者生态丰富,后者并发强且部署方便;
- Node.js 也可以尝试,但要考虑社区成熟度和人力储备;
- 团队已有的技术背景、项目规模、预算等因素都要综合考虑。
三、常见后端框架选型:Spring Boot、Netty、Gin、go-zero……
3.1 Java 阵营
-
Spring Boot:
- 几乎是 Java Web 的“标配”,集成度高,能快速搭建各种 RESTful API;
- 配合 Spring Cloud,可以实现微服务架构。
- 对棋牌游戏,常用方式是:Spring Boot + Netty 或 WebSocket 处理实时消息,再用 MySQL / Redis 做数据存储。
-
Netty:
- 一款优秀的异步事件驱动网络框架,支持高并发、大量连接;
- 可实现 TCP、HTTP、WebSocket 等多种协议;
- 如果只用纯 Netty,需要自己写不少业务逻辑和管理模块,比较灵活但也更“底层”。
-
其他:如 Vert.x、Jetty、Tomcat、Undertow 等,都是 Java 后端可选的服务器框架,但相对没 Spring Boot + Netty 流行度高。
3.2 Go 阵营
- Gin:
- 轻量、高性能的 HTTP Web 框架,用来写各种 API 接口很方便;
- 适合作为网关或管理端,如果要做 WebSocket 也可以集成第三方库。
- go-zero / Kratos:
- go-zero:字节系背景的开源框架,提供很多工程化的功能(服务发现、限流熔断等),文档也比较完善;
- Kratos:B 站开源的微服务框架,也具备较完善的治理能力。
- 自己封装:
- 直接用 Go 的标准库
net/http
也能写,或者自己基于 TCP/UDP 来实现,但工作量相对更大。
- 直接用 Go 的标准库
3.3 Node.js 阵营
- Express / Koa / Fastify:
- 最常见的 HTTP 框架,编写 RESTful API 十分便捷;
- 如果做 WebSocket,可用
ws
或socket.io
搭配。
- Nest.js:
- 偏向于企业级项目,采用 TypeScript + 装饰器,风格有点类似 Spring Boot;
- 对注入、模块化管理都有较完整的支持。
归纳:
- 你可以先确定语言,再从对应阵营里选一个“社区推荐度最高、团队最熟悉”的框架入手,比如 Java 大多选 Spring Boot + Netty,Go 常用 Gin/go-zero;
- 初创或小团队项目:可以做得更“轻量”些,别一上来就整成微服务;先把主功能跑通,再看需求做拆分。
四、基础项目结构与模块划分
无论你选 Java 还是 Go 或 Node.js,棋牌游戏后端的一般结构会包含以下几个核心模块:
-
网关/接入层:
- 负责处理玩家的网络连接(TCP/WebSocket/HTTP),并进行消息转发;
- 可能会做简单的身份校验、限流、负载均衡。
-
房间服务(对局逻辑):
- 核心的游戏房间管理,比如玩家进房、坐下、准备、发牌、出牌、结算;
- 这里的业务逻辑要非常严谨,因为任何漏洞都可能被利用来作弊。
-
用户服务:
- 管理玩家账号、个人资料、资产(金币、钻石)、库存、充值;
- 可能要跟支付服务对接,处理订单回调;
- 也可能包含一些社交或活动相关的信息。
-
日志与监控:
- 收集各个环节的日志(玩家登录、对局记录、异常等);
- 监控服务器 CPU、内存、网络等指标,出现异常要能及时告警。
-
数据库 & 缓存:
- 常见组合:MySQL(存用户信息、充值订单、对局记录等核心数据) + Redis(存在线状态、匹配队列、排行榜)
- 也可能用 MongoDB、ElasticSearch 等做日志或统计数据的存储。
4.1 单体架构 vs. 微服务架构
- 单体架构:
- 整个后端项目打包在一起(一个包或一个可执行程序),启动时就跑在一台或几台机器上;
- 适合初期快速迭代,项目规模不大时维护也简单。
- 微服务架构:
- 把各个功能模块独立成若干个服务,比如“网关服务”“匹配服务”“房间服务”“用户服务”等;
- 好处是易于横向扩展,也能单独升级和维护;缺点是部署和运维门槛上升,需要服务发现、负载均衡、配置中心等配套。
对多数小中型棋牌项目而言,可以从“单体+简单分层”开始,等玩家规模上来,再做服务拆分和集群扩容。
五、网络通信与协议:WebSocket、TCP 还是 HTTP?
5.1 长连接的必要性
棋牌对实时性有要求:一旦某位玩家打出一张牌,其他玩家要立即在客户端看到。所以通常会使用 WebSocket(基于 HTTP 升级的一种全双工通信)或 TCP 长连接,让服务器能及时把对局信息推送给所有玩家。
- WebSocket:
- 对 H5 或小程序特别友好,在现代浏览器中直接支持;
- 使用 HTTP(S) 协议握手,更容易走防火墙或云负载均衡;
- 方便兼容 RESTful 接口和长连接在同一个端口下使用。
- TCP Socket:
- 更底层,性能往往比 WebSocket 更好一些,但需要自己封装消息协议;
- 如果你的客户端是 Unity、Cocos 原生,也可以直接用 Socket;
- 需要注意防火墙、NAT 穿透等问题。
小结:选哪个主要看客户端支持和团队熟悉度。对于大多数棋牌游戏,WebSocket已经足够。只有在极端情况下或者对延迟极其苛刻的场景,才会考虑自己写 TCP/UDP 协议。
5.2 消息协议设计
无论是 WebSocket 还是 TCP,你都需要一个自定义的消息协议来和客户端对接:
- 使用 JSON:最简单易懂,但占用带宽稍大;
- 使用 Protobuf / FlatBuffers:序列化效率高,数据也更紧凑,但需要额外的学习与生成器工具;
- 使用 自定义二进制:最灵活,但编解码需要小心维护。
多数项目会折中选择 JSON 或 Protobuf。要是想快速开发,JSON 足以;要是追求流量、性能和严谨,就用 Protobuf。
六、数据库与缓存:MySQL + Redis 高效配合
6.1 关系型数据库:MySQL / PostgreSQL
- 主要存储:
- 用户注册信息(账号、密码、手机号、第三方登录标识)
- 用户资产(金币、钻石、房卡等)
- 充值订单、支付日志
- 对局结算记录(可能需要长时间留存,用于风控或用户查询)
- 数据结构:
- 建议合理设计主键、索引;
- 对于高并发场景,可做读写分离(主库写,多个从库读)或分库分表;
- 保证关键表的备份与容灾。
6.2 缓存:Redis
- 常见用途:
- 在线玩家状态(谁在什么房间,是否在游戏中);
- 排行榜(Sorted Set 结构),高性能读取前 N 名或查询个人名次;
- 频繁访问的数据(活动配置、房间配置),减少数据库压力;
- 分布式锁,防止并发竞态,比如多个请求同时修改玩家资产。
- 注意点:
- 设置合理的失效时间(TTL)避免数据过期带来逻辑混乱;
- 与数据库的数据一致性,必要时要加补偿机制;
- Redis 本身需要主从/集群部署,保证高可用。
6.3 日志、历史记录的存放
- MongoDB / Elasticsearch:
- 若棋牌项目要留存大量对局过程、日志数据,可用这类 NoSQL 做快速查询、数据分析;
- 但必须要搭配合理的索引和存储策略,避免日后数据量暴增导致查询效率下降。
- 文件/对象存储:
- 语音聊天、对局回放录像等文件,可放云存储(如阿里云 OSS / 腾讯云 COS),别把文件硬塞进数据库。
七、基础环境部署与运维:从一台服务器到集群
7.1 部署方式
- 传统部署:
- 买/租一台服务器(云服务器或实体机),安装好操作系统(Linux),把后端程序(Jar 或可执行文件)扔上去跑;
- 简单直接,但扩容时需要再买机器,手动上传部署。
- Docker 容器:
- 把后端打包成 Docker 镜像,启动时仅需一条
docker run ...
命令; - 优点是环境一致,随时可在多台机器上复制同样的容器。
- 把后端打包成 Docker 镜像,启动时仅需一条
- Kubernetes(K8s):
- 容器编排系统,可以自动扩容、负载均衡、故障转移;
- 适合项目规模较大,或有多微服务的情况下;
- 门槛和运维成本也更高,需要熟悉 K8s 的配置、Ingress、Service 等概念。
7.2 负载均衡与高可用
- 简单负载均衡:
- 可用 Nginx 或云厂商的 SLB(Server Load Balancer)把玩家连接分发到不同后端进程上;
- 或者在后端内置网关服务,让它根据房间 ID 或玩家 ID 做路由。
- 高可用:
- 核心服务做多实例部署,同时挂在负载均衡后面;
- 数据库主从复制,Redis 主从/哨兵或 Cluster 模式;
- 任何一个节点挂了,流量会自动切到其他节点,不影响整体游戏体验。
7.3 日常运维
- 监控指标:
- CPU、内存、磁盘、网络吞吐量、连接数;
- 游戏房间数、在线玩家数、异常日志;
- 可以使用 Prometheus + Grafana,或者云监控平台。
- 日志收集:
- ELK(Elasticsearch + Logstash + Kibana)或 Splunk、Graylog 等,都能实时收集和可视化日志;
- 方便排查问题,比如哪个房间经常出错、哪个玩家异常断线较多等。
- 应急预案:
- 出现大量玩家连不上怎么办?宕机了如何快速恢复?
- 做好运维脚本,常见故障能第一时间定位和处理。
八、核心业务逻辑:房间与匹配的基本实现思路
虽然后续还会有专门的章节讲“房间匹配与对局流程”,这里先做个概括,让你了解后端结构跟这部分业务逻辑的衔接。
-
玩家进入大厅 -> 发起匹配请求
- 后端收到玩家的匹配请求,记录玩家信息(段位、积分、胜率等),然后根据匹配算法把合适的玩家凑到一起。
- 如果是“好友房”,则可能由玩家创建房间并分享房间号给好友加入。
-
房间创建与管理
- 一旦玩家匹配到位,就分配到某个房间。后端要创建一个“房间对象”或在数据库/缓存里存这几个人的信息。
- 这个房间对象会跟客户端保持一条通信链路,比如使用 WebSocket 群发来通知每个人:“好了,你们配到一起了!”
-
对局过程
- 发牌、出牌、校验、结算,全程都由后端做核心判定,客户端只是在界面上展示并发回指令。
- 比如斗地主:后端先洗牌分牌 -> 通知各玩家手牌 -> 玩家出牌后 -> 后端检验是否合理 -> 广播给其他玩家 -> 若有炸弹或特殊牌型,再按规则处理分数。
-
游戏结束
- 后端对每个人的输赢结果做统计,更新数据库中的金币或积分;
- 如果有人掉线或中途退出,也要做相应的托管或判定处理;
- 对局结束后,房间资源可释放或回收到房间池供再利用。
要点:
- 后端房间服务要尽量高并发、低延迟;
- 每个操作都要有安全校验,不要把出牌结果完全依赖客户端;
- “房间对象”可以内存管理(比如存在内存的 Map/结构里),也要做好定期同步到数据库或Redis,防止宕机丢失信息。
九、安全与风控:后端是反外挂的重中之重
-
核心逻辑放后端
- 出牌合法性、计算剩余牌数、结算收益都放在后端进行;
- 客户端只起到UI展示,不能让客户端说“我就告诉你我出的牌就是这个样子”。
-
加密与校验
- 通信层加 HTTPS / WSS 或者在底层做 AES 等加密,避免被中间人截取数据;
- 对每条关键指令做合理的签名或校验,防止随意篡改。
-
异常监控
- 监控玩家胜率、出牌速度、资产变化,如果出现极端异常(短时间内疯狂胜利,或金币暴增),要触发风控策略;
- 服务器日志记录每一局的出牌过程,便于审核或回放。
-
支付与充值安全
- 玩家充值后端要核对支付回调,确认订单合法;
- 防止重复发货或伪造支付订单。
十、总结:搭建后端,打好“地基”是关键
在这篇“后端技术选型与环境搭建”里,我们从语言选择到框架选型,从数据库设计到网络通信,再到部署运维,做了一个整体的梳理。对大多数棋牌项目而言,后端最主要的目标就是:
- 稳定可靠:能扛得住高并发玩家,别说来一波人就崩溃;
- 安全公平:关键逻辑都在后端,减少作弊风险;
- 可扩展:前期单体+简易分层就好,后续真的火了,再演进成微服务和分布式集群。
或许你会发现,后端这块的知识点相对比较“杂”,但也正因为如此,它非常需要团队的整体配合:后端开发、DBA、运维、安全人员……大家各司其职,才能让一个棋牌项目的后台支撑体系牢固到足以承载成千上万的在线玩家。
相关文章:
浅谈棋牌游戏开发流程二:后端技术选型与基础环境搭建
一、前言:客户端只是台前,后端才是幕后“指挥中心” 在上一篇“客户端技术”中,我们聊到玩家看到的一切动作、动画、界面逻辑,都靠客户端去渲染和交互。但若没有后端的支撑,玩家点了“出牌”可能就像一拳打在空气里—…...
使用qiankun搭建微前端应用及踩坑
线上演示地址:React App 源码地址:https://github.com/Jiang-K-J/micro-app?tabreadme-ov-file (帮忙点个小星星) 主应用:react 18 子应用:vite vue3 子应用:react 18 安装 主应用 $ y…...
Windows 环境配置 HTTPS 服务实战
一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具,用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…...
小程序租赁系统开发的优势与应用前景分析
内容概要 小程序租赁系统是一种新兴的数字化解决方案,旨在为用户提供更加便捷与高效的租赁服务。它通常包括一系列功能,如在线浏览、即时预定、支付功能以及用户反馈机制。这些系统在使用上极为友好,让用户能够轻松选择所需的商品或服务&…...
Redis(基础篇 + 实践篇 )
01 | 基本架构:一个键值数据库包含什么? Redis 作为一个内存数据存储系统,它的架构设计非常简洁,但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构: 客户端通过 TCP 协议连接到 Redis …...
单片机-独立按键矩阵按键实验
1、按键介绍 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态, 如果按键按下,初始导通状态变为断开,初始断开状态变为导通 我们开发板是采用软件消抖,一般来说一个简单的按键消抖就是先读取按键的状…...
我用AI学Android Jetpack Compose之入门篇(1)
这篇我们先来跑通第一个Android Jetpack Compose工程,现在新版本的Android Studio,新建工程选择Empty Activity默认就会开启Jetpack Compose的支持,再次声明,答案来自 通义千问Ai 文章目录 1.用Android Jetpack Compose需要安装什…...
简单的生产数据库重连策略优化
简单的druid生产数据库重连策略优化 1. 需求 我们生产环境有一次在大量请求拥堵后,好多数据库操作都超时了,在此之后数据库的连接池不能正常的获取数据库连接了,我们确认了数据库服务是没有问题的,那么就是连接池的配置有问题&a…...
STM32-笔记37-吸烟室管控系统项目
一、项目需求 1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上; 2. 按键修改阈值,并显示在 LCD1602 上; 3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响…...
2025-01-04 Unity插件 YodaSheet1 —— 插件介绍
文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器,可以轻松地在 Unity 编辑器中 编辑,搜索…...
电子电气架构 --- 安全相关内容汇总
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
科研绘图系列:R语言单细胞数据常见的可视化图形
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…...
【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 2:基础知识
目录 1 预热1.1 记号1.2 分类器计算过载问题 2 多头编码(MHE)2.1 标签分解2.2 多头组合(Multi-Head Combination) 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia …...
Flink使用
Window下启动支持 下载或复制老版本的放在bin目录下即可; flink.bat echo off setlocalSET bin%~dp0 SET FLINK_HOME%bin%.. SET FLINK_LIB_DIR%FLINK_HOME%\lib SET FLINK_PLUGINS_DIR%FLINK_HOME%\pluginsSET JVM_ARGS-Xmx512mSET FLINK_JM_CLASSPATH%FLINK_LI…...
一种可复用的AI提效方案:AI点灯
在当今飞速发展的时代,AI技术正不断渗透到我们生活的各个层面,深刻改变着传统的工作方式和生活模式。面对这一重大变革,我们不能被动观望或抗拒,而应积极拥抱AI,将其作为成长的助力。只有与AI协同发展,才能…...
Django 模型
Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…...
【MySQL 探索者日志 】第二弹 —— 数据库基础
MySQL系列学习笔记: MySQL探索者日志__Zwy的博客-CSDN博客 各位于晏,亦菲们,请点赞关注! 我的个人主页: _Zwy-CSDN博客 目录 1、MySQL服务器,数据库,表关系 2、MySQL登录连接服务器 3、MyS…...
【51单片机-零基础chapter1】
安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…...
stm32的掉电检测机制——PVD
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检…...
电脑steam api dll缺失了怎么办?
电脑故障解析与自救指南:Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里,我们时常会遇到各种各样的系统报错与文件问题,其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…...
Kotlin 协程基础知识总结七 —— Flow 与 Jetpack Paging3
专题分为五大块: Paging3 的结构组成Flow 与 Paging3下拉刷新上拉刷新离奇 Bug上游数据缓存 Demo 会还原开发迭代的过程,不会直接一步到位。 1、Paging3 加载数据流程 (P105)Paging3 的简介详情可参考官方文档 Paging 库概览&…...
使用JMeter玩转tidb压测
作者: du拉松 原文来源: https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql协议的,所以在使用过程中使用tidb的相关工具连接即可。因为jmeter是java开发的相关工具,直接使用mysql的jdbc驱动包即可。 二、linux下安装jmet…...
音视频入门基础:MPEG2-PS专题(3)——MPEG2-PS格式简介
一、引言 本文对MPEG2-PS格式进行简介。 进行简介之前,请各位先下载MPEG2-PS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-PS的官方文档。但是ITU提供的文档是免费的,ISO/IEC是付费的,所以我们主要阅读ITU提供的官方文档,比如较新…...
ETCD渗透利用指南
目录 未指定使用put操作报错 未指定操作版本使用get报错 首先etcd分为两个版本v2和v3,不同的API结果无论是访问URL还是使用etcdctl进行通信,都会导致问题,例如使用etcdctl和v3进行通信,如果没有实名ETCDCTL_API3指定API版本会直接…...
Python安装(新手详细版)
前言 第一次接触Python,可能是爬虫或者是信息AI开发的小朋友,都说Python 语言简单,那么多学一些总是有好处的,下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录,并且遇到的问题也会写出,…...
SQL 中复杂 CASE WHEN 嵌套逻辑优化
目标:优化复杂的 CASE WHEN 逻辑,提升 SQL 语句的可读性与执行效率,减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深:多个条件判断嵌套,难以阅读和维护。重复逻辑:相似逻辑在多个分支中重复…...
【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...
C# 设计模式(结构型模式):代理模式
C# 设计模式(结构型模式):代理模式 在软件开发中,有时我们需要通过某种方式间接地访问一个对象,这时就可以使用代理模式(Proxy Pattern)。代理模式通过引入一个代理对象来控制对目标对象的访问…...
单片机复位电路基本理解教程文章·含上拉电阻理解电容开路理解!!!
目录 常见复位电路种类 复位电路电阻上拉理解 电容储能断路理解 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电路详解-…...
深入浅出:事件监听中的适配器模式
1. 为什么需要适配器模式? 在Java的事件监听器设计中,许多接口有多个抽象方法。例如,MouseListener 接口有 5 个方法,KeyListener 接口有 3 个方法。如果我们只关心其中的一个方法(例如,鼠标点击事件&…...
常用LabVIEW算法及应用
在LabVIEW项目中,算法的应用是提高系统性能、实现特定功能、完成复杂任务的核心。LabVIEW作为一种图形化编程语言,允许用户通过直观的图形编程来实现各种复杂的算法。这些算法广泛应用于控制系统、数据采集、信号处理、图像处理、机器学习等领域。了解常…...
VTK知识学习(28)-区域提取
1、感兴趣区域(Volume ofInterest,VOI) 它是图像内部的一块子区域。在VTK中,vtkExtractVOI 类可根据用户指定的区域范围提取子图像。该Filter 的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。 代码: private void Test…...
基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档
前言 基于Spring Boot Vue3实现的在线汽车保养维修预约管理系统是一种前后端分离架构的应用,它结合了Java后端开发框架Spring Boot和现代JavaScript前端框架Vue.js 3.0的优势。这样的系统可以为汽车服务站提供一个高效的平台来管理客户的预约请求 技术选型 系统…...
CAN201 Introduction to Networking(计算机网络)Pt.4 链路层
文章目录 5. Link Layer(链路层)5.1 Services of link layer(链路层的服务)5.2 Error detection and correction(错误检测和纠正)5.2.1 Partity Checks(奇偶检验)5.2.2 Checksum&…...
Python视频处理:噪声矩阵与并行计算的完美融合
噪声级别对视频质量有显著的影响,主要体现在以下几个方面: 1. 视觉质量 低噪声级别:当噪声级别较低时,视频的视觉质量较好。噪声对图像细节的干扰较小,画面看起来较为清晰和自然。观众可以更容易地识别图像中的细节和…...
wordpress开发之实现使用第三方库qrcode-generator生成二维码并上传和展示
文章目录 一、需求二、技术实现 - 利用qrcode-generator库三、代码实现 一、需求 客户的需求是能将特定的url生成二维码,以便将二维码分享或贴到合同纸上给他的客户扫描查看信息。 这个url包含的内容类似于如下格式: https://www.example.com/contrac…...
计算机网络——物理层
一、通信基础 1.相关术语: • 数据(data)——运送消息的实体。 • 信号(signal)——数据的电气的或电磁的表现。 • “模拟的”(analogous)——代表消息的参数的取值是连续的。 • “数字的”(digital)——代表消息的参数的取值是离散的。 • 码元(code)——在…...
网络IP协议
IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...
Unity UGUI使用技巧与经验总结(不定期更新)
Text自动缩放参考连接: Unity -UGUI中Text文本框的自动调整,字体大小的自适应调节_unity添加的字体大小锁定-CSDN博客 Toggle按钮选择时,显示对应的UI界面: 为Toggle组件的On Value Change事件添加对需要显示的对象的SetActive…...
Tailwind CSS 使用简介
参考网站安装 - Tailwind CSS 中文网 号称是开始使用 Tailwind CSS 通过 npm 安装 tailwindcss,并创建你的 tailwind.config.js 文件。 npm install -D tailwindcss npx tailwindcss init 在 tailwind.config.js 文件中添加所有模板文件的路径。 /** type {im…...
嵌入式linux中socket控制与实现
一、概述 1、首先网络,一看到这个词,我们就会想到IP地址和端口号,那IP地址和端口各有什么作用呢? (1)IP地址如身份证一样,是标识的电脑的,一台电脑只有一个IP地址。 (2)端口提供了一种访问通道,服务器一般都是通过知名端口号来识别某个服务。例如,对于每个TCP/IP实…...
Go语言的 的数据封装(Data Encapsulation)核心知识
Go语言的数据封装(Data Encapsulation)核心知识 引言 在现代编程语言中,数据封装是一个重要的编程概念。它不仅帮助开发者管理复杂性,还提高了代码的可维护性和安全性。Go语言(Golang)作为一种注重简洁性…...
25/1/5 算法笔记<强化学习> MPC,交叉熵法,PETS算法
MPC 一个棋手下棋,会根据当前的局势来推演落子几步可能发生的局势,然后选择局势最好的一种情况来决定当前落子位置。 模型预测控制方法MPC,就是这样一种迭代的、基于模型的控制方法。值得注意的是MPC中不存在一个显示的策略。具体而言就是MPC在每次采取…...
最新版Chrome浏览器加载ActiveX控件之CFCA安全输入控件
背景 CFCA安全输入控件用于保证用户在浏览器、桌面客户端、移动客户端中输入信息的安全性,防止运行在用户系统上的病毒、木马等恶意程序入侵窃取用户输入的敏感信息。确保用户输入、本地缓存、网络传输整个流程中,输入的敏感信息不被窃取。广泛应用于银行…...
vue 项目集成 electron 和 electron 打包及环境配置
vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹,在electron文件夹创建main.js(或者backgrou…...
计算机网络--UDP和TCP课后习题
【5-05】 试举例说明有些应用程序愿意采用不可靠的UDP, 而不愿意采用可靠的TCP。 解答: 这可能有以下几种情况。 首先,在互联网上传输实时数据的分组时,有可能会出现差错甚至丢失。如果利用 TCP 协议对这些出错或丢失的分组进行重传&…...
【算法不挂科】算法期末考试题库(带解析)【选择题53道&填空题36道&算法填空题7道&问答题33道】
前言 大家好吖,欢迎来到 YY 滴算法不挂科系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 下面是相关传送门 【算法不挂科】算法期末考试题库1(带解析)【选择题53道&填空题36道&算法填空题7道&a…...
Java+maven+selenium3+testng 自动化测试环境IDEA
软件测试资料领取:[内部资源] 想拿年薪40W的软件测试人员,这份资料必须领取~ 软件测试面试刷题工具领取:软件测试面试刷题【800道面试题答案免费刷】 idea 、java环境变量jdk maven安装及环境变量配置这里就不多说了,网上有很多…...
【踩坑指南2.0 2025最新】Scala中如何在命令行传入参数以运行主函数
这个地方基本没有任何文档记录,在学习的过程中屡屡碰壁,因此记录一下这部分的内容,懒得看可以直接跳到总结看结论。 踩坑步骤 首先来看看书上让我们怎么写: //main.scala object Start {def main(args:Array[String]) {try {v…...
vue3-watchEffect异步依赖收集
当 b 更新时 a 并不会更新,因为watchEffect的依赖收集在该案例中停止于await asyncFn(),也就是只会收集同步代码的依赖,await 之后的异步代码的依赖并不会收集到 <template> <div>a: {{ a }} <br>b: {{ b }} <br>&l…...