🚀Spring Boot + ShardingSphere 实战:分库分表,性能暴增的终极指南!

✅ 适用场景:千万级大表、高并发、读写分离场景
✅ 核心框架:Spring Boot 3.x + ShardingSphere-JDBC 5.4.1
✅ 数据库:MySQL 8.x(主从结构)
✅ 特色亮点:覆盖垂直/水平分库、分表、自定义分片、公共表、广播表、Hint 强制路由

分库分表 vs 读写分离 vs 主从配置与数据库高可用架构区别


📚 目录

  1. 🌟 为什么选择 ShardingSphere?
  2. 📐 系统整体架构图
  3. 🧰 技术选型与版本说明
  4. ⚙️ 核心配置详解
  5. 🚦 常用查询效果演示
  6. 🚧 常见问题与优化建议
  7. 📎 参考资料与源码下载

🌟 为什么选择 ShardingSphere?

ShardingSphere 是 Apache 开源的数据库中间件生态系统,支持 JDBC 层嵌入和独立代理部署,拥有强大的分库分表、读写分离、数据加密、弹性扩容、分布式事务等能力。相比传统中间件,它更灵活、社区更活跃,适合大多数 Spring Boot 应用快速集成。

🔍 什么是 ShardingSphere?

ShardingSphere 是一个开源的分布式数据库中间件生态,最早由当当网开源(Sharding-JDBC),目前由 Apache 基金会孵化。

它包含 3 大组件:

组件作用说明
ShardingSphere-JDBC轻量级 Java JDBC 层分库分表工具(无需 Proxy)
ShardingSphere-Proxy基于 MySQL/PostgreSQL 协议的中间件代理层
ShardingSphere-Sidecar面向 Kubernetes 的数据库 Mesh Sidecar

本项目使用 ShardingSphere-JDBC,适合嵌入 Spring Boot 项目,无需额外服务。


🌟 ShardingSphere 的核心能力

能力项说明
✅ 分库分表支持标准、绑定表、广播表、Hint 路由等
✅ 读写分离支持一主多从,负载均衡策略可配置
✅ 弹性扩容数据迁移过程中支持双写、多活等策略
✅ 分布式事务支持 Seata/XA/BASE 模式
✅ 数据加密支持字段级加密与脱敏
✅ 容器/K8s 支持Proxy 和 Sidecar 支持云原生部署
✅ SQL 显示/日志跟踪方便调试分片路由结果

🧠 为什么选它而不是其他?

对比项ShardingSphereMyCatVitess/Federation
📦 部署方式代码嵌入(JDBC层)或独立服务独立服务(代理层)代理层(复杂度较高)
💡 配置方式YAML/Java/Registry/动态XML 配置复杂支持 SQL 路由
🧩 特性完整度高:分片+读写+事务+加密分片较强,其他较弱分布式强,学习成本高
🌐 社区活跃度高(Apache孵化+大厂支持)较低(更新慢)中(主要在国外)
💼 实际落地场景电商、支付、运营平台等早期用得多,现在转向替代海外云厂商多
🧪 分布式事务支持✅ Seata / BASE / XA

📌 结论:ShardingSphere 在 兼容性、灵活性、社区支持 等方面都具备绝对优势,适合中大型项目长期维护。


🧪 哪种场景适合使用 ShardingSphere?

场景类型是否推荐使用说明
订单系统支持订单分库分表,按用户、时间分片都很灵活
用户系统✅(广播表)用户表一般较小,可广播全库保持一致
内容系统文章/评论按ID、日期分表效果好
实时大数据❌(不推荐)建议用 Flink + Hive/Spark
跨库强事务需求✅(结合 Seata)ShardingSphere + Seata 实现分布式事务
多租户 SaaS可按 tenant_id 分库分表 + 广播共享配置类

📌 总结一句话:

ShardingSphere 是 Java 世界中最成熟、最活跃的分库分表中间件,适合绝大多数业务场景,尤其适合 Spring Boot 用户接入。


📐 系统整体架构图

🧩 用户模块使用广播表,订单模块按 user_id 水平分库,order 表按年月分表,日志表归档存储。读写分离策略基于 SQL 类型自动路由到主库或从库。

在这里插入图片描述

下面是一个标准的 ShardingSphere 架构图,展示其核心组件、功能模块和部署方式。架构可以分为三种模式:ShardingSphere-JDBC、ShardingSphere-Proxy、ShardingSphere-Sidecar(计划中)。这里我们重点展示 ShardingSphere-JDBCShardingSphere-Proxy 的部署结构:


