🐉 ShenYu 元数据同步操作文档

从权限中心数据库同步 HSF 服务元数据至 ShenYu 网关

📅 2026-05-26 👥 面向研发人员 📦 ShenYu Admin

📑 目录

  1. 什么是元数据(MetaData)
  2. 与 api-gateway 对标
  3. 为什么必须从数据库同步
  4. 操作步骤
  5. 字段映射关系
  6. 常见问题

1. 什么是元数据(MetaData)

在 ShenYu 网关中,元数据(MetaData) 是 HSF(RPC)服务方法的注册信息。它描述了一条 API 请求如何路由到后端 Java 服务的具体方法。

一条元数据包含哪些字段?

字段含义示例
path网关请求路径(唯一)/commodity/queryMaterialPage/v1
appName所属应用/业务中心commodity-service
rpcTypeRPC 类型hsf
serviceNameHSF 服务接口全限定名com.xxx.busi.service.MaterialService
methodName方法名queryMaterialPage
parameterTypes方法参数类型(逗号分隔)com.xxx.busi.dto.MaterialPageRequest
rpcExtHSF 扩展配置(JSON){"version":"1.0.0","group":"XLS_LOCAL","timeout":3000}
enabled是否启用1(启用)/ 0(禁用)

元数据在网关请求链路中的角色

客户端请求
    │  POST /rest/portal/commodity/queryMaterialPage/v1
    ▼
GlobalPlugin(路由匹配)
    │  根据 path 精确匹配 meta_data 表
    ▼
HSF 插件(RPC 调用)
    │  读取 serviceName + methodName + parameterTypes + rpcExt
    ▼
HSF 泛化调用 → 后端 Provider 服务
💡 一句话总结:元数据 = 网关路径到 HSF 服务方法的映射表。没有元数据,网关不知道请求该转发给哪个后端服务和方法。

2. 与 api-gateway 对标

在旧版 api-gateway 中,HSF 服务的路由配置是通过以下机制实现的:

