业务流程
在第10章节我们就提到过,网关注册中心一边管理网关服务,一边管理远程的RPC服务,是一个多边服务(管理的是RPC服务向网关通信层的关联注册)。而如何管理就涉及到我们在最开始的有关HTTP请求映射到远程RPC服务上面的内容。在上一节中,我们完成了网关通信层的注册(算力节点服务),现在在注册方面还差对应的PRC服务注册到网关中心,本章节的主要内容就是来完成有关RPC服务注册到网关中心。
而RPC服务的注册,会涉及到几个方面,第一个是RPC服务系统信息的注册,而在PRC服务系统下面又有许多接口,这就又涉及到系统服务接口的注册,而每一个接口类中又有可能又许多的方法,因此这里还涉及到接口下的所有方法信息。这三类的注册对应关系又与我们第10章节的数据库表设计紧密相关。只有在所有信息注册完成后,才能让网关算力服务与RPC的接口进行关联,也就是把RPC接口分配到处理的网关服务上去。这,就是注册中心的作用。
本章节与上一章节最重要开发的都是要求网关注册中心能够对外提供注册接口,在后续API网关的其它模块实现中,例如api-gateway-sdk
,可以在利用AOP切面编程,在对应的服务启动加载时,调用注册接口,将自身信息加载进网关注册中心。如下图
网关中心维护RPC服务注册的库表:application_system、application_interface、application_interface_method
接下来我们就来开发对应的服务注册接口,允许外部通过 HTTP 接口进行注册服务。
本节的内容比较简单,基本属于插入操作。
流程实现
本章节代码结构如下
数据库表修改
注意,在整个服务向网关注册中心注册时,如果数据库表中已经有对应服务了,我们不能重复添加数据,所以之前的数据库表应该针对其中的字段添加唯一索引,以防止某些服务关闭后又重新开启重复的在数据库表插入了注册信息。
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for application_interface
-- ----------------------------
DROP TABLE IF EXISTS `application_interface`;
CREATE TABLE `application_interface` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`system_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '系统标识',
`interface_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '接口标识',
`interface_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '接口名称',
`interface_version` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT '接口版本',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx` (`system_id`,`interface_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of application_interface
-- ----------------------------
BEGIN;
INSERT INTO `application_interface` VALUES (1, 'api-gateway-test', 'cn.bugstack.gateway.rpc.IActivityBooth', 'sayHi', 'v1.0.0', '2022-11-13 13:13:00', '2022-11-13 13:13:00');
COMMIT;
-- ----------------------------
-- Table structure for application_interface_method
-- ----------------------------
DROP TABLE IF EXISTS `application_interface_method`;
CREATE TABLE `application_interface_method` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`system_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '系统标识',
`interface_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '接口标识',
`method_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '方法标识',
`method_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '方法名称',
`parameter_type` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT '参数类型;(RPC 限定单参数注册);new String[]{"java.lang.String"}、new String[]{"cn.bugstack.gateway.rpc.dto.XReq"}',
`uri` varchar(126) COLLATE utf8_bin DEFAULT NULL COMMENT '网关接口',
`http_command_type` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '接口类型;GET、POST、PUT、DELETE',
`auth` int(4) DEFAULT NULL COMMENT 'true = 1是、false = 0否',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx` (`system_id`,`interface_id`,`method_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of application_interface_method
-- ----------------------------
BEGIN;
INSERT INTO `application_interface_method` VALUES (1, 'api-gateway-test', 'cn.bugstack.gateway.rpc.IActivityBooth', 'sayHi', '测试方法', 'java.lang.String', '/wg/activity/sayHi', 'GET', 0, '2022-11-13 13:16:52', '2022-11-13 13:16:52');
INSERT INTO `application_interface_method` VALUES (2, 'api-gateway-test', 'cn.bugstack.gateway.rpc.IActivityBooth', 'insert', '插入方法', 'cn.bugstack.gateway.rpc.dto.XReq', '/wg/activity/insert', 'POST', 1, '2022-11-13 13:16:52', '2022-11-13 13:16:52');
COMMIT;
-- ----------------------------
-- Table structure for application_system
-- ----------------------------
DROP TABLE IF EXISTS `application_system`;
CREATE TABLE `application_system` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`system_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '系统标识',
`system_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '系统名称',
`system_type` varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT '系统类型;RPC、HTTP',
`system_registry` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '注册中心',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_systemId` (`system_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of application_system
-- ----------------------------
BEGIN;
INSERT INTO `application_system` VALUES (1, 'lottery-api', '抽奖API系统', 'RPC', '127.0.0.1', '2022-11-13 13:10:03', '2022-11-13 13:10:03');
INSERT INTO `application_system` VALUES (3, 'api-gateway-test', '网关测试系统', 'RPC', '127.0.0.1', '2022-11-13 13:12:54', '2022-11-13 13:12:54');
COMMIT;
-- ----------------------------
-- Table structure for gateway_distribution
-- ----------------------------
DROP TABLE IF EXISTS `gateway_distribution`;
CREATE TABLE `gateway_distribution` (
`id` int(11) NOT NULL COMMENT '自增主键',
`group_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '分组标识',
`gateway_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '网关标识',
`system_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '系统标识',
`system_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '系统名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of gateway_distribution
-- ----------------------------
BEGIN;
COMMIT;
-- ----------------------------
-- Table structure for gateway_server
-- ----------------------------
DROP TABLE IF EXISTS `gateway_server`;
CREATE TABLE `gateway_server` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`group_id` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '分组标识',
`group_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '分组名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of gateway_server
-- ----------------------------
BEGIN;
INSERT INTO `gateway_server` VALUES (1, '10001', '缺省的');
COMMIT;
-- ----------------------------
-- Table structure for gateway_server_detail
-- ----------------------------
DROP TABLE IF EXISTS `gateway_server_detail`;
CREATE TABLE `gateway_server_detail` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`group_id` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '分组标识',
`gateway_id` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '网关标识',
`gateway_name` varchar(128) COLLATE utf8_bin DEFAULT NULL COMMENT '网关名称',
`gateway_address` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '网关地址:127.0.0.1',
`status` varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT '服务状态:0不可用、1可使用',
`create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_gateway` (`gateway_id`,`gateway_address`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of gateway_server_detail
-- ----------------------------
BEGIN;
INSERT INTO `gateway_server_detail` VALUES (13, '10001', 'api-gateway-g1', '电商支付网关', '127.0.0.196', '1', '2022-11-06 15:22:11', '2022-11-06 15:22:11');
INSERT INTO `gateway_server_detail` VALUES (14, '10001', 'api-gateway-g2', '电商支付网关', '127.0.0.197', '1', '2022-11-06 15:22:11', '2022-11-06 15:22:11');
INSERT INTO `gateway_server_detail` VALUES (15, '10001', 'api-gateway-g3', '电商配送网关', '127.0.0.198', '1', '2022-11-06 15:23:19', '2022-11-06 15:23:19');
COMMIT;
-- ----------------------------
-- Table structure for http_statement
-- ----------------------------
DROP TABLE IF EXISTS `http_statement`;
CREATE TABLE `http_statement` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`application` varchar(128) COLLATE utf8_bin NOT NULL COMMENT '应用名称',
`interface_name` varchar(256) COLLATE utf8_bin NOT NULL COMMENT '服务接口;RPC、其他',
`method_name` varchar(128) COLLATE utf8_bin NOT NULL COMMENT ' 服务方法;RPC#method',
`parameter_type` varchar(256) COLLATE utf8_bin NOT NULL COMMENT '参数类型(RPC 限定单参数注册);new String[]{"java.lang.String"}、new String[]{"cn.bugstack.gateway.rpc.dto.XReq"}',
`uri` varchar(128) COLLATE utf8_bin NOT NULL COMMENT '网关接口',
`http_command_type` varchar(32) COLLATE utf8_bin NOT NULL COMMENT '接口类型;GET、POST、PUT、DELETE',
`auth` int(4) NOT NULL DEFAULT '0' COMMENT 'true = 1是、false = 0否',
`create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Records of http_statement
-- ----------------------------
BEGIN;
INSERT INTO `http_statement` VALUES (1, 'api-gateway-test', 'cn.bugstack.gateway.rpc.IActivityBooth', 'sayHi', 'java.lang.String', '/wg/activity/sayHi', 'GET', 0, '2022-10-22 15:30:00', '2022-10-22 15:30:00');
INSERT INTO `http_statement` VALUES (2, 'api-gateway-test', 'cn.bugstack.gateway.rpc.IActivityBooth', 'insert', 'cn.bugstack.gateway.rpc.dto.XReq', '/wg/activity/insert', 'POST', 1, '2022-10-22 15:30:00', '2022-10-22 15:30:00');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
对外接口层
interfaces包下RpcRegisterManage.java
package com.zshunbao.gateway.center.interfaces;
import com.zshunbao.gateway.center.application.IRegisterManageService;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceMethodVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationSystemVO;
import com.zshunbao.gateway.center.infrastructure.common.ResponseCode;
import com.zshunbao.gateway.center.infrastructure.common.Result;
import com.zshunbao.gateway.center.infrastructure.repository.RegisterManageRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @program: api-gateway-center
* @ClassName RpcRegisterManage
* @description: RPC服务注册管理
* @author: zs宝
* @create: 2025-08-20 14:25
* @Version 1.0
**/
@RestController
@RequestMapping("/wg/admin/register")
public class RpcRegisterManage {
private Logger logger = LoggerFactory.getLogger(RpcRegisterManage.class);
@Resource
private IRegisterManageService registerManageService;
/**
* 注册应用系统
* @param systemId
* @param systemName
* @param systemType
* @param systemRegistry
* @return
*/
@PostMapping(value = "registerApplication", produces = "application/json;charset=utf-8")
public Result<Boolean> registerApplication(@RequestParam String systemId,
@RequestParam String systemName,
@RequestParam String systemType,
@RequestParam String systemRegistry) {
try {
logger.info("注册RPC应用系统,systemId:{},systemName:{},systemType:{},systemRegistry:{}",systemId,systemName,systemType,systemRegistry);
ApplicationSystemVO applicationSystemVO=new ApplicationSystemVO();
applicationSystemVO.setSystemId(systemId);
applicationSystemVO.setSystemName(systemName);
applicationSystemVO.setSystemType(systemType);
applicationSystemVO.setSystemRegistry(systemRegistry);
registerManageService.registerApplication(applicationSystemVO);
return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getInfo(), true);
}catch (DuplicateKeyException e){
logger.warn("注册RPC应用系统联合索引冲突,systemId:{},systemName:{},systemType:{},systemRegistry:{}",systemId,systemName,systemType,systemRegistry);
return new Result<>(ResponseCode.INDEX_DUP.getCode(), e.getMessage(), true);
}catch (Exception e){
logger.error("注册应用服务失败 systemId:{}", systemId, e);
return new Result<>(ResponseCode.UN_ERROR.getCode(), e.getMessage(), false);
}
}
/**
* 注册应用系统的接口
* @param systemId
* @param interfaceId
* @param interfaceName
* @param interfaceVersion
* @return
*/
@PostMapping(value = "registerApplicationInterface", produces = "application/json;charset=utf-8")
public Result<Boolean> registerApplicationInterface(@RequestParam String systemId,
@RequestParam String interfaceId,
@RequestParam String interfaceName,
@RequestParam String interfaceVersion) {
try {
logger.info("注册应用接口 systemId:{} interfaceId:{}", systemId, interfaceId);
ApplicationInterfaceVO applicationInterfaceVO = new ApplicationInterfaceVO();
applicationInterfaceVO.setSystemId(systemId);
applicationInterfaceVO.setInterfaceId(interfaceId);
applicationInterfaceVO.setInterfaceName(interfaceName);
applicationInterfaceVO.setInterfaceVersion(interfaceVersion);
registerManageService.registerApplicationInterface(applicationInterfaceVO);
return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getInfo(), true);
} catch (DuplicateKeyException e) {
logger.warn("注册应用接口重复 systemId:{} interfaceId:{}", systemId, interfaceId);
return new Result<>(ResponseCode.INDEX_DUP.getCode(), e.getMessage(), true);
} catch (Exception e) {
logger.error("注册应用接口失败 systemId:{}", systemId, e);
return new Result<>(ResponseCode.UN_ERROR.getCode(), e.getMessage(), false);
}
}
/**
* 注册应用系统接口中的函数
* @param systemId
* @param interfaceId
* @param methodId
* @param methodName
* @param parameter_type
* @param uri
* @param httpCommandType
* @param auth
* @return
*/
@PostMapping(value = "registerApplicationInterfaceMethod", produces = "application/json;charset=utf-8")
public Result<Boolean> registerApplicationInterfaceMethod(@RequestParam String systemId,
@RequestParam String interfaceId,
@RequestParam String methodId,
@RequestParam String methodName,
@RequestParam String parameter_type,
@RequestParam String uri,
@RequestParam String httpCommandType,
@RequestParam Integer auth) {
try {
logger.info("注册应用接口方法 systemId:{} interfaceId:{} methodId:{}", systemId, interfaceId, methodId);
ApplicationInterfaceMethodVO applicationInterfaceVO = new ApplicationInterfaceMethodVO();
applicationInterfaceVO.setSystemId(systemId);
applicationInterfaceVO.setInterfaceId(interfaceId);
applicationInterfaceVO.setMethodId(methodId);
applicationInterfaceVO.setMethodName(methodName);
applicationInterfaceVO.setParameterType(parameter_type);
applicationInterfaceVO.setUri(uri);
applicationInterfaceVO.setHttpCommandType(httpCommandType);
applicationInterfaceVO.setAuth(auth);
registerManageService.registerApplicationInterfaceMethod(applicationInterfaceVO);
return new Result<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getInfo(), true);
} catch (DuplicateKeyException e) {
logger.warn("注册应用接口重复 systemId:{} interfaceId:{}", systemId, interfaceId);
return new Result<>(ResponseCode.INDEX_DUP.getCode(), e.getMessage(), true);
} catch (Exception e) {
logger.error("注册应用接口失败 systemId:{}", systemId, e);
return new Result<>(ResponseCode.UN_ERROR.getCode(), e.getMessage(), false);
}
}
}
充血模型
domain层下,我们新建一个充血模型register与上一章节的功能做出区分
其中由于要使用到三张库表,因此我们在这个模型中创建对应的VO对象
ApplicationSystemVO.java
package com.zshunbao.gateway.center.domain.register.model.vo;
/**
* @program: api-gateway-center
* @ClassName ApplicationSystemVO
* @description: 注册系统VO
* @author: zs宝
* @create: 2025-08-20 14:29
* @Version 1.0
**/
public class ApplicationSystemVO {
/** 系统标识 */
private String systemId;
/** 系统名称 */
private String systemName;
/** 系统类型;RPC、HTTP*/
private String systemType;
/** 注册中心;zookeeper://127.0.0.1:2181*/
private String systemRegistry;
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public String getSystemName() {
return systemName;
}
public void setSystemName(String systemName) {
this.systemName = systemName;
}
public String getSystemType() {
return systemType;
}
public void setSystemType(String systemType) {
this.systemType = systemType;
}
public String getSystemRegistry() {
return systemRegistry;
}
public void setSystemRegistry(String systemRegistry) {
this.systemRegistry = systemRegistry;
}
}
ApplicationInterfaceVO.java
package com.zshunbao.gateway.center.domain.register.model.vo;
/**
* @program: api-gateway-center
* @ClassName ApplicationInterfaceVO
* @description: 注册接口VO
* @author: zs宝
* @create: 2025-08-20 14:29
* @Version 1.0
**/
public class ApplicationInterfaceVO {
/** 系统标识 */
private String systemId;
/** 接口标识 */
private String interfaceId;
/** 接口名称 */
private String interfaceName;
/** 接口版本 */
private String interfaceVersion;
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public String getInterfaceId() {
return interfaceId;
}
public void setInterfaceId(String interfaceId) {
this.interfaceId = interfaceId;
}
public String getInterfaceName() {
return interfaceName;
}
public void setInterfaceName(String interfaceName) {
this.interfaceName = interfaceName;
}
public String getInterfaceVersion() {
return interfaceVersion;
}
public void setInterfaceVersion(String interfaceVersion) {
this.interfaceVersion = interfaceVersion;
}
}
ApplicationInterfaceMethodVO.java
package com.zshunbao.gateway.center.domain.register.model.vo;
/**
* @program: api-gateway-center
* @ClassName ApplicationInterfaceMethodVO
* @description: 注册函数VO
* @author: zs宝
* @create: 2025-08-20 14:29
* @Version 1.0
**/
public class ApplicationInterfaceMethodVO {
/** 系统标识 */
private String systemId;
/** 接口标识 */
private String interfaceId;
/** 方法标识 */
private String methodId;
/** 方法名称 */
private String methodName;
/** 参数类型(RPC 限定单参数注册);new String[]{"java.lang.String"}、new String[]{"cn.bugstack.gateway.rpc.dto.XReq"} */
private String parameterType;
/** 网关接口 */
private String uri;
/** 接口类型;GET、POST、PUT、DELETE */
private String httpCommandType;
/** 是否鉴权;true = 1是、false = 0否 */
private Integer auth;
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public String getInterfaceId() {
return interfaceId;
}
public void setInterfaceId(String interfaceId) {
this.interfaceId = interfaceId;
}
public String getMethodId() {
return methodId;
}
public void setMethodId(String methodId) {
this.methodId = methodId;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getParameterType() {
return parameterType;
}
public void setParameterType(String parameterType) {
this.parameterType = parameterType;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getHttpCommandType() {
return httpCommandType;
}
public void setHttpCommandType(String httpCommandType) {
this.httpCommandType = httpCommandType;
}
public Integer getAuth() {
return auth;
}
public void setAuth(Integer auth) {
this.auth = auth;
}
}
对应的服务实现为
IRegisterManageServiceImpl.java
package com.zshunbao.gateway.center.domain.register.service;
import com.zshunbao.gateway.center.application.IRegisterManageService;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceMethodVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationSystemVO;
import com.zshunbao.gateway.center.domain.register.repository.IRegisterManageRepository;
import com.zshunbao.gateway.center.interfaces.RpcRegisterManage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @program: api-gateway-center
* @ClassName IRegisterManageServiceImpl
* @description: RPC接口注册服务
* @author: zs宝
* @create: 2025-08-20 14:28
* @Version 1.0
**/
@Service
public class IRegisterManageServiceImpl implements IRegisterManageService {
private Logger logger = LoggerFactory.getLogger(IRegisterManageServiceImpl.class);
@Resource
private IRegisterManageRepository registerManageRepository;
@Override
public void registerApplication(ApplicationSystemVO applicationSystemVO) {
logger.info("domain 服务接口领域模型注册应用系统");
registerManageRepository.registerApplication(applicationSystemVO);
}
@Override
public void registerApplicationInterface(ApplicationInterfaceVO applicationInterfaceVO) {
logger.info("domain 服务接口领域模型注册应用系统的接口");
registerManageRepository.registerApplicationInterface(applicationInterfaceVO);
}
@Override
public void registerApplicationInterfaceMethod(ApplicationInterfaceMethodVO applicationInterfaceMethodVO) {
logger.info("domain 服务接口领域模型注册应用系统的接口的方法");
registerManageRepository.registerApplicationInterfaceMethod(applicationInterfaceMethodVO);
}
}
仓储实现
RegisterManageRepository.java
package com.zshunbao.gateway.center.infrastructure.repository;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceMethodVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationInterfaceVO;
import com.zshunbao.gateway.center.domain.register.model.vo.ApplicationSystemVO;
import com.zshunbao.gateway.center.domain.register.repository.IRegisterManageRepository;
import com.zshunbao.gateway.center.infrastructure.dao.IApplicationInterfaceDao;
import com.zshunbao.gateway.center.infrastructure.dao.IApplicationInterfaceMethodDao;
import com.zshunbao.gateway.center.infrastructure.dao.IApplicationSystemDao;
import com.zshunbao.gateway.center.infrastructure.po.ApplicationInterface;
import com.zshunbao.gateway.center.infrastructure.po.ApplicationInterfaceMethod;
import com.zshunbao.gateway.center.infrastructure.po.ApplicationSystem;
import com.zshunbao.gateway.center.interfaces.RpcRegisterManage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @program: api-gateway-center
* @ClassName RegisterManageRepository
* @description: RPC接口注册仓储服务
* @author: zs宝
* @create: 2025-08-20 14:30
* @Version 1.0
**/
@Component
public class RegisterManageRepository implements IRegisterManageRepository{
private Logger logger = LoggerFactory.getLogger(RegisterManageRepository.class);
@Resource
private IApplicationSystemDao applicationSystemDao;
@Resource
private IApplicationInterfaceDao applicationInterfaceDao;
@Resource
private IApplicationInterfaceMethodDao applicationInterfaceMethodDao;
@Override
public void registerApplication(ApplicationSystemVO applicationSystemVO) {
logger.info("仓储层 RegisterManageRepository 执行服务应用系统 insert");
ApplicationSystem applicationSystem = new ApplicationSystem();
applicationSystem.setSystemId(applicationSystemVO.getSystemId());
applicationSystem.setSystemName(applicationSystemVO.getSystemName());
applicationSystem.setSystemType(applicationSystemVO.getSystemType());
applicationSystem.setSystemRegistry(applicationSystemVO.getSystemRegistry());
applicationSystemDao.insert(applicationSystem);
}
@Override
public void registerApplicationInterface(ApplicationInterfaceVO applicationInterfaceVO) {
logger.info("仓储层 RegisterManageRepository 执行服务应用系统接口 insert");
ApplicationInterface applicationInterface = new ApplicationInterface();
applicationInterface.setSystemId(applicationInterfaceVO.getSystemId());
applicationInterface.setInterfaceId(applicationInterfaceVO.getInterfaceId());
applicationInterface.setInterfaceName(applicationInterfaceVO.getInterfaceName());
applicationInterface.setInterfaceVersion(applicationInterfaceVO.getInterfaceVersion());
applicationInterfaceDao.insert(applicationInterface);
}
@Override
public void registerApplicationInterfaceMethod(ApplicationInterfaceMethodVO applicationInterfaceMethodVO) {
logger.info("仓储层 RegisterManageRepository 执行服务应用系统接口方法 insert");
ApplicationInterfaceMethod applicationInterfaceMethod = new ApplicationInterfaceMethod();
applicationInterfaceMethod.setSystemId(applicationInterfaceMethodVO.getSystemId());
applicationInterfaceMethod.setInterfaceId(applicationInterfaceMethodVO.getInterfaceId());
applicationInterfaceMethod.setMethodId(applicationInterfaceMethodVO.getMethodId());
applicationInterfaceMethod.setMethodName(applicationInterfaceMethodVO.getMethodName());
applicationInterfaceMethod.setParameterType(applicationInterfaceMethodVO.getParameterType());
applicationInterfaceMethod.setUri(applicationInterfaceMethodVO.getUri());
applicationInterfaceMethod.setHttpCommandType(applicationInterfaceMethodVO.getHttpCommandType());
applicationInterfaceMethod.setAuth(applicationInterfaceMethodVO.getAuth());
applicationInterfaceMethodDao.insert(applicationInterfaceMethod);
}
}
本节对应的dao这里不再叙述,只是一个接口,很容易写
mapper实现
application_system.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zshunbao.gateway.center.infrastructure.dao.IApplicationSystemDao">
<resultMap id="applicationSystemMap" type="com.zshunbao.gateway.center.infrastructure.po.ApplicationSystem">
<id column="id" property="id"/>
<id column="system_id" property="systemId"/>
<id column="system_name" property="systemName"/>
<id column="system_type" property="systemType"/>
<id column="system_registry" property="systemRegistry"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
</resultMap>
<insert id="insert" parameterType="com.zshunbao.gateway.center.infrastructure.po.ApplicationSystem">
INSERT INTO application_system(system_id, system_name, system_type, system_registry, create_time, update_time)
VALUES (#{systemId}, #{systemName}, #{systemType}, #{systemRegistry}, NOW(), NOW());
</insert>
</mapper>
application_interface.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zshunbao.gateway.center.infrastructure.dao.IApplicationInterfaceDao">
<resultMap id="applicationInterfaceMap" type="com.zshunbao.gateway.center.infrastructure.po.ApplicationInterface">
<id column="id" property="id"/>
<id column="system_id" property="systemId"/>
<id column="interface_id" property="interfaceId"/>
<id column="interface_name" property="interfaceName"/>
<id column="interface_version" property="interfaceVersion"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
</resultMap>
<insert id="insert" parameterType="com.zshunbao.gateway.center.infrastructure.po.ApplicationInterface">
INSERT INTO application_interface(system_id, interface_id, interface_name, interface_version, create_time, update_time)
VALUES (#{systemId}, #{interfaceId}, #{interfaceName}, #{interfaceVersion}, NOW(), NOW());
</insert>
</mapper>
application_interface_method.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zshunbao.gateway.center.infrastructure.dao.IApplicationInterfaceMethodDao">
<resultMap id="applicationInterfaceMethodMap" type="com.zshunbao.gateway.center.infrastructure.po.ApplicationInterfaceMethod">
<id column="id" property="id"/>
<id column="system_id" property="systemId"/>
<id column="interface_id" property="interfaceId"/>
<id column="method_id" property="methodId"/>
<id column="method_name" property="methodName"/>
<id column="parameter_type" property="parameterType"/>
<id column="uri" property="uri"/>
<id column="http_command_type" property="httpCommandType"/>
<id column="auth" property="auth"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
</resultMap>
<insert id="insert" parameterType="com.zshunbao.gateway.center.infrastructure.po.ApplicationInterfaceMethod">
INSERT INTO application_interface_method(system_id, interface_id, method_id, method_name, parameter_type,
uri, http_command_type, auth, create_time, update_time)
VALUES (#{systemId}, #{interfaceId}, #{methodId}, #{methodName}, #{parameterType},
#{uri}, #{httpCommandType}, #{auth}, NOW(), NOW());
</insert>
</mapper>
测试
@Test
public void test_registerApplication() {
ApplicationSystemVO applicationSystemVO = new ApplicationSystemVO();
applicationSystemVO.setSystemId("api-gateway-test");
applicationSystemVO.setSystemName("网关测试系统");
applicationSystemVO.setSystemType("RPC");
applicationSystemVO.setSystemRegistry("127.0.0.1");
registerManageService.registerApplication(applicationSystemVO);
}
@Test
public void test_registerApplicationInterface() {
ApplicationInterfaceVO applicationInterfaceVO = new ApplicationInterfaceVO();
applicationInterfaceVO.setSystemId("api-gateway-test");
applicationInterfaceVO.setInterfaceId("cn.bugstack.gateway.rpc.IActivityBooth");
applicationInterfaceVO.setInterfaceName("活动平台");
applicationInterfaceVO.setInterfaceVersion("v1.0.0");
registerManageService.registerApplicationInterface(applicationInterfaceVO);
}
@Test
public void test_registerApplicationInterfaceMethod() {
ApplicationInterfaceMethodVO applicationInterfaceVO01 = new ApplicationInterfaceMethodVO();
applicationInterfaceVO01.setSystemId("api-gateway-test");
applicationInterfaceVO01.setInterfaceId("cn.bugstack.gateway.rpc.IActivityBooth");
applicationInterfaceVO01.setMethodId("sayHi");
applicationInterfaceVO01.setMethodName("测试方法");
applicationInterfaceVO01.setParameterType("java.lang.String");
applicationInterfaceVO01.setUri("/wg/activity/sayHi");
applicationInterfaceVO01.setHttpCommandType("GET");
applicationInterfaceVO01.setAuth(0);
registerManageService.registerApplicationInterfaceMethod(applicationInterfaceVO01);
ApplicationInterfaceMethodVO applicationInterfaceVO02 = new ApplicationInterfaceMethodVO();
applicationInterfaceVO02.setSystemId("api-gateway-test");
applicationInterfaceVO02.setInterfaceId("cn.bugstack.gateway.rpc.IActivityBooth");
applicationInterfaceVO02.setMethodId("insert");
applicationInterfaceVO02.setMethodName("插入方法");
applicationInterfaceVO02.setParameterType("cn.bugstack.gateway.rpc.dto.XReq");
applicationInterfaceVO02.setUri("/wg/activity/insert");
applicationInterfaceVO02.setHttpCommandType("POST");
applicationInterfaceVO02.setAuth(1);
registerManageService.registerApplicationInterfaceMethod(applicationInterfaceVO02);
}