✅ 一、ShardingSphere 总体架构图(逻辑图)

在这里插入图片描述


✅ 二、ShardingSphere 三种部署模式对比图

模式架构位置特点说明
ShardingSphere-JDBCJava 应用内部嵌入式、轻量级,支持事务、本地运行、性能高。适合 Java 项目
ShardingSphere-Proxy数据库代理层类似 MySQL 中间件,跨语言支持(Python、Go等),统一访问
ShardingSphere-Sidecar(未来)Service Mesh(Istio)边车模式云原生、K8s友好,服务间透明代理

✅ 三、ShardingSphere-JDBC 架构图

在这里插入图片描述


✅ 四、ShardingSphere-Proxy 架构图

在这里插入图片描述


✅ 五、组件模块图(ShardingSphere 功能生态)

在这里插入图片描述


🧰 技术选型与版本说明

技术栈说明
Spring Boot3.1.5
ShardingSphere-JDBC5.2.1
MyBatis-Plus3.5.11
MySQL8.0.x,一主两从
dynamic-datasource与 ShardingSphere 不兼容,已弃用
Lombok / HikariCP简化开发 / 高性能连接池

⚙️ 核心配置详解(application.yml)

📌 一、项目整体结构预览

sharding-demo/
├── src/
│   ├── main/
│   │   ├── java/com/example/shardingdemo/
│   │   │   ├── controller/
│   │   │   ├── entity/
│   │   │   ├── mapper/
│   │   │   ├── ShardingDemoApplication.java
│   └── resources/
│       ├── application.yml
├── pom.xml

🧱 二、核心依赖配置(pom.xml)

<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version> <!-- 使用最新版本 --></dependency><!-- MyBatis Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.11</version></dependency><!-- ShardingSphere-JDBC --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.1</version></dependency><!-- MySQL Connector --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- Lombok & Fastjson 可选 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

🧬 三、数据结构设计(核心表)

1️⃣ 用户表(广播表)
CREATE TABLE t_user (id BIGINT PRIMARY KEY,username VARCHAR(50),phone VARCHAR(20)
);
2️⃣ 订单主表(分库 + 分表)
CREATE TABLE t_order_0 (id BIGINT PRIMARY KEY,user_id BIGINT,order_no VARCHAR(64),amount DECIMAL(10,2),create_time DATETIME
);
CREATE TABLE t_order_1 (id BIGINT PRIMARY KEY,user_id BIGINT,order_no VARCHAR(64),amount DECIMAL(10,2),create_time DATETIME
);
CREATE TABLE t_order_2 (id BIGINT PRIMARY KEY,user_id BIGINT,order_no VARCHAR(64),amount DECIMAL(10,2),create_time DATETIME
);

⚙️ 四、application.yml 配置(核心)

spring:shardingsphere:datasource:names: ds0, ds1, ds2ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://mysql-master:3307/testdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: rootds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://mysql-slave1:3308/testdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: rootds2:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://mysql-slave2:3309/testdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: rootrules:sharding:tables:t_order:actual-data-nodes: ds$->{0..2}.t_order_$->{0..2}table-strategy:standard:sharding-column: user_idsharding-algorithm-name: order-table-inline  # 使用 sharding-algorithm-namedatabase-strategy:standard:sharding-column: user_idsharding-algorithm-name: order-db-inlinebroadcast-tables:- t_userdefault-database-strategy:none:default-table-strategy:none:sharding-algorithms:order-db-inline:type: INLINEprops:algorithm-expression: ds${user_id % 3}order-table-inline:type: INLINEprops:algorithm-expression: t_order_${user_id % 3}props:sql-show: true
ShardingSphere-JDBC 配置详解
1. 数据源配置 (datasource)

定义了 3 个 MySQL 数据源(ds0ds1ds2),分别指向主库和从库。