维度旧 api-gateway新 ShenYu
配置来源 service/*.json 配置文件(22个)+ 权限中心数据库 api_service_json_config 表,启动时动态生成 proxy-remote-consumer.xml ShenYu Admin meta_data 表,由同步或手动注册创建
服务定义格式 service/*.json 配置文件(22个)+ 数据库 api_service_json_config 数据库中结构化记录,一条一个方法
HSF 消费者创建 XML 配置 + Spring 容器初始化 HSF 插件动态创建泛化调用消费者
路由匹配 Servlet URL Mapping GlobalPlugin path 精确匹配 + fallback
接口上线 修改 JSON 配置 + 重启网关 数据库插入/更新 + 点击同步按钮即可生效
可视化管理 ❌ 无界面,纯文件操作 ✅ Admin 管理后台,可搜索/编辑/批量操作
💡 核心区别:旧网关的服务配置散落在 JSON 文件和 XML 生成脚本中,新网关统一用 meta_data 表 + Admin 管理后台,配置集中化、可视化。

3. 为什么必须从数据库同步

3.1 环境迁移一致性保障(过渡方案)

api-gateway 将逐步从开发环境开始迁移到 ShenYu 和能力平台,按 dev → test → prod 的节奏推进。在实际迁移过程中,可能出现以下情况:

如果开发/测试环境直接在 ShenYu Admin 界面手动配置元数据,而没有通过数据库同步,那么:

⚠️ 核心原则:通过从权限中心数据库同步,确保所有环境(dev / test / prod)的元数据都来自同一权威数据源。开发/测试环境同步验证无误后,生产环境只需再次执行同步即可获得完全一致的配置,杜绝遗漏风险。
💡 注意:从权限中心同步为过渡方案。当前各业务中心正在进行架构升级,架构升级全部完成后,将改为使用 HSF 插件自动注册(shenyu-client-hsf),Provider 启动时自动上报元数据,届时权限中心数据库同步功能将逐步停用。

4. 操作步骤

1

在权限中心数据库中填写接口数据

api_service_json_config 表中插入新接口记录:

INSERT INTO api_service_json_config (
    service,          -- 接口路径(不含 /rest/ 前缀)
    service_name,     -- HSF 接口全限定名
    method_name,      -- 方法名
    belong_center,    -- 所属业务中心
    message,          -- 接口描述
    is_open,          -- 是否开放(1 是 / 0 否)
    service_version,  -- HSF 版本号
    group_name,       -- HSF 分组名
    client_timeout,   -- 超时时间(毫秒)
    retry_num,        -- 重试次数
    operat_type,      -- 操作类型
    is_sensitive      -- 是否敏感(1 是 / 0 否)
) VALUES (
    'commodity/queryMaterialPage/v1',
    'com.tydic.newretail.busi.service.MaterialService',
    'queryMaterialPage',
    'commodity-service',
    '商品分页查询',
    '1',
    '1.0.0',
    'XLS_LOCAL',
    '3000',
    '0',
    'select',
    '0'
);
2

进入 ShenYu Admin 元数据管理页面

浏览器访问 ShenYu Admin:

🔗 地址:https://dev-api.newretail.cmdcxls.com/admin/#/home
👤 账号:meta-developer
🔑 密码:Dev@2027

登录后进入:系统管理 → 元数据管理(路径:/System/Metadata

进入元数据管理页面
3

点击「从权限中心同步」按钮

在元数据表格上方工具栏,找到绿色「从权限中心同步」按钮并点击:

系统会弹出确认提示:"确认从权限中心同步元数据?" → 点击「确认」

点击从权限中心同步按钮
4

查看同步结果

同步完成后,弹出结果弹窗显示:

  • 新增:权限中心有但 ShenYu 中没有的接口,已自动创建元数据
  • 更新:两边都有的接口,HSF 配置(版本、超时等)已更新
  • 失败:同步出错的记录及原因
同步结果弹窗
5

补全 parameterTypes(参数类型)

权限中心的数据不包含 Java 方法参数类型,同步后的元数据 parameterTypes 默认为空。

为什么 api-gateway 不需要参数全限定名?

api-gateway 在每个 Provider 工程中维护了 service/*.json 配置文件,启动时动态生成 proxy-remote-consumer.xml(Spring XML)。这种方式下:

  • 每个 HSF 服务都创建了一个强类型代理 Bean(通过 Spring 容器管理)
  • 调用时走的是 JDK 反射代理HSFSpringConsumerBean),JVM 在运行时可从 Method 对象中自动获取参数类型
  • 参数类型信息已隐含在编译后的 .class 文件中,不需要额外配置

为什么 ShenYu 必须手动填写 parameterTypes?

ShenYu 网关不依赖 Provider 工程的 JAR 包,而是使用 HSF 泛化调用(GenericService)。这是一种不依赖接口 Stub 的调用方式:

  • 网关在运行时动态构造调用请求,不加载任何业务 JAR
  • HSF 泛化调用通过 GenericService.$invoke(methodName, parameterTypes, args) 发起
  • 参数在网络传输前需要序列化为字节流,HSF 框架必须知道参数的全限定类名才能找到正确的序列化器(如 Hessian/Java 原生序列化)
  • 如果 parameterTypes 为空或错误,HSF 无法确定参数属于哪个类,序列化失败 → 调用报错
对比维度旧 api-gateway新 ShenYu
调用方式 Spring Bean 强类型代理 HSF 泛化调用(GenericService)
依赖业务 JAR ✅ 是(需引入 Provider 接口包) ❌ 否(纯运行时动态调用)
参数类型来源 编译期确定,JVM 自动获取 需手动填写全限定类名
扩容新接口 需更新 JAR + 重启网关 只需同步元数据 + 补全参数类型

需要研发人员手动补全

方式一:在线编辑(推荐)

  1. 在元数据列表中找到 parameterTypes 为空的记录
  2. 点击右侧操作栏的 ✏️ 编辑按钮
  3. 在弹出的编辑框中填写 参数类型 字段
  4. 格式:参数的全限定类名,多个用逗号分隔
    例如:com.xxx.dto.MaterialPageRequest
  5. 点击确认保存
元数据列表-找到parameterTypes为空的记录
元数据编辑弹窗-填写参数类型

方式二:上传 JAR/WAR 自动补全

  1. 点击工具栏「补全参数类型」按钮
  2. 上传包含对应服务接口的 JAR/WAR 文件
  3. 系统通过反射自动识别方法参数类型并回填
补全参数类型-上传JAR按钮
上传JAR后参数类型自动回填
⚠️ 重要:parameterTypes 为空时 HSF 泛化调用无法正确序列化参数,必须补全后才能正常调用
6

验证同步数据

在元数据列表中搜索刚才同步的服务路径,确认字段值正确:

  • path 路径格式为 /{service}
  • rpcType 为 hsf
  • rpcExt 包含 version、group、timeout 等 HSF 配置
  • enabled 状态为「开启」
完成!同步后的元数据会自动下发到所有 Bootstrap 网关节点,无需重启网关即可生效。

5. 字段映射关系

下表展示权限中心 api_service_json_config 字段如何映射到 ShenYu meta_data 表:

api_service_json_config
(源 · 权限中心)
meta_data
(目标 · ShenYu)
转换逻辑
service path / 前缀 → /commodity/queryMaterialPage/v1
belong_center app_name 直接使用;为空时取 service 的第一段
message path_desc 直接使用;为空时回退到 belong_center
context_path 固定值 /rest
rpc_type 固定值 hsf
rule_name 固定值 /rest/**
service_name service_name 直接使用
method_name method_name 直接使用
—(权限中心无此字段) parameter_types 同步时为空,需手动补全
service_version rpc_ext
(JSON 对象)
→ rpcExt.version
group_name→ rpcExt.group
client_timeout→ rpcExt.timeout(默认 3000)
retry_num→ rpcExt.retries(默认 0)
service_name→ rpcExt.serviceInterface
operat_type→ rpcExt.operatType
is_sensitive→ rpcExt.isSensitive
rpcExt.protocol 固定值 "hsf"
rpcExt.loadbalance 固定值 "random"
is_open enabled "1" → true(开启),其他 → false(关闭)

rpcExt JSON 示例

{
  "version": "1.0.0",
  "group": "XLS_LOCAL",
  "timeout": 3000,
  "loadbalance": "random",
  "retries": 0,
  "protocol": "hsf",
  "serviceInterface": "com.tydic.newretail.busi.service.MaterialService",
  "operatType": "select",
  "isSensitive": "0",
  "connections": 20
}

rpcExt 字段说明

字段类型必填来源说明
versionStringapi_service_json_config.service_versionHSF 服务版本号,Provider 端注册版本
groupStringapi_service_json_config.group_nameHSF 服务分组,用于环境隔离(如 XLS_LOCAL / XLS_DEV)
timeoutintapi_service_json_config.client_timeoutHSF 调用超时时间(毫秒),默认 3000
loadbalanceString固定值负载均衡策略:random / roundrobin / leastactive
retriesintapi_service_json_config.retry_numHSF 调用失败重试次数,默认 0
protocolString固定值RPC 协议类型,HSF 固定为 hsf
serviceInterfaceStringapi_service_json_config.service_nameHSF 服务接口全限定类名,用于泛化调用
operatTypeString可选api_service_json_config.operat_type操作类型:select / insert / update / delete
isSensitiveString可选api_service_json_config.is_sensitive是否敏感操作:"1" 是 / "0" 否
connectionsint可选无(手动填写)HSF Consumer 最大连接数,默认 20。高并发接口可适当调大

6. 常见问题

Q1:同步按钮在哪里?

系统管理 → 元数据管理页面,表格上方工具栏的绿色按钮「从权限中心同步」。(需要具有 system:meta:add 权限)

Q2:同步后发现 config 变了但网关没生效?

元数据同步后会自动下发到所有 Bootstrap 网关节点,不需要重启网关。如果未生效,检查 Admin 和 Bootstrap 之间的数据同步方式(WebSocket/Nacos/Zookeeper 等)是否正常。

Q3:权限中心新建了接口,同步后是新增还是更新?

系统按 path 字段判断:path 在 ShenYu 中不存在的 → 新增;已存在的 → 更新 HSF 配置(不会覆盖已有的 parameterTypes)。

Q4:同步后 parameterTypes 为空怎么办?

两种方式补全:① 点击编辑按钮手动填写(适合少量接口);② 点击「补全参数类型」上传 JAR/WAR 自动反射获取(适合批量补全)。

Q5:能重复同步吗?

可以。重复同步是幂等的,已存在的记录会更新 HSF 配置字段,不会重复创建,也不会覆盖手动填写的 parameterTypes。