从权限中心数据库同步 HSF 服务元数据至 ShenYu 网关
在 ShenYu 网关中,元数据(MetaData) 是 HSF(RPC)服务方法的注册信息。它描述了一条 API 请求如何路由到后端 Java 服务的具体方法。
| 字段 | 含义 | 示例 |
|---|---|---|
path | 网关请求路径(唯一) | /commodity/queryMaterialPage/v1 |
appName | 所属应用/业务中心 | commodity-service |
rpcType | RPC 类型 | hsf |
serviceName | HSF 服务接口全限定名 | com.xxx.busi.service.MaterialService |
methodName | 方法名 | queryMaterialPage |
parameterTypes | 方法参数类型(逗号分隔) | com.xxx.busi.dto.MaterialPageRequest |
rpcExt | HSF 扩展配置(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 服务
在旧版 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 管理后台,可搜索/编辑/批量操作 |
meta_data 表 + Admin 管理后台,配置集中化、可视化。
api-gateway 将逐步从开发环境开始迁移到 ShenYu 和能力平台,按 dev → test → prod 的节奏推进。在实际迁移过程中,可能出现以下情况:
如果开发/测试环境直接在 ShenYu Admin 界面手动配置元数据,而没有通过数据库同步,那么:
在 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'
);
浏览器访问 ShenYu Admin:
| 🔗 地址: | https://dev-api.newretail.cmdcxls.com/admin/#/home |
| 👤 账号: | meta-developer |
| 🔑 密码: | Dev@2027 |
登录后进入:系统管理 → 元数据管理(路径:/System/Metadata)
在元数据表格上方工具栏,找到绿色「从权限中心同步」按钮并点击:
系统会弹出确认提示:"确认从权限中心同步元数据?" → 点击「确认」
同步完成后,弹出结果弹窗显示:
权限中心的数据不包含 Java 方法参数类型,同步后的元数据 parameterTypes 默认为空。
旧 api-gateway 在每个 Provider 工程中维护了 service/*.json 配置文件,启动时动态生成 proxy-remote-consumer.xml(Spring XML)。这种方式下:
HSFSpringConsumerBean),JVM 在运行时可从 Method 对象中自动获取参数类型.class 文件中,不需要额外配置ShenYu 网关不依赖 Provider 工程的 JAR 包,而是使用 HSF 泛化调用(GenericService)。这是一种不依赖接口 Stub 的调用方式:
GenericService.$invoke(methodName, parameterTypes, args) 发起parameterTypes 为空或错误,HSF 无法确定参数属于哪个类,序列化失败 → 调用报错| 对比维度 | 旧 api-gateway | 新 ShenYu |
|---|---|---|
| 调用方式 | Spring Bean 强类型代理 | HSF 泛化调用(GenericService) |
| 依赖业务 JAR | ✅ 是(需引入 Provider 接口包) | ❌ 否(纯运行时动态调用) |
| 参数类型来源 | 编译期确定,JVM 自动获取 | 需手动填写全限定类名 |
| 扩容新接口 | 需更新 JAR + 重启网关 | 只需同步元数据 + 补全参数类型 |
需要研发人员手动补全:
方式一:在线编辑(推荐)
parameterTypes 为空的记录com.xxx.dto.MaterialPageRequest
方式二:上传 JAR/WAR 自动补全
parameterTypes 为空时 HSF 泛化调用无法正确序列化参数,必须补全后才能正常调用。
在元数据列表中搜索刚才同步的服务路径,确认字段值正确:
/{service}hsf下表展示权限中心 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(关闭) |
{
"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
}
| 字段 | 类型 | 必填 | 来源 | 说明 |
|---|---|---|---|---|
version | String | ✅ | api_service_json_config.service_version | HSF 服务版本号,Provider 端注册版本 |
group | String | ✅ | api_service_json_config.group_name | HSF 服务分组,用于环境隔离(如 XLS_LOCAL / XLS_DEV) |
timeout | int | ✅ | api_service_json_config.client_timeout | HSF 调用超时时间(毫秒),默认 3000 |
loadbalance | String | ✅ | 固定值 | 负载均衡策略:random / roundrobin / leastactive |
retries | int | ✅ | api_service_json_config.retry_num | HSF 调用失败重试次数,默认 0 |
protocol | String | ✅ | 固定值 | RPC 协议类型,HSF 固定为 hsf |
serviceInterface | String | ✅ | api_service_json_config.service_name | HSF 服务接口全限定类名,用于泛化调用 |
operatType | String | 可选 | api_service_json_config.operat_type | 操作类型:select / insert / update / delete |
isSensitive | String | 可选 | api_service_json_config.is_sensitive | 是否敏感操作:"1" 是 / "0" 否 |
connections | int | 可选 | 无(手动填写) | HSF Consumer 最大连接数,默认 20。高并发接口可适当调大 |
系统管理 → 元数据管理页面,表格上方工具栏的绿色按钮「从权限中心同步」。(需要具有 system:meta:add 权限)
元数据同步后会自动下发到所有 Bootstrap 网关节点,不需要重启网关。如果未生效,检查 Admin 和 Bootstrap 之间的数据同步方式(WebSocket/Nacos/Zookeeper 等)是否正常。
系统按 path 字段判断:path 在 ShenYu 中不存在的 → 新增;已存在的 → 更新 HSF 配置(不会覆盖已有的 parameterTypes)。
两种方式补全:① 点击编辑按钮手动填写(适合少量接口);② 点击「补全参数类型」上传 JAR/WAR 自动反射获取(适合批量补全)。
可以。重复同步是幂等的,已存在的记录会更新 HSF 配置字段,不会重复创建,也不会覆盖手动填写的 parameterTypes。