配置项说明
spring.shardingsphere.datasource.names数据源名称列表(ds0, ds1, ds2
ds0.type数据源类型(HikariCP 连接池)
ds0.driver-class-nameJDBC 驱动类(MySQL 8.0+)
ds0.jdbc-url主库连接 URL(mysql-master:3307
ds0.username / ds0.password数据库登录凭据(root/root
ds1.jdbc-url从库 1 连接 URL(mysql-slave1:3308
ds2.jdbc-url从库 2 连接 URL(mysql-slave2:3309

2. 分片规则 (rules.sharding)
(1) 表分片配置 (tables)

配置 t_order 表的分库分表策略。

配置项说明
t_order.actual-data-nodes实际数据节点格式: - ds$->{0..2}.t_order_$->{0..2} 表示: - 数据源:ds0ds1ds2 - 表:t_order_0t_order_1t_order_2
t_order.table-strategy表分片策略(按 user_id 分片)
t_order.database-strategy库分片策略(按 user_id 分库)
(2) 分片算法 (sharding-algorithms)

定义库和表的分片算法。

算法名称类型算法表达式说明
order-db-inlineINLINEds${user_id % 3}根据 user_id % 3 路由到 ds0/ds1/ds2
order-table-inlineINLINEt_order_${user_id % 3}根据 user_id % 3 路由到 t_order_0/t_order_1/t_order_2
(3) 广播表 (broadcast-tables)

配置 t_user 表为广播表(所有库全量同步)。

配置项说明
broadcast-tables广播表列表(t_user
(4) 默认策略 (default-*)

显式禁用默认分库分表策略(仅对未配置的表生效)。

配置项说明
default-database-strategy.none默认不分库
default-table-strategy.none默认不分表

3. 属性配置 (props)
配置项说明
sql-show: true打印 SQL 日志(调试用)

完整配置总结
层级关键配置项作用
数据源datasource.names定义 3 个数据源(ds0, ds1, ds2
分片规则tables.t_order.actual-data-nodes逻辑表 t_order 映射到 3 个库的 3 张分表(共 9 张表)
分片策略database-strategy / table-strategyuser_id 分库分表
分片算法order-db-inline / order-table-inline通过取模运算路由数据
广播表broadcast-tables: t_usert_user 表在所有库中全量同步
调试sql-show: true打印实际执行的 SQL

潜在问题检查
  1. 表名冲突
    • 确保数据库中不存在名为 order 的表(你的配置已使用 t_order,无冲突)。
  2. 分表是否创建
    • 需手动创建所有分表(如 ds0.t_order_0, ds1.t_order_1 等)。
  3. 分片键类型
    • user_id 应为数值类型(否则 % 运算可能失败)。
  4. SQL 日志验证
    • 启用 sql-show: true 后,观察日志确认路由是否正确。

示例 SQL 路由结果

假设 user_id = 5

  • 分库路由5 % 3 = 2ds2

  • 分表路由5 % 3 = 2t_order_2

  • 最终 SQL:

    INSERT INTO t_order_2 (id, user_id, ...) VALUES (?, 5, ...)
    

    执行在 ds2 数据源上。


通过以上配置,ShardingSphere 会根据 user_id 自动将数据分散到不同的库和表中。如果仍有问题,建议检查:

  1. 数据库表是否已创建。
  2. 分片键 user_id 的值是否符合预期。
  3. 日志中输出的实际 SQL 是否符合分片逻辑。

🧩 五、Java 实体与 DAO 层设计

实体类

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.math.BigDecimal;
import java.time.LocalDateTime;@Data
@TableName("t_order")
public class Order {private Long id;private Long userId;private String orderNo;private BigDecimal amount;private LocalDateTime createTime;
}

Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.shardingdemo.entity.Order;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

Controller接口

import cn.hutool.core.util.IdUtil;
import com.example.shardingdemo.entity.Order;
import com.example.shardingdemo.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderMapper orderMapper;@PostMapping("/create")public String createOrder() {Order order = new Order();order.setId(IdUtil.getSnowflakeNextId());order.setUserId(1001L);order.setOrderNo("ORDER_" + System.currentTimeMillis());order.setAmount(new BigDecimal("99.99"));order.setCreateTime(LocalDateTime.now());orderMapper.insert(order);return "OK";}@GetMapping("/list")public List<Order> listOrders() {return orderMapper.selectList(null);}
}

🚦 常用查询效果演示

✅ 写入数据

Logic SQL: INSERT INTO t_order  ( id, user_id, order_no, amount, create_time )  VALUES (  ?, ?, ?, ?, ?  )
Actual SQL: ds2 ::: INSERT INTO t_order_2  ( id, user_id, order_no, amount, create_time )  VALUES (?, ?, ?, ?, ?) ::: [1952250075647401984, 1001, ORDER_1754287663743, 99.99, 2025-08-04T14:07:43.743983]
计算 userId=1001 的路由结果
(1) 分库计算
1001 % 3 = 2  // 余数为 2

目标库:ds2(对应 ds${2})

(2) 分表计算
1001 % 3 = 2  // 余数仍为 2

目标表:t_order_2(对应 t_order_${2})

✅ 查询数据

Actual SQL: ds2 ::: SELECT id,user_id,order_no,amount,create_time FROM t_order_0 WHERE id=? UNION ALL SELECT id,user_id,order_no,amount,create_time FROM t_order_1 WHERE id=? UNION ALL SELECT id,user_id,order_no,amount,create_time FROM t_order_2 WHERE id=? ::: [1952241523566383104, 1952241523566383104, 1952241523566383104]

👉 自动路由,跨表/跨库查询时支持 Merge 结果集


🚧 常见问题与优化建议

问题/瓶颈原因分析优化建议
跨库查询慢无法使用索引避免跨库;结合分片键做等值过滤
写入热点库慢分片策略不均匀使用雪花 ID + hash 分库分表策略
SQL 不支持复杂 JOIN / 子查询等拆分逻辑到应用层,使用绑定表提升性能
分布式事务处理多库事务需要协调引入 Seata 或采用 BASE 最终一致性方案
分片表扩容麻烦表名写死、规则不灵活使用 Hint / 时间分片表达式 / Inline 表达式

📎 参考资料与源码下载

  • 🔗 官方文档(ShardingSphere)

💬 如果你觉得这篇文章对你有帮助,欢迎点赞 + 收藏 + 评论,一起交流分库分表最佳实践!

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

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

相关文章

MaxKB 使用 MCP 连接 Oracle (免安装 cx_Oracle 和 Oracle Instant Client)

一、背景 安装cx_Oracle包和Oracle Instant Client来操作数据库&#xff0c;比较繁琐同时容易冲突&#xff0c;不同的 Oracle 版本都需要安装不同的插件。这篇文章将介绍使用 MCP 协议的连接方法。 二、操作步骤 1、使用 1Panel 安装 DBhub a) 数据库类型选择 Oracle 类型。…

基于Python的超声波OFDM数字通信链路设计与实现

基于Python的超声波OFDM数字通信链路设计与实现 摘要 本文详细介绍了使用Python实现的超声波OFDM(正交频分复用)数字通信链路系统。该系统能够在标准音响设备上运行&#xff0c;利用高于15kHz的超声波频段进行数据传输&#xff0c;采用48kHz采样率。文章涵盖了从OFDM基本原理、…

滑动窗口相关题目

近些年来&#xff0c;我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨&#xff08;编号1-N&#xff09;&#xff0c;排成一排。一个月后&#xff0c;有M棵胡杨未能成活。现可补种胡杨K棵&#xff0c;请问如何补种&#xff08;只能补种&#xff0c;不能新种&#xff09;&#xf…

Java 工具类的“活化石”:Apache Commons 核心用法、性能陷阱与现代替代方案

在上一篇文章中&#xff0c;我们回顾了 Apache Commons 的经典组件。但作为 Java 世界中资历最老、影响最深远的工具库&#xff0c;它的价值远不止于此。许多开发者可能只使用了它 10% 的功能&#xff0c;却忽略了另外 80% 能极大提升代码质量的“隐藏宝石”。本文将提供一个更…

数据结构——图及其C++实现 多源最短路径 FloydWarshall算法

目录 一、前言 二、算法思想 三、代码实现 四、测试 五、源码 一、前言 前两篇学习的Dijkstra算法和Bellman-Ford算法都是用来求解图的单源最短路径&#xff0c;即从图中指定的一个源点出发到图中其他任意顶点的最短路径。Dijkstra算法不能求解带有负权重的图的最短路径&…

解决微软应用商店 (Microsoft store) 打不开,无网络连接的问题!

很多小伙伴都会遇见微软应用商店 (Microsoft store)打开后出现无网络的问题&#xff0c;一般出现这种问题基本都是因为你的电脑安装了某些银行的网银工具&#xff0c;因为网银工具为了安全会关闭Internet 选项中的最新版本的TLS协议&#xff0c;而微软商店又需要最新的TLS协议才…

Android—服务+通知=>前台服务

文章目录1、Android服务1.1、定义1.2、基本用法1.2.1、定义一个服务1.2.2、服务注册1.2.3、启动和停止服务1.2.4、活动和服务进行通信1.3、带绑定的服务示例1.3.1、定义服务类1.3.2、客户端&#xff08;Activity&#xff09;绑定与交互​1.3.3、AndroidManifest.xml 注册​1.3.…

从基础功能到自主决策, Agent 开发进阶路怎么走

Agent 开发进阶路线大纲基础功能实现核心模块构建环境感知&#xff1a;传感器数据处理&#xff08;视觉、语音、文本等输入&#xff09;基础动作控制&#xff1a;API调用、硬件驱动、简单反馈机制状态管理&#xff1a;有限状态机&#xff08;FSM&#xff09;或行为树&#xff0…

《动手学深度学习》读书笔记—9.6编码器-解码器架构

本文记录了自己在阅读《动手学深度学习》时的一些思考&#xff0c;仅用来作为作者本人的学习笔记&#xff0c;不存在商业用途。 正如我们在9.5机器翻译中所讨论的&#xff0c;机器翻译是序列转换模型的一个核心问题&#xff0c;其输入和输出都是长度可变的序列。为了处理这种类…

DocBench:面向大模型文档阅读系统的评估基准与数据集分析

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 一、数据集概述与核心目标 DocBench 是由研究团队于2024年提出的首个…

Python高级排序技术:非原生可比对象的自定义排序策略详解

引言&#xff1a;超越原生比较操作的排序挑战在Python数据处理中&#xff0c;我们经常需要处理不原生支持比较操作的对象。根据2024年《Python开发者生态系统报告》&#xff0c;在大型项目中&#xff0c;开发者平均需处理28%的自定义对象排序需求&#xff0c;这些对象包括&…

低代码系统的技术深度:超越“可视化操作”的架构与实现挑战

在很多非开发者眼中&#xff0c;低代码平台似乎只是简化流程、快速搭建页面的工具。然而&#xff0c;在真实的企业级应用中&#xff0c;低代码系统必须面对高并发请求、复杂业务规则、多角色权限、跨系统集成与持续演进等一系列工程挑战。高效交付&#xff08;Rapid Delivery&a…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 词云图-微博评论词云图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解词云图-微博评论词云图实现 视频在线地址&…

Webpack核心技能:Webpack安装配置与模块化

一、webpack 的安装和使用1. webpack 简介webpack 是基于模块化的打包 (构建)工具&#xff0c;它把一切视为模块&#xff08;包括 JS、CSS、图片等资源文件&#xff09;。工作原理&#xff1a;以开发时态的入口模块为起点递归分析所有依赖关系经过压缩、合并等处理最终生成运行…

数据结构---二级指针(应用场景)、内核链表、栈(系统栈、实现方式)、队列(实现方式、应用)

一、二级指针的应用场景1、在被调函数中&#xff0c;想要修改主调函数中的指针变量&#xff0c;需要传递该指针变量的地址&#xff0c;形参用二级指针接收。2、指针数组的数组名是一个二级指针&#xff0c;指针数组的数组名作为参数传递时&#xff0c;可用二级指针接收。指针数…

NodeJs学习日志(1):windows安装使用node.js 安装express,suquelize,sqlite,nodemon

windows安装使用node.js 安装express&#xff0c;suquelize&#xff0c;sqlite 系统是win10&#xff0c;默认已经安装好nodejs与npm包名作用expressWeb应用框架suquelize数据库ORMsqlite数据库nodemon代码热重载安装express 添加express生成器 npm add express-generator4安装e…

Cervantes:面向渗透测试人员和红队的开源协作平台

Cervantes 是一个专为渗透测试人员和红队打造的开源协作平台。它提供了一个集中式工作区&#xff0c;用于集中管理项目、客户端、漏洞和报告。通过简化数据组织和团队协调&#xff0c;它有助于减少规划和执行渗透测试所需的时间和复杂性。 作为 OWASP 旗下的开源解决方案&…

[Python 基础课程]猜数字游戏

使用 Python 实现一个猜数字游戏&#xff0c;先随机生成一个 1 到 100 之间的一个随机整数&#xff0c;让用户猜测这个数是什么&#xff0c;每次都提示用户猜大了还是猜小了&#xff0c;如果用户猜对了&#xff0c;提示用户猜对了&#xff0c;用了多少次&#xff0c;并且之前每…

文件加密实现

一、不依赖外部库实现 使用自定义的XOR加密算法结合简单的密钥扩展。 实现说明 这个方案不依赖任何外部库&#xff0c;仅使用C标准库实现&#xff1a; 加密原理&#xff1a;采用XOR加密算法&#xff0c;这是一种简单但有效的对称加密方式&#xff0c;相同的密钥可以用于加密和解…

Unity轻量观察相机

一、脚本功能简介ObserveCamera 是一个可直接挂载到任意 GameObject 上的通用摄像机控制脚本&#xff0c;支持以下功能&#xff1a;鼠标右键控制摄像机绕自身旋转&#xff08;俯仰、水平&#xff09;鼠标左键拖拽目标对象进行平移&#xff08;局部 XY 平面移动&#xff09;鼠标…