# magic-api-plugin **Repository Path**: sirius/magic-api-plugin ## Basic Information - **Project Name**: magic-api-plugin - **Description**: 整理一下,自己写的一些magic-api的插件 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 25 - **Forks**: 20 - **Created**: 2023-01-22 - **Last Updated**: 2026-09-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Magic API 插件集合 ## 项目介绍 Magic API 插件集合是一系列为 Magic API 框架开发的功能扩展插件,旨在增强 Magic API 的能力,提供更多实用功能。这些插件涵盖了网关集成、监控、服务注册与发现、远程调用、认证授权和流量控制等多个方面。 ## 插件列表 ### 1. magic-api-plugin-monitor-starter **功能**:为 Magic API 提供 Prometheus 监控能力 - JVM 指标:内存使用、GC 次数、线程状态等 - HTTP 指标:API 调用次数、响应时间、错误率等 - 系统指标:CPU 使用率、磁盘使用等 ### 2. magic-api-plugin-nacos-starter **功能**:为 Magic API 提供 Nacos 集成功能 - 配置获取:从 Nacos 配置中心获取配置信息 - 服务注册:将 Magic API 服务注册到 Nacos 服务发现 - 集群同步:利用 Nacos 配置监听实现 Magic API 集群间的接口配置同步 ### 3. magic-api-plugin-rpc-starter **功能**:基于 Dubbo 的远程调用插件 - 服务注册与发现:将 Magic API 接口注册为 Dubbo 服务,支持服务发现 - 动态管理:支持运行时修改和热更新 RPC 服务 - 泛化调用:基于 Dubbo 泛化接口,无需生成客户端代码 - 可视化管理:提供直观的前端管理界面 - 依赖 Nacos 插件提供服务注册和发现功能 ### 4. magic-api-plugin-satoken-starter **功能**:Magic-API 的 SaToken 鉴权插件 - LOCAL 模式:使用 Sa-Token 进行本地鉴权 - OAUTH2CLIENT 模式:作为 OAuth2 客户端对接外部认证服务 - 权限校验:支持基于角色和权限的细粒度控制 - Bearer Token:支持从 Authorization 头获取 token ### 5. magic-api-plugin-sentinel-starter **功能**:基于 Sentinel 的限流与熔断插件 - 流量控制:支持基于 QPS 和线程数的限流,多种流控模式 - 熔断降级:支持 RT、异常比例、异常数三种熔断策略 - 热点参数限流:对热点参数进行精确限流 - 系统保护:基于系统负载、CPU 使用率等指标的系统保护 - 授权规则:支持白名单和黑名单的授权控制 - 控制台集成:支持与 Sentinel 控制台集成,实现规则的动态配置 - 脚本函数:在 Magic API 脚本中使用 Sentinel 相关功能 ### 6. magic-api-plugin-seata-starter **功能**:基于 Seata 的分布式事务插件(独立 seata-server,注册中心走 Nacos) - 全局事务管控:脚本里以程序化方式开启 / 提交 / 回滚 Seata 全局事务 - 脚本模块:提供 `seata.begin / commit / rollback / status / currentXid / transaction` 等函数 - 闭包语法糖:`seata.transaction(name, () => {...})` 自动提交、异常自动回滚 - TM 侧集成:事务生命周期交给 Seata 客户端,TC 独立部署、通过 Nacos 做注册中心 - 同线程自动传递:xid 通过 Seata RootContext 在当前线程内自动传递,串联 db / liteflow / 本地调用 - AT 模式自动代理:应用就绪后自动把 Magic API 的数据源包成 Seata DataSourceProxy,脚本里的 db 操作无感接入 AT 全局事务(可选开关 + 排除列表) - 跨服务传播(M3):调用方 `seata.getXid()` 取 xid 塞进下游请求头,下游由入站拦截器自动 bind 加入全局事务;Dubbo 调用由 Seata 过滤器自动透传 attachment;脚本另提供 `bind / unbind / xidHeader` 手动接管 ## 版本要求 - Java 17+ - Spring Boot 3.4.9+ - Magic API 2.2.2+ ## 安装方法 ### Maven 依赖 ```xml org.ssssssss magic-api-plugin-monitor-starter 2.2.2 org.ssssssss magic-api-plugin-nacos-starter 2.2.2 org.ssssssss magic-api-plugin-rpc-starter 2.2.2 org.ssssssss magic-api-plugin-satoken-starter 2.2.2 org.ssssssss magic-api-plugin-sentinel-starter 2.2.2 org.ssssssss magic-api-plugin-seata-starter 2.2.2 ``` ### Gradle 依赖 ```gradle // 选择需要的插件添加依赖 // 监控插件 implementation 'org.ssssssss:magic-api-plugin-monitor-starter:2.2.2' // Nacos 插件 implementation 'org.ssssssss:magic-api-plugin-nacos-starter:2.2.2' // RPC 插件 implementation 'org.ssssssss:magic-api-plugin-rpc-starter:2.2.2' // SaToken 插件 implementation 'org.ssssssss:magic-api-plugin-satoken-starter:2.2.2' // Sentinel 插件 implementation 'org.ssssssss:magic-api-plugin-sentinel-starter:2.2.2' ``` ## 插件配置 ### Nacos 插件配置 **前置条件**:`spring.application.name` 必须配置,否则服务注册名会显示为 `unknown`。 ```yaml spring: application: name: your-service-name # 必填,Nacos 中注册的服务名 magic-api: nacos: enable-config: false # 是否开启配置管理 enable-discovery: true # 是否开启服务注册与发现 enable-cluster: false # 是否开启集群同步(基于配置监听,有 1~3s 延迟) enable-start-config: false # 是否开启启动时获取配置 server-addr: 127.0.0.1:8848 # Nacos 服务地址 group: DEFAULT_GROUP # 配置分组,默认 DEFAULT_GROUP service-name: my-service # 服务名(可选,默认读取 spring.application.name) cluster-name: DEFAULT # 集群名 namespace: "" # 命名空间,为空使用默认命名空间 # 以下为鉴权配置(Nacos 开启鉴权时需要) enable-auth: true username: nacos password: nacos ``` **配置说明**: | 配置项 | 必填 | 默认值 | 说明 | |--------|------|--------|------| | `enable-config` | 否 | false | 开启后从 Nacos 获取配置 | | `enable-discovery` | 否 | false | 开启后注册服务到 Nacos | | `enable-cluster` | 否 | false | 开启后启用集群同步(基于配置监听,有 1~3s 延迟) | | `enable-start-config` | 否 | false | 开启后启动时从 Nacos 拉取配置 | | `server-addr` | 是 | - | Nacos 服务器地址 | | `group` | 否 | DEFAULT_GROUP | 配置分组 | | `service-name` | 否 | spring.application.name | 注册到 Nacos 的服务名 | | `cluster-name` | 否 | DEFAULT | 集群名称 | | `namespace` | 否 | "" | 命名空间 ID | | `enable-auth` | 否 | false | 是否开启鉴权 | | `username` | 否 | - | 鉴权用户名 | | `password` | 否 | - | 鉴权密码 | ### Seata 插件配置 **前置条件**:已独立部署 seata-server(TC),并让它和本服务连同一个 Nacos 做注册中心。 ```yaml magic-api: seata: enabled: true # 总开关(默认开启),关闭后脚本里 import seata 不可用 at-datasource-enabled: true # AT 模式自动数据源代理(默认开启),把 Magic API 的数据源包成 Seata DataSourceProxy exclude-datasources: "" # 不参与 AT 的数据源 key 列表(逗号分隔),如 "local,readonly" seata: enabled: true application-id: ${spring.application.name} # 参与方应用名,建议与 Nacos 服务名一致 tx-service-group: my_test_tx_group # 事务分组,需与 seata-server 的 vgroup 映射一致 registry: type: nacos nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP namespace: "" config: type: nacos nacos: server-addr: 127.0.0.1:8848 group: SEATA_GROUP service: vgroup-mapping: my_test_tx_group: default # default 对应 seata-server 的 cluster 名 grouplist: default: 127.0.0.1:8091 # seata-server 的 TC 地址(registry 用 nacos 时可省略) ``` **使用方式**(脚本里): ```js import seata; // 闭包语法糖:自动提交 / 异常回滚 seata.transaction("create-order", () => { db.update("insert into t_order ..."); liteflow.execute("/liteflow/deduct"); // 同线程内自动共享 xid }); ``` **跨服务传播 xid(M3)**: - **同线程(脚本里的 db / liteflow / 本地调用)**:`RootContext` 是 ThreadLocal,`transaction` 闭包内天然在同一全局事务,无需任何处理。 - **调下游 HTTP 服务**:调用方把当前 xid 放进请求头,下游自动加入。脚本里: ```js import seata; // 调用方:把 xid 塞进下游请求头(头名默认 TX_XID,可用 magic-api.seata.xid-header 改) http.post("http://svc-b/api/order/create") .header(seata.xidHeader(), seata.getXid()) .body({...}) .call(); ``` 下游若是本插件(默认 `xid-auto-bind: true`),`SeataXidRequestInterceptor` 会在请求处理前 自动 `RootContext.bind(xid)`、处理完 `unbind`,使下游的 db / liteflow 自动加入上游全局事务。 下游若关掉了 `xid-auto-bind`,也可在脚本里手动 `seata.bind(header("TX_XID"))`。 - **调下游 Dubbo 服务**:Seata 的 `SeataDubboFilter` 在 dubbo 在 classpath 时自动把 xid 透传 到 attachment,无需插件处理(前提是 rpc 插件用的是 Dubbo 且 Seata 的 Dubbo 过滤器已生效)。 脚本里还可直接操作 xid:`seata.getXid()` / `seata.currentXid()` 取当前 xid; `seata.bind(xid)` / `seata.unbind()` 用于手动接管(被调方加入上游事务的兜底)。 > **AT 模式自动数据源代理(M2,默认开启)**:插件在应用就绪后,会把 `MagicDynamicDataSource` > 里每个物理数据源用 `io.seata.rm.datasource.DataSourceProxy` 重新注册一遍,节点内部的 > `JdbcTemplate` / `TransactionManager` 会基于代理重建。这样脚本里 `db.xxx` 的 SQL 就会自动 > 记录 `undo_log`、注册分支,无感接入 AT 全局事务。 > - 若你已把数据源定义成 Spring `@Bean` 并被 Seata 自带代理包过,可设 `at-datasource-enabled: false` 关掉本插件代理,避免重复包装。 > - 不想参与 AT 的库(本地库、只读库)用 `exclude-datasources` 排除。 > - **每个参与 AT 的库都必须建 `undo_log` 表**(建表语句见 Seata 官方文档)。 > - 默认数据源的选择依赖 `order`,插件会原样保留各节点的 order(只读反射获取),不影响默认库。 > - 已知待联调验证:Magic API 若对数据源做懒加载(首次 db 调用才注册),则本代理可能在注册前执行, > 需改为监听对应的注册时机;另外若 Magic API 通过独立的 default 字段持有默认数据源引用,也需一并替换。 > - 入站 xid 绑定只覆盖 **Magic API 的接口请求**;下游若是普通 Spring Controller,需依赖 Seata > 自带的 Web 过滤器或手动 `seata.bind(xid)`。 > TCC / SAGA 模式不依赖数据源代理,始终可用。 ## 项目结构 ``` magic-api-plugin/ ├── magic-api-plugin-monitor-starter/ # 监控插件 ├── magic-api-plugin-nacos-starter/ # Nacos 集成插件 ├── magic-api-plugin-rpc-starter/ # RPC 远程调用插件 ├── magic-api-plugin-satoken-starter/ # SaToken 鉴权插件 ├── magic-api-plugin-sentinel-starter/ # Sentinel 限流熔断插件 ├── magic-api-plugin-seata-starter/ # Seata 分布式事务插件 ├── .gitignore ├── LICENSE ├── README.en.md └── README.md ``` ## 版本历史 | 版本 | 日期 | 变更内容 | |------|------|----------| | 2.2.2 | 2026-09-28 | Seata 插件升级至 Apache Seata 2.6.0(groupId 由 io.seata 改为 org.apache.seata,API 兼容) | | 2.2.2 | 2026-09-28 | Seata 插件 M3:新增 xid 跨服务传播(入站 xid 自动绑定拦截器 + getXid/bind/unbind/xidHeader 脚本方法) | | 2.2.2 | 2026-09-24 | Seata 插件 M2:新增 AT 模式自动数据源代理(MagicDynamicDataSource 包装为 Seata DataSourceProxy) | | 2.2.2 | 2026-09-24 | 新增 Seata 分布式事务插件(M1:全局事务脚本模块 + 自动配置) | | 2.2.2 | 2026-06-20 | Nacos 插件:添加 enable-cluster 独立开关,修复 Bean 注册问题,更新文档 | | 2.2.2 | 2026-06-05 | 项目优化:修复 P0/P1/P2 问题、添加单元测试、统一 properties 版本管理 | | 2.2.2 | 2026-04-09 | 项目整理,添加多个插件 | | 2.2.2 | 2026-04-06 | 添加 Higress 插件 | | 2.2.2 | 2026-03-27 | 优化 Nacos 插件 | | 2.2.2 | 2026-03-20 | 添加 RPC 插件 | | 2.2.2 | 2026-03-15 | 添加 SaToken 插件 | | 2.2.2 | 2026-03-10 | 添加 Sentinel 插件 | | 2.2.2 | 2026-03-05 | 添加监控插件 | ## 注意事项 1. **版本兼容性**:确保使用与 Magic API 版本兼容的插件版本 2. **依赖关系**:RPC 插件依赖 Nacos 插件提供服务注册和发现功能 3. **配置管理**:每个插件都有自己的配置项,请参考各插件的 README.md 文件 4. **性能考虑**:在生产环境中,请注意合理配置插件参数,避免影响系统性能 5. **安全性**:对于涉及认证和授权的插件,请确保正确配置安全参数 ## 优化内容 ### 工程结构优化 - ✅ 每个子模块独立构建,parent 统一指向 `org.ssssssss:magic-api-plugins` - ✅ 每个子模块 `pom.xml` 使用 `` 统一管理版本号 - ✅ 清理注释掉的依赖(nacos-starter 中的 fastjson) ### P0 问题修复 - ✅ SaToken 配置类添加 `@ConditionalOnProperty` 条件注解,未配置时不加载 - ✅ Dubbo 服务注册添加 Nacos namespace 支持,修复多环境部署问题 ### P1 问题修复 - ✅ satoken 模块包名 `Interceptor` → `interceptor`,符合 Java 命名规范 - ✅ 补全所有模块的 `spring.factories`(EnableAutoConfiguration) ### P2 问题修复 - ✅ Sentinel 配置类提取重复代码,新增 `createFlowRule()`、`createDegradeRule()` 方法 - ✅ HigressRouteSyncService 提取 `applyAuth()` 方法,消除认证代码重复 ### 测试与文档 - ✅ 添加 Sentinel 插件示例单元测试 - ✅ 更新 README.md 版本信息一致性