This is an automated email from the ASF dual-hosted git repository.
liuhongyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 0a2b9f5eef improve the function of dubbo plugin configuration based on
selector, add registry config. (#6096)
0a2b9f5eef is described below
commit 0a2b9f5eef2d3c71f5957571d50d4fa765d22eca
Author: Wweiei <[email protected]>
AuthorDate: Sun Aug 17 16:50:41 2025 +0800
improve the function of dubbo plugin configuration based on selector, add
registry config. (#6096)
* feat: registry config basic operation
* feat: registry config basic operation
* feat: registry config basic operation
* feat: registry config basic operation
* fix:Copilot code review
* fix:Copilot code review
* fix:Copilot code review,update method judge exist registry_id
---------
Co-authored-by: aias00 <[email protected]>
---
db/init/mysql/schema.sql | 28 ++
db/init/ob/schema.sql | 27 ++
db/init/og/create-table.sql | 38 +++
db/init/oracle/schema.sql | 43 +++
db/init/pg/create-table.sql | 37 +++
db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql | 28 +-
db/upgrade/2.7.0-upgrade-2.7.1-ob.sql | 28 +-
db/upgrade/2.7.0-upgrade-2.7.1-og.sql | 40 ++-
db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql | 45 ++-
db/upgrade/2.7.0-upgrade-2.7.1-pg.sql | 39 ++-
.../http-debug-registry-config-controller-api.http | 79 +++++
.../admin/controller/RegistryController.java | 128 ++++++++
.../apache/shenyu/admin/mapper/RegistryMapper.java | 132 ++++++++
.../apache/shenyu/admin/model/dto/RegistryDTO.java | 199 ++++++++++++
.../shenyu/admin/model/entity/RegistryDO.java | 352 +++++++++++++++++++++
.../shenyu/admin/model/query/RegistryQuery.java | 139 ++++++++
.../apache/shenyu/admin/model/vo/RegistryVO.java | 212 +++++++++++++
.../shenyu/admin/service/RegistryService.java | 75 +++++
.../admin/service/impl/RegistryServiceImpl.java | 134 ++++++++
.../shenyu/admin/transfer/RegistryTransfer.java | 51 +++
.../src/main/resources/mappers/registry-sqlmap.xml | 267 ++++++++++++++++
21 files changed, 2116 insertions(+), 5 deletions(-)
diff --git a/db/init/mysql/schema.sql b/db/init/mysql/schema.sql
index 266829fd76..3292f11f9b 100644
--- a/db/init/mysql/schema.sql
+++ b/db/init/mysql/schema.sql
@@ -2703,3 +2703,31 @@ CREATE TABLE IF NOT EXISTS `instance_info` (
`date_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP COMMENT 'date_updated',
PRIMARY KEY (`id`)
);
+
+DROP TABLE IF EXISTS `registry_config`;
+
+CREATE TABLE `registry_config` (
+ `id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT
NULL COMMENT 'primary key id',
+ `registry_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'registry_id',
+ `protocol` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'protocol',
+ `address` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'address',
+ `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'username',
+ `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'password',
+ `namespace` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'namespace',
+ `group` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL
DEFAULT NULL COMMENT 'group',
+ `date_created` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT
'create time',
+ `date_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON
UPDATE CURRENT_TIMESTAMP(3) COMMENT 'update time',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = Dynamic;
+
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303901', '1346358560427216896',
'1953048313980116900', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303902', '1346358560427216896',
'1953048313980116901', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303903', '1346358560427216896',
'1953048313980116902', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303904', '1346358560427216896',
'1953048313980116903', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303905', '1346358560427216896',
'1953048313980116904', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
diff --git a/db/init/ob/schema.sql b/db/init/ob/schema.sql
index 7af05181e1..c0414df2d4 100644
--- a/db/init/ob/schema.sql
+++ b/db/init/ob/schema.sql
@@ -2620,3 +2620,30 @@ INSERT INTO `plugin_handle` VALUES
('1722804548510507356', '66', 'baseUrl', 'bas
INSERT INTO `plugin_handle` VALUES ('1722804548510507357', '66', 'apiKey',
'apiKey', 2, 2, 2, '{"required":"0","rule":""}', '2025-03-12 06:02:18.707',
'2025-03-12 06:02:18.707');
INSERT INTO `plugin_handle` VALUES ('1722804548510507358', '66', 'model',
'model', 2, 2, 3, '{"required":"0","rule":""}', '2025-03-12 06:02:32.450',
'2025-03-12 06:02:32.450');
INSERT INTO `plugin_handle` VALUES ('1722804548510507359', '66', 'content',
'content', 2, 2, 4, '{"required":"0","rule":""}', '2025-03-12 06:02:32.450',
'2025-03-12 06:02:32.450');
+
+DROP TABLE IF EXISTS `registry_config`;
+CREATE TABLE `registry_config` (
+ `id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT
NULL COMMENT 'primary key id',
+ `registry_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'registry_id',
+ `protocol` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'protocol',
+ `address` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NOT NULL COMMENT 'address',
+ `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'username',
+ `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'password',
+ `namespace` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
NULL DEFAULT NULL COMMENT 'namespace',
+ `group` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL
DEFAULT NULL COMMENT 'group',
+ `date_created` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT
'create time',
+ `date_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON
UPDATE CURRENT_TIMESTAMP(3) COMMENT 'update time',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = Dynamic;
+
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303901', '1346358560427216896',
'1953048313980116900', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303902', '1346358560427216896',
'1953048313980116901', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303903', '1346358560427216896',
'1953048313980116902', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303904', '1346358560427216896',
'1953048313980116903', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303905', '1346358560427216896',
'1953048313980116904', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
diff --git a/db/init/og/create-table.sql b/db/init/og/create-table.sql
index 54df4bd21f..e779a5e818 100644
--- a/db/init/og/create-table.sql
+++ b/db/init/og/create-table.sql
@@ -3014,3 +3014,41 @@ INSERT INTO "public"."permission" VALUES
('1697146861569542757', '13463585604272
INSERT INTO "public"."permission" VALUES ('1697146861569542758',
'1346358560427216896', '1844026199075534867', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542759',
'1346358560427216896', '1844026199075534868', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
+
+DROP TABLE IF EXISTS "public"."registry_config";
+CREATE TABLE "public"."registry_config" (
+ "id" varchar(128) NOT NULL,
+ "registry_id" varchar(50) NOT NULL,
+ "protocol" varchar(128) NOT NULL,
+ "address" varchar(512) NOT NULL,
+ "username" varchar(50),
+ "password" varchar(100),
+ "namespace" varchar(100),
+ "group" varchar(20),
+ "date_created" timestamp(3) NOT NULL DEFAULT timezone('UTC-8'::text,
(now())::timestamp(0) without time zone),
+ "date_updated" timestamp(3) NOT NULL DEFAULT timezone('UTC-8'::text,
(now())::timestamp(0) without time zone),
+ PRIMARY KEY ("id")
+);
+
+COMMENT ON COLUMN "public"."registry_config"."id" IS 'primary key';
+COMMENT ON COLUMN "public"."registry_config"."registry_id" IS 'registry_id';
+COMMENT ON COLUMN "public"."registry_config"."protocol" IS 'protocol';
+COMMENT ON COLUMN "public"."registry_config"."address" IS 'address';
+COMMENT ON COLUMN "public"."registry_config"."username" IS 'username';
+COMMENT ON COLUMN "public"."registry_config"."password" IS 'password';
+COMMENT ON COLUMN "public"."registry_config"."namespace" IS 'namespace';
+COMMENT ON COLUMN "public"."registry_config"."group" IS 'group';
+COMMENT ON COLUMN "public"."registry_config"."date_created" IS 'create time';
+COMMENT ON COLUMN "public"."registry_config"."date_updated" IS 'update time';
+
+INSERT INTO "public"."resource" VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO "public"."permission" VALUES ('1953049887387303901',
'1346358560427216896', '1953048313980116900', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303902',
'1346358560427216896', '1953048313980116901', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303903',
'1346358560427216896', '1953048313980116902', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303904',
'1346358560427216896', '1953048313980116903', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303905',
'1346358560427216896', '1953048313980116904', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
diff --git a/db/init/oracle/schema.sql b/db/init/oracle/schema.sql
index d273a954b1..81779376ba 100644
--- a/db/init/oracle/schema.sql
+++ b/db/init/oracle/schema.sql
@@ -3607,3 +3607,46 @@ INSERT INTO permission (id, role_id, resource_id,
date_created, date_updated) VA
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542758', '1346358560427216896', '1844026199075534867',
sysdate, sysdate);
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542759', '1346358560427216896', '1844026199075534868',
sysdate, sysdate);
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542760', '1346358560427216896', '1844026199075534869',
sysdate, sysdate);
+
+CREATE TABLE "public"."registry_config" (
+ id varchar2(128) NOT NULL,
+ registry_id varchar2(50) NOT NULL,
+ protocol varchar2(128) NOT NULL,
+ address varchar2(512) NOT NULL,
+ username varchar2(50),
+ password varchar2(100),
+ namespace varchar2(100),
+ group varchar2(20),
+ date_created timestamp(3) DEFAULT SYSTIMESTAMP NOT NULL,
+ date_updated timestamp(3) DEFAULT SYSTIMESTAMP NOT NULL,
+ CONSTRAINT registry_config_pk PRIMARY KEY (id)
+);
+
+COMMENT ON TABLE registry_config IS 'registry config information table';
+COMMENT ON COLUMN registry_config.id IS 'primary key';
+COMMENT ON COLUMN registry_config.registry_id IS 'registry_id';
+COMMENT ON COLUMN registry_config.protocol IS 'protocol';
+COMMENT ON COLUMN registry_config.address IS 'address';
+COMMENT ON COLUMN registry_config.username IS 'username';
+COMMENT ON COLUMN registry_config.password IS 'password';
+COMMENT ON COLUMN registry_config.namespace IS 'namespace';
+COMMENT ON COLUMN registry_config.group IS 'group';
+COMMENT ON COLUMN registry_config.date_created IS 'create time';
+COMMENT ON COLUMN registry_config.date_updated IS 'update time';
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116900', '1357956838021890048',
'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry', '/config/registry',
'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116901', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0, 'system:registry:add',
1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116902', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116903', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1, 0,
'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116904', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303901', '1346358560427216896', '1953048313980116900',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303902', '1346358560427216896', '1953048313980116901',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303903', '1346358560427216896', '1953048313980116902',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303904', '1346358560427216896', '1953048313980116903',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303905', '1346358560427216896', '1953048313980116904',
sysdate, sysdate);
\ No newline at end of file
diff --git a/db/init/pg/create-table.sql b/db/init/pg/create-table.sql
index 1cb674daf5..e386ab7c3e 100644
--- a/db/init/pg/create-table.sql
+++ b/db/init/pg/create-table.sql
@@ -3149,3 +3149,40 @@ INSERT INTO "public"."permission" VALUES
('1697146861569542757', '13463585604272
INSERT INTO "public"."permission" VALUES ('1697146861569542758',
'1346358560427216896', '1844026199075534867', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542759',
'1346358560427216896', '1844026199075534868', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
+
+DROP TABLE IF EXISTS "public"."registry_config";
+CREATE TABLE "public"."registry_config" (
+ "id" varchar(128) NOT NULL,
+ "registry_id" varchar(50) NOT NULL,
+ "protocol" varchar(128) NOT NULL,
+ "address" varchar(512) NOT NULL,
+ "username" varchar(50),
+ "password" varchar(100),
+ "namespace" varchar(100),
+ "group" varchar(20),
+ "date_created" timestamp(3) NOT NULL DEFAULT timezone('UTC-8'::text,
(now())::timestamp(0) without time zone),
+ "date_updated" timestamp(3) NOT NULL DEFAULT timezone('UTC-8'::text,
(now())::timestamp(0) without time zone),
+ PRIMARY KEY ("id")
+);
+COMMENT ON COLUMN "public"."registry_config"."id" IS 'primary key';
+COMMENT ON COLUMN "public"."registry_config"."registry_id" IS 'registry_id';
+COMMENT ON COLUMN "public"."registry_config"."protocol" IS 'protocol';
+COMMENT ON COLUMN "public"."registry_config"."address" IS 'address';
+COMMENT ON COLUMN "public"."registry_config"."username" IS 'username';
+COMMENT ON COLUMN "public"."registry_config"."password" IS 'password';
+COMMENT ON COLUMN "public"."registry_config"."namespace" IS 'namespace';
+COMMENT ON COLUMN "public"."registry_config"."group" IS 'group';
+COMMENT ON COLUMN "public"."registry_config"."date_created" IS 'create time';
+COMMENT ON COLUMN "public"."registry_config"."date_updated" IS 'update time';
+
+INSERT INTO "public"."resource" VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO "public"."permission" VALUES ('1953049887387303901',
'1346358560427216896', '1953048313980116900', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303902',
'1346358560427216896', '1953048313980116901', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303903',
'1346358560427216896', '1953048313980116902', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303904',
'1346358560427216896', '1953048313980116903', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303905',
'1346358560427216896', '1953048313980116904', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
\ No newline at end of file
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
b/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
index 99d376da10..87e56d6aa2 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-mysql.sql
@@ -238,4 +238,30 @@ DELETE FROM `plugin_handle` WHERE `plugin_id` = '8';
INSERT INTO `plugin_handle` VALUES ('1529402613204173925', '6', 'registry',
'registry', 2, 1, 0, '{\"required\":\"0\",\"rule\":\"\"}', '2025-02-27
17:20:50.233', '2025-02-27 17:20:50.233');
UPDATE `plugin_handle` SET ext_obj = '{\"required\":\"0\",\"rule\":\"\"}'
WHERE plugin_id = '6' AND label = 'ip:port' AND data_type = 2;
-INSERT INTO `plugin_handle` VALUES ('1942847622591684608', '61',
'messageEndpoint', 'messageEndpoint', 2, 1, 0,
'{"required":"0","defaultValue":"/message","rule":""}', '2025-07-09
07:25:44.249', '2025-07-09 07:25:44.249');
\ No newline at end of file
+INSERT INTO `plugin_handle` VALUES ('1942847622591684608', '61',
'messageEndpoint', 'messageEndpoint', 2, 1, 0,
'{"required":"0","defaultValue":"/message","rule":""}', '2025-07-09
07:25:44.249', '2025-07-09 07:25:44.249');
+
+CREATE TABLE `registry_config` (
+ `id` varchar(128) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'primary key id',
+ `registry_id` varchar(50) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'registry_id',
+ `protocol` varchar(128) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'protocol',
+ `address` varchar(512) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'address',
+ `username` varchar(50) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'username',
+ `password` varchar(100) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'password',
+ `namespace` varchar(100) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'namespace',
+ `group` varchar(20) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'group',
+ `date_created` timestamp(3) NOT NULL
DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'create time',
+ `date_updated` timestamp(3) NOT NULL
DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'update
time',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = Dynamic;
+
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303901', '1346358560427216896',
'1953048313980116900', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303902', '1346358560427216896',
'1953048313980116901', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303903', '1346358560427216896',
'1953048313980116902', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303904', '1346358560427216896',
'1953048313980116903', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303905', '1346358560427216896',
'1953048313980116904', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
b/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
index 271a8cfe3d..4ee7f8dbc1 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-ob.sql
@@ -231,4 +231,30 @@ INSERT INTO `permission` VALUES ('1697146861569542756',
'1346358560427216896', '
INSERT INTO `permission` VALUES ('1697146861569542757', '1346358560427216896',
'1844026199075534866', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
INSERT INTO `permission` VALUES ('1697146861569542758', '1346358560427216896',
'1844026199075534867', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
INSERT INTO `permission` VALUES ('1697146861569542759', '1346358560427216896',
'1844026199075534868', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
-INSERT INTO `permission` VALUES ('1697146861569542760', '1346358560427216896',
'1844026199075534869', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
\ No newline at end of file
+INSERT INTO `permission` VALUES ('1697146861569542760', '1346358560427216896',
'1844026199075534869', '2023-08-31 07:18:37', '2023-08-31 07:18:37');
+
+CREATE TABLE `registry_config` (
+ `id` varchar(128) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'primary key id',
+ `registry_id` varchar(50) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'registry_id',
+ `protocol` varchar(128) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'protocol',
+ `address` varchar(512) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'address',
+ `username` varchar(50) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'username',
+ `password` varchar(100) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'password',
+ `namespace` varchar(100) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'namespace',
+ `group` varchar(20) CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'group',
+ `date_created` timestamp(3) NOT NULL
DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'create time',
+ `date_updated` timestamp(3) NOT NULL
DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'update
time',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = Dynamic;
+
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO `resource` (`id`, `parent_id`, `title`, `name`, `url`,
`component`, `resource_type`, `sort`, `icon`, `is_leaf`, `is_route`, `perms`,
`status`, `date_created`, `date_updated`) VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303901', '1346358560427216896',
'1953048313980116900', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303902', '1346358560427216896',
'1953048313980116901', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303903', '1346358560427216896',
'1953048313980116902', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303904', '1346358560427216896',
'1953048313980116903', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO `permission` (`id`, `object_id`, `resource_id`, `date_created`,
`date_updated`) VALUES ('1953049887387303905', '1346358560427216896',
'1953048313980116904', '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
b/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
index 4f6cf7a2ff..be9366ac7b 100644
--- a/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-og.sql
@@ -243,4 +243,42 @@ INSERT INTO "public"."permission" VALUES
('1697146861569542756', '13463585604272
INSERT INTO "public"."permission" VALUES ('1697146861569542757',
'1346358560427216896', '1844026199075534866', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542758',
'1346358560427216896', '1844026199075534867', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542759',
'1346358560427216896', '1844026199075534868', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
-INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
\ No newline at end of file
+INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
+
+DROP TABLE IF EXISTS "public"."registry_config";
+CREATE TABLE "public"."registry_config" (
+ "id" varchar(128) NOT
NULL,
+ "registry_id" varchar(50) NOT
NULL,
+ "protocol" varchar(128) NOT
NULL,
+ "address" varchar(512) NOT
NULL,
+ "username" varchar(50),
+ "password" varchar(100),
+ "namespace" varchar(100),
+ "group" varchar(20),
+ "date_created" timestamp(3)
NOT NULL DEFAULT timezone('UTC-8'::text, (now())::timestamp(0) without time
zone),
+ "date_updated" timestamp(3)
NOT NULL DEFAULT timezone('UTC-8'::text, (now())::timestamp(0) without time
zone),
+ PRIMARY KEY ("id")
+);
+
+COMMENT ON COLUMN "public"."registry_config"."id" IS 'primary key';
+COMMENT ON COLUMN "public"."registry_config"."registry_id" IS 'registry_id';
+COMMENT ON COLUMN "public"."registry_config"."protocol" IS 'protocol';
+COMMENT ON COLUMN "public"."registry_config"."address" IS 'address';
+COMMENT ON COLUMN "public"."registry_config"."username" IS 'username';
+COMMENT ON COLUMN "public"."registry_config"."password" IS 'password';
+COMMENT ON COLUMN "public"."registry_config"."namespace" IS 'namespace';
+COMMENT ON COLUMN "public"."registry_config"."group" IS 'group';
+COMMENT ON COLUMN "public"."registry_config"."date_created" IS 'create time';
+COMMENT ON COLUMN "public"."registry_config"."date_updated" IS 'update time';
+
+INSERT INTO "public"."resource" VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO "public"."permission" VALUES ('1953049887387303901',
'1346358560427216896', '1953048313980116900', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303902',
'1346358560427216896', '1953048313980116901', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303903',
'1346358560427216896', '1953048313980116902', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303904',
'1346358560427216896', '1953048313980116903', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303905',
'1346358560427216896', '1953048313980116904', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
b/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
index 704193cae0..fb5df4f0c2 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-oracle.sql
@@ -523,4 +523,47 @@ INSERT INTO permission (id, role_id, resource_id,
date_created, date_updated) VA
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542757', '1346358560427216896', '1844026199075534866',
sysdate, sysdate);
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542758', '1346358560427216896', '1844026199075534867',
sysdate, sysdate);
INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542759', '1346358560427216896', '1844026199075534868',
sysdate, sysdate);
-INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542760', '1346358560427216896', '1844026199075534869',
sysdate, sysdate);
\ No newline at end of file
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1697146861569542760', '1346358560427216896', '1844026199075534869',
sysdate, sysdate);
+
+CREATE TABLE registry_config (
+ id varchar2(128) NOT NULL,
+ registry_id varchar2(50) NOT NULL,
+ protocol varchar2(128) NOT NULL,
+ address varchar2(512) NOT NULL,
+ username varchar2(50),
+ password varchar2(100),
+ namespace varchar2(100),
+ group varchar2(20),
+ date_created timestamp(3) DEFAULT SYSTIMESTAMP NOT NULL,
+ date_updated timestamp(3) DEFAULT SYSTIMESTAMP NOT NULL,
+ CONSTRAINT registry_config_pk PRIMARY KEY (id)
+);
+
+COMMENT ON TABLE registry_config IS 'registry config information table';
+COMMENT ON COLUMN registry_config.id IS 'primary key';
+COMMENT ON COLUMN registry_config.registry_id IS 'registry_id';
+COMMENT ON COLUMN registry_config.protocol IS 'protocol';
+COMMENT ON COLUMN registry_config.address IS 'address';
+COMMENT ON COLUMN registry_config.username IS 'username';
+COMMENT ON COLUMN registry_config.password IS 'password';
+COMMENT ON COLUMN registry_config.namespace IS 'namespace';
+COMMENT ON COLUMN registry_config.group IS 'group';
+COMMENT ON COLUMN registry_config.date_created IS 'create time';
+COMMENT ON COLUMN registry_config.date_updated IS 'update time';
+
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116900', '1357956838021890048',
'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry', '/config/registry',
'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116901', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0, 'system:registry:add',
1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116902', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116903', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1, 0,
'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT /*+ IGNORE_ROW_ON_DUPKEY_INDEX(resource(id)) */ INTO resource (id,
parent_id, title, name, url, component, resource_type, sort, icon, is_leaf,
is_route, perms, status, date_created, date_updated)
+VALUES ('1953048313980116904', '1953048313980116900',
'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303901', '1346358560427216896', '1953048313980116900',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303902', '1346358560427216896', '1953048313980116901',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303903', '1346358560427216896', '1953048313980116902',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303904', '1346358560427216896', '1953048313980116903',
sysdate, sysdate);
+INSERT INTO permission (id, role_id, resource_id, date_created, date_updated)
VALUES ('1953049887387303905', '1346358560427216896', '1953048313980116904',
sysdate, sysdate);
\ No newline at end of file
diff --git a/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
b/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
index c7c06386f0..ca5256a046 100755
--- a/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
+++ b/db/upgrade/2.7.0-upgrade-2.7.1-pg.sql
@@ -242,4 +242,41 @@ INSERT INTO "public"."permission" VALUES
('1697146861569542756', '13463585604272
INSERT INTO "public"."permission" VALUES ('1697146861569542757',
'1346358560427216896', '1844026199075534866', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542758',
'1346358560427216896', '1844026199075534867', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
INSERT INTO "public"."permission" VALUES ('1697146861569542759',
'1346358560427216896', '1844026199075534868', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
-INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
\ No newline at end of file
+INSERT INTO "public"."permission" VALUES ('1697146861569542760',
'1346358560427216896', '1844026199075534869', '2023-08-31 07:18:37',
'2023-08-31 07:18:37');
+
+DROP TABLE IF EXISTS "public"."registry_config";
+CREATE TABLE "public"."registry_config" (
+ "id" varchar(128) NOT
NULL,
+ "registry_id" varchar(50) NOT
NULL,
+ "protocol" varchar(128) NOT
NULL,
+ "address" varchar(512) NOT
NULL,
+ "username" varchar(50),
+ "password" varchar(100),
+ "namespace" varchar(100),
+ "group" varchar(20),
+ "date_created" timestamp(3)
NOT NULL DEFAULT timezone('UTC-8'::text, (now())::timestamp(0) without time
zone),
+ "date_updated" timestamp(3)
NOT NULL DEFAULT timezone('UTC-8'::text, (now())::timestamp(0) without time
zone),
+ PRIMARY KEY ("id")
+);
+COMMENT ON COLUMN "public"."registry_config"."id" IS 'primary key';
+COMMENT ON COLUMN "public"."registry_config"."registry_id" IS 'registry_id';
+COMMENT ON COLUMN "public"."registry_config"."protocol" IS 'protocol';
+COMMENT ON COLUMN "public"."registry_config"."address" IS 'address';
+COMMENT ON COLUMN "public"."registry_config"."username" IS 'username';
+COMMENT ON COLUMN "public"."registry_config"."password" IS 'password';
+COMMENT ON COLUMN "public"."registry_config"."namespace" IS 'namespace';
+COMMENT ON COLUMN "public"."registry_config"."group" IS 'group';
+COMMENT ON COLUMN "public"."registry_config"."date_created" IS 'create time';
+COMMENT ON COLUMN "public"."registry_config"."date_updated" IS 'update time';
+
+INSERT INTO "public"."resource" VALUES ('1953048313980116900',
'1357956838021890048', 'SHENYU.MENU.SYSTEM.MANAGMENT.REGISTRY', 'registry',
'/config/registry', 'registry', 1, 7, 'ordered-list', 0, 0, '', 1, '2025-08-06
17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116901',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.ADD', '', '', '', 2, 0, '', 1, 0,
'system:registry:add', 1, '2025-08-06 17:00:00.000', '2025-08-06 17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116902',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.LIST', '', '', '', 2, 1, '', 1, 0,
'system:registry:list', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116903',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.DELETE', '', '', '', 2, 2, '', 1,
0, 'system:registry:delete', 1,'2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+INSERT INTO "public"."resource" VALUES ('1953048313980116904',
'1953048313980116900', 'SHENYU.BUTTON.SYSTEM.EDIT', '', '', '', 2, 3, '', 1, 0,
'system:registry:edit', 1, '2025-08-06 17:00:00.000', '2025-08-06
17:00:00.000');
+
+INSERT INTO "public"."permission" VALUES ('1953049887387303901',
'1346358560427216896', '1953048313980116900', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303902',
'1346358560427216896', '1953048313980116901', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303903',
'1346358560427216896', '1953048313980116902', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303904',
'1346358560427216896', '1953048313980116903', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
+INSERT INTO "public"."permission" VALUES ('1953049887387303905',
'1346358560427216896', '1953048313980116904', '2025-08-06 17:00:00.000',
'2025-08-06 17:00:00.000');
\ No newline at end of file
diff --git
a/shenyu-admin/src/http/http-debug-registry-config-controller-api.http
b/shenyu-admin/src/http/http-debug-registry-config-controller-api.http
new file mode 100644
index 0000000000..389929b1d6
--- /dev/null
+++ b/shenyu-admin/src/http/http-debug-registry-config-controller-api.http
@@ -0,0 +1,79 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# if you debug api, replace your own token
+
+### registry create
+POST http://localhost:9095/registry/insertOrUpdate
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjhmMmE2ZDQ2YzU4ODRhODViNGViY2NiMTM5NTJiODQzIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDkwNTIzMH0.YA5XcsMcsAQnmQZPhjAB1Dz1woIxQB0sFv9mbAc8rcY
+
+{
+ "registryId": "nacos-2",
+ "protocol": "nacos",
+ "address": "127.0.0.1:8848",
+ "username": "nacos",
+ "password": "nacos",
+ "namespace": "test-namespace",
+ "group": null
+}
+
+### registry update
+POST http://localhost:9095/registry/insertOrUpdate
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjhmMmE2ZDQ2YzU4ODRhODViNGViY2NiMTM5NTJiODQzIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDkwNTIzMH0.YA5XcsMcsAQnmQZPhjAB1Dz1woIxQB0sFv9mbAc8rcY
+
+{
+ "id": "1954478410339516416",
+ "registryId": "nacos-1",
+ "protocol": "nacos",
+ "address": "127.0.0.1:8848",
+ "username": "nacos",
+ "password": "nacos",
+ "namespace": "test_local",
+ "group": null
+}
+
+### regisrty list by page
+GET
http://localhost:9095/registry/findPageByQuery?currentPage=1&pageSize=10®istryId=nacos&address=127.0.0.1
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjhmMmE2ZDQ2YzU4ODRhODViNGViY2NiMTM5NTJiODQzIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDkwNTIzMH0.YA5XcsMcsAQnmQZPhjAB1Dz1woIxQB0sFv9mbAc8rcY
+
+### regisrty list
+GET http://localhost:9095/registry/list
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjhmMmE2ZDQ2YzU4ODRhODViNGViY2NiMTM5NTJiODQzIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDkwNTIzMH0.YA5XcsMcsAQnmQZPhjAB1Dz1woIxQB0sFv9mbAc8rcY
+
+### regisrty detail
+GET http://localhost:9095/registry/1954478410339516416
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6IjhmMmE2ZDQ2YzU4ODRhODViNGViY2NiMTM5NTJiODQzIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDkwNTIzMH0.YA5XcsMcsAQnmQZPhjAB1Dz1woIxQB0sFv9mbAc8rcY
+
+### regisrty delete
+DELETE http://localhost:9095/registry/batch
+Accept: application/json
+Content-Type: application/json
+X-Access-Token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGllbnRJZCI6ImEzY2NhMzc3YTU4ZTRjOGZiMWE4YTI5MTQ0ZThhNzcyIiwidXNlck5hbWUiOiJhZG1pbiIsImV4cCI6MTc1NDU1NTE4OX0.2VYA-n1VCoOjziijteN8r2IOdyErZ9FtmBkOYScwdWM
+
+[
+ "1953018066451435520"
+]
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/RegistryController.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/RegistryController.java
new file mode 100644
index 0000000000..74e9340c1d
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/RegistryController.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.controller;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import org.apache.shenyu.admin.aspect.annotation.RestApi;
+import org.apache.shenyu.admin.mapper.RegistryMapper;
+import org.apache.shenyu.admin.model.dto.RegistryDTO;
+import org.apache.shenyu.admin.model.page.CommonPager;
+import org.apache.shenyu.admin.model.page.PageParameter;
+import org.apache.shenyu.admin.model.query.RegistryQuery;
+import org.apache.shenyu.admin.model.result.ShenyuAdminResult;
+import org.apache.shenyu.admin.model.vo.RegistryVO;
+import org.apache.shenyu.admin.service.impl.RegistryServiceImpl;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
+import org.apache.shenyu.admin.validation.annotation.Existed;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@RestApi("/registry")
+public class RegistryController {
+
+ private final RegistryServiceImpl registryService;
+
+ public RegistryController(final RegistryServiceImpl registryService) {
+ this.registryService = registryService;
+ }
+
+ /**
+ * Find registry page by query.
+ *
+ * @param registryId the registry registryId
+ * @param address the registry address
+ * @param namespace the registry namespace
+ * @param currentPage current page of list
+ * @param pageSize page size of query
+ * @return the shenyu result
+ */
+ @GetMapping("/findPageByQuery")
+ @RequiresPermissions("system:registry:list")
+ public ShenyuAdminResult findPageByQuery(final String registryId, final
String address, final String namespace,
+ @RequestParam @NotNull(message =
"currentPage not null") final Integer currentPage,
+ @RequestParam @NotNull(message =
"pageSize not null") final Integer pageSize) {
+ RegistryQuery query = new RegistryQuery();
+ query.setRegistryId(registryId);
+ query.setAddress(address);
+ query.setNamespace(namespace);
+ query.setPageParameter(new PageParameter(currentPage, pageSize));
+ CommonPager<RegistryVO> commonPager =
registryService.listByPage(query);
+ return ShenyuAdminResult.success(ShenyuResultMessage.QUERY_SUCCESS,
commonPager);
+ }
+
+ /**
+ * Find registry list.
+ *
+ * @return the shenyu result
+ */
+ @GetMapping("/list")
+ @RequiresPermissions("system:registry:list")
+ public ShenyuAdminResult list() {
+ return ShenyuAdminResult.success(ShenyuResultMessage.QUERY_SUCCESS,
registryService.listAll());
+ }
+
+
+ /**
+ * Insert or update registry.
+ *
+ * @param registryDTO {@link RegistryDTO}
+ * @return {@linkplain ShenyuAdminResult}
+ */
+ @PostMapping("/insertOrUpdate")
+ @RequiresPermissions(value = {"system:registry:add",
"system:registry:edit"}, logical = Logical.OR)
+ public ShenyuAdminResult createOrUpdate(@Valid @RequestBody final
RegistryDTO registryDTO) {
+ return ShenyuAdminResult.success(ShenyuResultMessage.SUCCESS,
registryService.createOrUpdate(registryDTO));
+ }
+
+ /**
+ * delete by id.
+ *
+ * @param ids ids
+ * @return {@linkplain ShenyuAdminResult}
+ */
+ @DeleteMapping("/batch")
+ @RequiresPermissions("system:registry:delete")
+ public ShenyuAdminResult delete(@RequestBody final List<@NotBlank String>
ids) {
+ return ShenyuAdminResult.success(ShenyuResultMessage.SUCCESS,
registryService.delete(ids));
+ }
+
+ /**
+ * detail registry.
+ *
+ * @param id registry id.
+ * @return {@linkplain ShenyuAdminResult}
+ */
+ @GetMapping("/{id}")
+ @RequiresPermissions("system:registry:edit")
+ public ShenyuAdminResult detailPlugin(@PathVariable("id")
+ @Existed(message = "id is not
existed",
+ provider =
RegistryMapper.class) final String id) {
+ RegistryVO registryVO = registryService.findById(id);
+ return ShenyuAdminResult.success(ShenyuResultMessage.DETAIL_SUCCESS,
registryVO);
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RegistryMapper.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RegistryMapper.java
new file mode 100644
index 0000000000..13c20bc6fa
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/mapper/RegistryMapper.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.shenyu.admin.model.entity.RegistryDO;
+import org.apache.shenyu.admin.model.query.RegistryQuery;
+import org.apache.shenyu.admin.validation.ExistProvider;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * RegistryMapper.
+ */
+@Mapper
+public interface RegistryMapper extends ExistProvider {
+
+ /**
+ * existed.
+ *
+ * @param id id
+ * @return existed
+ */
+ @Override
+ Boolean existed(@Param("id") Serializable id);
+
+ /**
+ * select registry by id.
+ *
+ * @param id primary key.
+ * @return {@linkplain RegistryDO}
+ */
+ RegistryDO selectById(String id);
+
+ /**
+ * select registry by registryId.
+ *
+ * @param registryId registryId.
+ * @return {@linkplain RegistryDO}
+ */
+ RegistryDO selectByRegistryId(String registryId);
+
+ /**
+ * selectAll.
+ *
+ * @return registryDOList
+ */
+ List<RegistryDO> selectAll();
+
+ /**
+ * insert registry.
+ *
+ * @param registryDO registryDO.
+ * @return rows
+ */
+ int insert(RegistryDO registryDO);
+
+
+ /**
+ * insert registry.
+ *
+ * @param registryDO registryDO.
+ * @return rows
+ */
+ int insertSelective(RegistryDO registryDO);
+
+
+ /**
+ * update registry.
+ *
+ * @param registryDO {@linkplain RegistryDO}
+ * @return rows
+ */
+ int update(RegistryDO registryDO);
+
+ /**
+ * update registry.
+ *
+ * @param registryDO {@linkplain RegistryDO}
+ * @return rows
+ */
+ int updateSelective(RegistryDO registryDO);
+
+ /**
+ * count registry by query.
+ *
+ * @param registryQuery {@linkplain RegistryQuery}
+ * @return {@linkplain Integer}
+ */
+ Integer countByQuery(RegistryQuery registryQuery);
+
+ /**
+ * select registry by query.
+ *
+ * @param registryQuery {@linkplain RegistryQuery}
+ * @return {@linkplain List}
+ */
+ List<RegistryDO> selectByQuery(RegistryQuery registryQuery);
+
+ /**
+ * select registry by ids.
+ *
+ * @param ids ids.
+ * @return {@linkplain RegistryDO}
+ */
+ List<RegistryDO> selectByIds(List<String> ids);
+
+ /**
+ * delete registry.
+ *
+ * @param ids primary keys.
+ * @return rows int
+ */
+ int deleteByIds(List<String> ids);
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/RegistryDTO.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/RegistryDTO.java
new file mode 100644
index 0000000000..20d47b24f8
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/RegistryDTO.java
@@ -0,0 +1,199 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.model.dto;
+
+import java.io.Serializable;
+
+import jakarta.validation.constraints.NotNull;
+import org.hibernate.validator.constraints.Length;
+
+/**
+ * RegistryDTO.
+ */
+public class RegistryDTO implements Serializable {
+
+ private String id;
+
+ @Length(max = 128, message = "The maximum length is 128")
+ @NotNull(message = "registry code not null")
+ private String registryId;
+
+ @Length(max = 128, message = "The maximum length is 128")
+ @NotNull(message = "registry protocol not null")
+ private String protocol;
+
+ @Length(max = 100, message = "The maximum length is 100")
+ @NotNull(message = "address null")
+ private String address;
+
+ @Length(max = 50, message = "The maximum length is 50")
+ private String username;
+
+ @Length(max = 100, message = "The maximum length is 100")
+ private String password;
+
+ @Length(max = 100, message = "The maximum length is 100")
+ private String namespace;
+
+ @Length(max = 20, message = "The maximum length is 20")
+ private String group;
+
+ /**
+ * Gets the value of id.
+ *
+ * @return the value of id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Sets the id.
+ *
+ * @param id id
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets the value of registryId.
+ *
+ * @return the value of registryId
+ */
+ public String getRegistryId() {
+ return registryId;
+ }
+
+ /**
+ * Sets the registryId.
+ *
+ * @param registryId registryId
+ */
+ public void setRegistryId(final String registryId) {
+ this.registryId = registryId;
+ }
+
+ /**
+ * Gets the value of protocol.
+ *
+ * @return the value of protocol
+ */
+ public String getProtocol() {
+ return protocol;
+ }
+
+ /**
+ * Sets the protocol.
+ *
+ * @param protocol protocol
+ */
+ public void setProtocol(final String protocol) {
+ this.protocol = protocol;
+ }
+
+ /**
+ * Gets the value of address.
+ *
+ * @return the value of address
+ */
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Sets the address.
+ *
+ * @param address address
+ */
+ public void setAddress(final String address) {
+ this.address = address;
+ }
+
+ /**
+ * Gets the value of username.
+ *
+ * @return the value of username
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Sets the username.
+ *
+ * @param username username
+ */
+ public void setUsername(final String username) {
+ this.username = username;
+ }
+
+ /**
+ * Gets the value of password.
+ *
+ * @return the value of password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets the password.
+ *
+ * @param password password
+ */
+ public void setPassword(final String password) {
+ this.password = password;
+ }
+
+ /**
+ * Gets the value of namespace.
+ *
+ * @return the value of namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Sets the namespace.
+ *
+ * @param namespace namespace
+ */
+ public void setNamespace(final String namespace) {
+ this.namespace = namespace;
+ }
+
+ /**
+ * Gets the value of group.
+ *
+ * @return the value of group
+ */
+ public String getGroup() {
+ return group;
+ }
+
+ /**
+ * Sets the group.
+ *
+ * @param group group
+ */
+ public void setGroup(final String group) {
+ this.group = group;
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/RegistryDO.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/RegistryDO.java
new file mode 100644
index 0000000000..d84e775a33
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/entity/RegistryDO.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.model.entity;
+
+import java.sql.Timestamp;
+
+/**
+ * Registry do.
+ */
+public class RegistryDO extends BaseDO {
+
+ /**
+ * the model registryId.
+ */
+ private String registryId;
+
+ /**
+ * the model protocol.
+ */
+ private String protocol;
+
+ /**
+ * the model address.
+ */
+ private String address;
+
+ /**
+ * the model username.
+ */
+ private String username;
+
+ /**
+ * the model password.
+ */
+ private String password;
+
+ /**
+ * the model namespace.
+ */
+ private String namespace;
+
+ /**
+ * the model group.
+ */
+ private String group;
+
+ /**
+ * Gets the value of registryId.
+ *
+ * @return the value of registryId
+ */
+ public String getRegistryId() {
+ return registryId;
+ }
+
+ /**
+ * Sets the registryId.
+ *
+ * @param registryId registryId
+ */
+ public void setRegistryId(final String registryId) {
+ this.registryId = registryId;
+ }
+
+ /**
+ * Gets the value of protocol.
+ *
+ * @return the value of protocol
+ */
+ public String getProtocol() {
+ return protocol;
+ }
+
+ /**
+ * Sets the protocol.
+ *
+ * @param protocol protocol
+ */
+ public void setProtocol(final String protocol) {
+ this.protocol = protocol;
+ }
+
+ /**
+ * Gets the value of address.
+ *
+ * @return the value of address
+ */
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Sets the address.
+ *
+ * @param address address
+ */
+ public void setAddress(final String address) {
+ this.address = address;
+ }
+
+ /**
+ * Gets the value of username.
+ *
+ * @return the value of username
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Sets the username.
+ *
+ * @param username username
+ */
+ public void setUsername(final String username) {
+ this.username = username;
+ }
+
+ /**
+ * Gets the value of password.
+ *
+ * @return the value of password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets the password.
+ *
+ * @param password password
+ */
+ public void setPassword(final String password) {
+ this.password = password;
+ }
+
+ /**
+ * Gets the value of namespace.
+ *
+ * @return the value of namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Sets the namespace.
+ *
+ * @param namespace namespace
+ */
+ public void setNamespace(final String namespace) {
+ this.namespace = namespace;
+ }
+
+ /**
+ * Gets the value of group.
+ *
+ * @return the value of group
+ */
+ public String getGroup() {
+ return group;
+ }
+
+ /**
+ * Sets the group.
+ *
+ * @param group group
+ */
+ public void setGroup(final String group) {
+ this.group = group;
+ }
+
+ /**
+ * builder.
+ *
+ * @return RegistryDOBuilder
+ */
+ public static RegistryDOBuilder builder() {
+ return new RegistryDO.RegistryDOBuilder();
+ }
+
+ public static final class RegistryDOBuilder {
+
+ private String id;
+
+ private Timestamp dateCreated;
+
+ private Timestamp dateUpdated;
+
+ private String registryId;
+
+ private String protocol;
+
+ private String address;
+
+ private String username;
+
+ private String password;
+
+ private String namespace;
+
+ private String group;
+
+ private RegistryDOBuilder() {
+ }
+
+ /**
+ * id.
+ *
+ * @param id the id.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder id(final String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * dateCreated.
+ *
+ * @param dateCreated the dateCreated.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder dateCreated(final Timestamp dateCreated) {
+ this.dateCreated = dateCreated;
+ return this;
+ }
+
+ /**
+ * dateUpdated.
+ *
+ * @param dateUpdated the dateUpdated.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder dateUpdated(final Timestamp dateUpdated) {
+ this.dateUpdated = dateUpdated;
+ return this;
+ }
+
+ /**
+ * registryId.
+ *
+ * @param registryId the registryId.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder registryId(final String registryId) {
+ this.registryId = registryId;
+ return this;
+ }
+
+ /**
+ * protocol.
+ *
+ * @param protocol the protocol.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder protocol(final String protocol) {
+ this.protocol = protocol;
+ return this;
+ }
+
+ /**
+ * address.
+ *
+ * @param address the address.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder address(final String address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * username.
+ *
+ * @param username the username.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder username(final String username) {
+ this.username = username;
+ return this;
+ }
+
+ /**
+ * password.
+ *
+ * @param password the password.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder password(final String password) {
+ this.password = password;
+ return this;
+ }
+
+ /**
+ * namespace.
+ *
+ * @param namespace the namespace.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder namespace(final String namespace) {
+ this.namespace = namespace;
+ return this;
+ }
+
+ /**
+ * group.
+ *
+ * @param group the group.
+ * @return RegistryDOBuilder.
+ */
+ public RegistryDOBuilder group(final String group) {
+ this.group = group;
+ return this;
+ }
+
+ /**
+ * build method.
+ *
+ * @return build object.
+ */
+ public RegistryDO build() {
+ RegistryDO registryDO = new RegistryDO();
+ registryDO.setId(id);
+ registryDO.setDateCreated(dateCreated);
+ registryDO.setDateUpdated(dateUpdated);
+ registryDO.setRegistryId(registryId);
+ registryDO.setProtocol(protocol);
+ registryDO.setAddress(address);
+ registryDO.setUsername(username);
+ registryDO.setPassword(password);
+ registryDO.setNamespace(namespace);
+ registryDO.setGroup(group);
+ return registryDO;
+ }
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/query/RegistryQuery.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/query/RegistryQuery.java
new file mode 100644
index 0000000000..6316c4d7f4
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/query/RegistryQuery.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.model.query;
+
+import org.apache.shenyu.admin.model.page.PageParameter;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * this is registry query.
+ */
+public class RegistryQuery implements Serializable {
+
+ /**
+ * registryId.
+ */
+ private String registryId;
+
+ /**
+ * address.
+ */
+ private String address;
+
+ /**
+ * namespace.
+ */
+ private String namespace;
+
+ /**
+ * page parameter.
+ */
+ private PageParameter pageParameter;
+
+ /**
+ * Gets the value of registryId.
+ *
+ * @return the value of registryId
+ */
+ public String getRegistryId() {
+ return registryId;
+ }
+
+ /**
+ * Sets the registryId.
+ *
+ * @param registryId registryId
+ */
+ public void setRegistryId(final String registryId) {
+ this.registryId = registryId;
+ }
+
+ /**
+ * Gets the value of address.
+ *
+ * @return the value of address
+ */
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Sets the address.
+ *
+ * @param address address
+ */
+ public void setAddress(final String address) {
+ this.address = address;
+ }
+
+ /**
+ * Gets the value of namespace.
+ *
+ * @return the value of namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Sets the namespace.
+ *
+ * @param namespace namespace
+ */
+ public void setNamespace(final String namespace) {
+ this.namespace = namespace;
+ }
+
+ /**
+ * Gets the value of getPageParameter.
+ *
+ * @return the value of getPageParameter
+ */
+ public PageParameter getPageParameter() {
+ return pageParameter;
+ }
+
+ /**
+ * Sets the pageParameter.
+ *
+ * @param pageParameter pageParameter
+ */
+ public void setPageParameter(final PageParameter pageParameter) {
+ this.pageParameter = pageParameter;
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (Objects.isNull(o) || getClass() != o.getClass()) {
+ return false;
+ }
+ RegistryQuery that = (RegistryQuery) o;
+ return Objects.equals(registryId, that.registryId) &&
Objects.equals(address, that.address)
+ && Objects.equals(namespace, that.namespace) &&
Objects.equals(pageParameter, that.pageParameter);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(registryId, address, namespace, pageParameter);
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/RegistryVO.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/RegistryVO.java
new file mode 100644
index 0000000000..d030ac79f2
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/vo/RegistryVO.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.model.vo;
+
+import java.io.Serializable;
+
+/**
+ * RegistryVO.
+ */
+public class RegistryVO implements Serializable {
+
+ private static final long serialVersionUID = 8274916350247389561L;
+
+ /**
+ * id.
+ */
+ private String id;
+
+ /**
+ * registryId.
+ */
+ private String registryId;
+
+ /**
+ * protocol.
+ */
+ private String protocol;
+
+ /**
+ * address.
+ */
+ private String address;
+
+ /**
+ * username.
+ */
+ private String username;
+
+ /**
+ * password.
+ */
+ private String password;
+
+ /**
+ * namespace.
+ */
+ private String namespace;
+
+ /**
+ * group.
+ */
+ private String group;
+
+ /**
+ * Gets the value of id.
+ *
+ * @return the value of id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Sets the id.
+ *
+ * @param id id
+ */
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets the value of registryId.
+ *
+ * @return the value of registryId
+ */
+ public String getRegistryId() {
+ return registryId;
+ }
+
+ /**
+ * Sets the registryId.
+ *
+ * @param registryId registryId
+ */
+ public void setRegistryId(final String registryId) {
+ this.registryId = registryId;
+ }
+
+ /**
+ * Gets the value of protocol.
+ *
+ * @return the value of protocol
+ */
+ public String getProtocol() {
+ return protocol;
+ }
+
+ /**
+ * Sets the protocol.
+ *
+ * @param protocol protocol
+ */
+ public void setProtocol(final String protocol) {
+ this.protocol = protocol;
+ }
+
+ /**
+ * Gets the value of address.
+ *
+ * @return the value of address
+ */
+ public String getAddress() {
+ return address;
+ }
+
+ /**
+ * Sets the address.
+ *
+ * @param address address
+ */
+ public void setAddress(final String address) {
+ this.address = address;
+ }
+
+ /**
+ * Gets the value of username.
+ *
+ * @return the value of username
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Sets the username.
+ *
+ * @param username username
+ */
+ public void setUsername(final String username) {
+ this.username = username;
+ }
+
+ /**
+ * Gets the value of password.
+ *
+ * @return the value of password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets the password.
+ *
+ * @param password password
+ */
+ public void setPassword(final String password) {
+ this.password = password;
+ }
+
+ /**
+ * Gets the value of namespace.
+ *
+ * @return the value of namespace
+ */
+ public String getNamespace() {
+ return namespace;
+ }
+
+ /**
+ * Sets the namespace.
+ *
+ * @param namespace namespace
+ */
+ public void setNamespace(final String namespace) {
+ this.namespace = namespace;
+ }
+
+ /**
+ * Gets the value of group.
+ *
+ * @return the value of group
+ */
+ public String getGroup() {
+ return group;
+ }
+
+ /**
+ * Sets the group.
+ *
+ * @param group group
+ */
+ public void setGroup(final String group) {
+ this.group = group;
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RegistryService.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RegistryService.java
new file mode 100644
index 0000000000..d9abe45395
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/RegistryService.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.service;
+
+import org.apache.shenyu.admin.model.dto.RegistryDTO;
+import org.apache.shenyu.admin.model.page.CommonPager;
+import org.apache.shenyu.admin.model.query.RegistryQuery;
+import org.apache.shenyu.admin.model.vo.RegistryVO;
+
+import java.util.List;
+
+public interface RegistryService {
+
+ /**
+ * Create or update registry.
+ *
+ * @param registryDTO the registry dto
+ * @return the string
+ */
+ RegistryVO createOrUpdate(RegistryDTO registryDTO);
+
+ /**
+ * find page of registry by query.
+ *
+ * @param registryQuery {@linkplain RegistryQuery}
+ * @return {@linkplain CommonPager}
+ */
+ CommonPager<RegistryVO> listByPage(RegistryQuery registryQuery);
+
+ /**
+ * delete by id.
+ *
+ * @param ids ids
+ * @return msg
+ */
+ String delete(List<String> ids);
+
+ /**
+ * find registry by id.
+ *
+ * @param id id.
+ * @return {@linkplain RegistryVO}
+ */
+ RegistryVO findById(String id);
+
+ /**
+ * find registry by registryId.
+ *
+ * @param registryId registryId.
+ * @return {@linkplain RegistryVO}
+ */
+ RegistryVO findByRegistryId(String registryId);
+
+ /**
+ * find list of registry.
+ *
+ * @return {@linkplain List}
+ */
+ List<RegistryVO> listAll();
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RegistryServiceImpl.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RegistryServiceImpl.java
new file mode 100644
index 0000000000..ae5e3ce6a1
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RegistryServiceImpl.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.service.impl;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shenyu.admin.exception.ShenyuAdminException;
+import org.apache.shenyu.admin.mapper.RegistryMapper;
+import org.apache.shenyu.admin.model.dto.RegistryDTO;
+import org.apache.shenyu.admin.model.entity.RegistryDO;
+import org.apache.shenyu.admin.model.page.CommonPager;
+import org.apache.shenyu.admin.model.page.PageResultUtils;
+import org.apache.shenyu.admin.model.query.RegistryQuery;
+import org.apache.shenyu.admin.model.vo.RegistryVO;
+import org.apache.shenyu.admin.service.RegistryService;
+import org.apache.shenyu.admin.transfer.RegistryTransfer;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
+import org.apache.shenyu.common.utils.UUIDUtils;
+import org.springframework.stereotype.Service;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class RegistryServiceImpl implements RegistryService {
+
+ private final RegistryMapper registryMapper;
+
+ public RegistryServiceImpl(final RegistryMapper registryMapper) {
+ this.registryMapper = registryMapper;
+ }
+
+ @Override
+ public RegistryVO createOrUpdate(final RegistryDTO registryDTO) {
+ return StringUtils.isBlank(registryDTO.getId())
+ ? this.create(registryDTO) : this.update(registryDTO);
+ }
+
+ @Override
+ public CommonPager<RegistryVO> listByPage(final RegistryQuery
registryQuery) {
+ return PageResultUtils.result(registryQuery.getPageParameter(), () ->
registryMapper.countByQuery(registryQuery), () ->
registryMapper.selectByQuery(registryQuery)
+ .stream()
+ .map(RegistryTransfer.INSTANCE::mapToVo)
+ .collect(Collectors.toList()));
+ }
+
+ @Override
+ public String delete(final List<String> ids) {
+ registryMapper.deleteByIds(ids);
+ return ShenyuResultMessage.DELETE_SUCCESS;
+ }
+
+ @Override
+ public RegistryVO findById(final String id) {
+ return
RegistryTransfer.INSTANCE.mapToVo(registryMapper.selectById(id));
+ }
+
+ @Override
+ public RegistryVO findByRegistryId(final String registryId) {
+ return
RegistryTransfer.INSTANCE.mapToVo(registryMapper.selectByRegistryId(registryId));
+ }
+
+ @Override
+ public List<RegistryVO> listAll() {
+ List<RegistryDO> registryDOS = registryMapper.selectAll();
+ return
registryDOS.stream().map(RegistryTransfer.INSTANCE::mapToVo).collect(Collectors.toList());
+ }
+
+
+ private RegistryVO create(final RegistryDTO registryDTO) {
+ RegistryDO existRegistryDO =
registryMapper.selectByRegistryId(registryDTO.getRegistryId());
+ if (Objects.nonNull(existRegistryDO)) {
+ throw new ShenyuAdminException("registry_id is already exist");
+ }
+
+ Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+ String id = UUIDUtils.getInstance().generateShortUuid();
+ RegistryDO registryDO = RegistryDO.builder()
+ .id(id)
+ .registryId(registryDTO.getRegistryId())
+ .protocol(registryDTO.getProtocol())
+ .address(registryDTO.getAddress())
+ .namespace(registryDTO.getNamespace())
+ .username(registryDTO.getUsername())
+ .password(registryDTO.getPassword())
+ .group(registryDTO.getGroup())
+ .dateCreated(currentTime)
+ .dateUpdated(currentTime)
+ .build();
+ registryMapper.insert(registryDO);
+
+ return RegistryTransfer.INSTANCE.mapToVo(registryDO);
+ }
+
+ private RegistryVO update(final RegistryDTO registryDTO) {
+ if (Objects.isNull(registryDTO) ||
Objects.isNull(registryDTO.getId())) {
+ throw new ShenyuAdminException("registry is not exist");
+ }
+ RegistryDO existRegistryDO =
registryMapper.selectByRegistryId(registryDTO.getRegistryId());
+ if (Objects.nonNull(existRegistryDO) &&
!existRegistryDO.getId().equals(registryDTO.getId())) {
+ throw new ShenyuAdminException("registry_id is already exist");
+ }
+ Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+ RegistryDO registryDO = RegistryDO.builder()
+ .id(registryDTO.getId())
+ .registryId(registryDTO.getRegistryId())
+ .protocol(registryDTO.getProtocol())
+ .address(registryDTO.getAddress())
+ .namespace(registryDTO.getNamespace())
+ .username(registryDTO.getUsername())
+ .password(registryDTO.getPassword())
+ .group(registryDTO.getGroup())
+ .dateUpdated(currentTime)
+ .build();
+ return registryMapper.updateSelective(registryDO) > 0
+ ? RegistryTransfer.INSTANCE.mapToVo(registryDO) : null;
+ }
+}
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/RegistryTransfer.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/RegistryTransfer.java
new file mode 100644
index 0000000000..514c6ffc1a
--- /dev/null
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/transfer/RegistryTransfer.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shenyu.admin.transfer;
+
+import org.apache.shenyu.admin.model.entity.RegistryDO;
+import org.apache.shenyu.admin.model.vo.RegistryVO;
+
+import java.util.Optional;
+
+public enum RegistryTransfer {
+ /**
+ * The constant INSTANCE.
+ */
+ INSTANCE;
+
+ /**
+ * mapToVo.
+ *
+ * @param registryDO registryDO
+ * @return RegistryVO
+ */
+ public RegistryVO mapToVo(RegistryDO registryDO) {
+ return Optional.ofNullable(registryDO).map(data -> {
+ RegistryVO vo = new RegistryVO();
+ vo.setId(data.getId());
+ vo.setRegistryId(data.getRegistryId());
+ vo.setProtocol(data.getProtocol());
+ vo.setAddress(data.getAddress());
+ vo.setUsername(data.getUsername());
+ vo.setPassword(data.getPassword());
+ vo.setGroup(data.getGroup());
+ vo.setNamespace(data.getNamespace());
+ return vo;
+ }).orElse(null);
+ }
+}
diff --git a/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
b/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
new file mode 100644
index 0000000000..7728cd9920
--- /dev/null
+++ b/shenyu-admin/src/main/resources/mappers/registry-sqlmap.xml
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You under the Apache License, Version 2.0
+ ~ (the "License"); you may not use this file except in compliance with
+ ~ the License. You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.apache.shenyu.admin.mapper.RegistryMapper">
+ <resultMap id="BaseResultMap"
type="org.apache.shenyu.admin.model.entity.RegistryDO">
+ <id column="id" jdbcType="VARCHAR" property="id"/>
+ <result column="registry_id" jdbcType="VARCHAR" property="registryId"/>
+ <result column="protocol" jdbcType="VARCHAR" property="protocol"/>
+ <result column="address" jdbcType="VARCHAR" property="address"/>
+ <result column="username" jdbcType="VARCHAR" property="username"/>
+ <result column="password" jdbcType="VARCHAR" property="password"/>
+ <result column="namespace" jdbcType="VARCHAR" property="namespace"/>
+ <result column="group" jdbcType="VARCHAR" property="group"/>
+ <result column="date_created" jdbcType="TIMESTAMP"
property="dateCreated"/>
+ <result column="date_updated" jdbcType="TIMESTAMP"
property="dateUpdated"/>
+ </resultMap>
+
+ <sql id="Base_Column_List">
+ id,
+ registry_id,
+ protocol,
+ address,
+ username,
+ password,
+ namespace,
+ `group`,
+ date_created,
+ date_updated
+ </sql>
+
+ <select id="existed" resultType="java.lang.Boolean">
+ SELECT true
+ FROM registry_config
+ WHERE id = #{id} limit 1
+ </select>
+
+ <select id="selectById" parameterType="java.lang.String"
resultMap="BaseResultMap">
+ SELECT
+ <include refid="Base_Column_List"/>
+ FROM registry_config
+ WHERE id = #{id, jdbcType=VARCHAR}
+ </select>
+
+ <select id="selectByRegistryId" parameterType="java.lang.String"
resultMap="BaseResultMap">
+ SELECT
+ <include refid="Base_Column_List"/>
+ FROM registry_config
+ WHERE registry_id = #{registryId, jdbcType=VARCHAR}
+ </select>
+
+ <select id="selectAll"
resultType="org.apache.shenyu.admin.model.entity.RegistryDO">
+ SELECT
+ <include refid="Base_Column_List"/>
+ FROM registry_config
+ </select>
+
+ <insert id="insert" keyColumn="id" keyProperty="id" useGeneratedKeys="true"
+ parameterType="org.apache.shenyu.admin.model.entity.RegistryDO">
+ INSERT INTO registry_config
+ (id,
+ registry_id,
+ protocol,
+ address,
+ username,
+ password,
+ namespace,
+ `group`,
+ date_created,
+ date_updated
+ )
+ VALUES
+ (#{id, jdbcType=VARCHAR},
+ #{registryId, jdbcType=VARCHAR},
+ #{protocol, jdbcType=VARCHAR},
+ #{address, jdbcType=VARCHAR},
+ #{username, jdbcType=VARCHAR},
+ #{password, jdbcType=VARCHAR},
+ #{namespace, jdbcType=VARCHAR},
+ #{group, jdbcType=VARCHAR},
+ #{dateCreated, jdbcType=TIMESTAMP},
+ #{dateUpdated, jdbcType=TIMESTAMP}
+ )
+ </insert>
+
+ <insert id="insertSelective"
parameterType="org.apache.shenyu.admin.model.entity.RegistryDO">
+ INSERT INTO registry_config
+ <trim prefix="(" suffix=")" suffixOverrides=",">
+ id,
+ <if test="registryId != null">
+ registry_id,
+ </if>
+ <if test="protocol != null">
+ protocol,
+ </if>
+ <if test="address != null">
+ address,
+ </if>
+ <if test="username != null">
+ username,
+ </if>
+ <if test="password != null">
+ password,
+ </if>
+ <if test="namespace != null">
+ namespace,
+ </if>
+ <if test="group != null">
+ `group`,
+ </if>
+ <if test="dateCreated != null">
+ date_created,
+ </if>
+ <if test="dateUpdated != null">
+ date_updated,
+ </if>
+ </trim>
+ <trim prefix="values (" suffix=")" suffixOverrides=",">
+ #{id, jdbcType=VARCHAR},
+ <if test="registryId != null">
+ #{registryId, jdbcType=VARCHAR},
+ </if>
+ <if test="protocol != null">
+ #{protocol, jdbcType=VARCHAR},
+ </if>
+ <if test="address != null">
+ #{address, jdbcType=VARCHAR},
+ </if>
+ <if test="username != null">
+ #{username, jdbcType=VARCHAR},
+ </if>
+ <if test="password != null">
+ #{password, jdbcType=VARCHAR},
+ </if>
+ <if test="namespace != null">
+ #{namespace, jdbcType=VARCHAR},
+ </if>
+ <if test="group != null">
+ #{group, jdbcType=VARCHAR},
+ </if>
+ <if test="dateCreated != null">
+ #{dateCreated, jdbcType=TIMESTAMP},
+ </if>
+ <if test="dateUpdated != null">
+ #{dateUpdated, jdbcType=TIMESTAMP},
+ </if>
+ </trim>
+ </insert>
+
+ <update id="update"
parameterType="org.apache.shenyu.admin.model.entity.RegistryDO">
+ UPDATE registry_config
+ SET registry_id = #{registryId, jdbcType=VARCHAR},
+ protocol = #{protocol, jdbcType=VARCHAR},
+ address = #{address, jdbcType=VARCHAR},
+ username = #{username, jdbcType=VARCHAR},
+ password = #{password, jdbcType=VARCHAR},
+ namespace = #{namespace, jdbcType=VARCHAR},
+ `group` = #{group, jdbcType=VARCHAR},
+ date_created = #{dateCreated, jdbcType=TIMESTAMP},
+ date_updated = #{dateUpdated, jdbcType=TIMESTAMP}
+ WHERE id = #{id, jdbcType=VARCHAR}
+ </update>
+
+ <update id="updateSelective"
parameterType="org.apache.shenyu.admin.model.entity.RegistryDO">
+ UPDATE registry_config
+ <set>
+ <if test="registryId != null">
+ registry_id = #{registryId, jdbcType=VARCHAR},
+ </if>
+ <if test="protocol != null">
+ protocol = #{protocol, jdbcType=VARCHAR},
+ </if>
+ <if test="address != null">
+ address = #{address, jdbcType=VARCHAR},
+ </if>
+ <if test="username != null">
+ username = #{username, jdbcType=VARCHAR},
+ </if>
+ <if test="password != null">
+ password = #{password, jdbcType=VARCHAR},
+ </if>
+ <if test="namespace != null">
+ namespace = #{namespace, jdbcType=VARCHAR},
+ </if>
+ <if test="group != null">
+ `group` = #{group, jdbcType=VARCHAR},
+ </if>
+ <if test="dateCreated != null">
+ date_created = #{dateCreated, jdbcType=TIMESTAMP},
+ </if>
+ <if test="dateUpdated != null">
+ date_updated = #{dateUpdated, jdbcType=TIMESTAMP},
+ </if>
+ </set>
+ WHERE id = #{id, jdbcType=VARCHAR}
+ </update>
+
+ <select id="countByQuery"
parameterType="org.apache.shenyu.admin.model.query.RegistryQuery"
resultType="java.lang.Integer">
+ SELECT count(1)
+ FROM registry_config
+ <where>
+ <if test="registryId != null and registryId != ''">
+ <bind name="registryIdLike" value="('%' + registryId + '%')"/>
+ AND registry_id LIKE #{registryIdLike, jdbcType=VARCHAR}
+ </if>
+ <if test="address != null and address != ''">
+ <bind name="addressLike" value="('%' + address + '%')"/>
+ AND address LIKE #{addressLike, jdbcType=VARCHAR}
+ </if>
+ <if test="namespace != null and namespace != ''">
+ AND namespace = #{namespace, jdbcType=VARCHAR}
+ </if>
+ </where>
+ </select>
+
+ <select id="selectByQuery"
parameterType="org.apache.shenyu.admin.model.query.RegistryQuery"
resultMap="BaseResultMap">
+ SELECT
+ <include refid="Base_Column_List"/>
+ FROM registry_config
+ <where>
+ <if test="registryId != null and registryId != ''">
+ <bind name="registryIdLike" value="('%' + registryId + '%')"/>
+ AND registry_id LIKE #{registryIdLike, jdbcType=VARCHAR}
+ </if>
+ <if test="address != null and address != ''">
+ <bind name="addressLike" value="('%' + address + '%')"/>
+ AND address LIKE #{addressLike, jdbcType=VARCHAR}
+ </if>
+ <if test="namespace != null and namespace != ''">
+ AND namespace = #{namespace, jdbcType=VARCHAR}
+ </if>
+ </where>
+ </select>
+
+ <select id="selectByIds" parameterType="java.util.List"
resultMap="BaseResultMap">
+ SELECT
+ <include refid="Base_Column_List"/>
+ FROM registry_config
+ WHERE id IN
+ <foreach item="id" collection="ids" open="(" separator="," close=")">
+ #{id, jdbcType=VARCHAR}
+ </foreach>
+ </select>
+
+ <delete id="deleteByIds" parameterType="java.util.List">
+ DELETE FROM registry_config
+ WHERE id IN
+ <foreach item="id" collection="ids" open="(" separator="," close=")">
+ #{id, jdbcType=VARCHAR}
+ </foreach>
+ </delete>
+</mapper>