From 1af9d3fbc575e9229a9c94df44af9f1d1359345d Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Mon, 22 Dec 2025 18:51:48 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=E6=98=A8=E6=97=A59?= =?UTF-8?q?5=E5=80=BC=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82=202=E3=80=81=E5=BC=80=E5=8F=91frpc=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E9=85=8D=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/RmResourceRegistrationRemote.java | 2 + .../tongran/common/core/enums/MsgEnum.java | 2 + .../RmResourceRegistrationController.java | 21 +- .../EpsServerRevenueConfigServiceImpl.java | 112 ++++--- .../impl/RmMonitorConfigServiceImpl.java | 8 + .../system/RmResourceRegistrationMapper.xml | 2 +- .../RmFrpcConfigManageController.java | 113 +++++++ .../RmFrpcPortMappingController.java | 58 ++++ .../rocketmq/domain/RmFrpcConfigManage.java | 89 ++++++ .../rocketmq/domain/RmFrpcPortMapping.java | 37 +++ .../tongran/rocketmq/domain/vo/FrpMsgVo.java | 24 ++ .../tongran/rocketmq/domain/vo/FrpRspVo.java | 41 +++ .../rocketmq/domain/vo/PolicyTypeVo.java | 2 + .../rocketmq/handler/MessageHandler.java | 41 ++- .../mapper/RmFrpcConfigManageMapper.java | 61 ++++ .../mapper/RmFrpcPortMappingMapper.java | 64 ++++ .../service/IRmFrpcConfigManageService.java | 69 +++++ .../service/IRmFrpcPortMappingService.java | 61 ++++ .../impl/RmFrpcConfigManageServiceImpl.java | 286 ++++++++++++++++++ .../impl/RmFrpcPortMappingServiceImpl.java | 100 ++++++ .../rocketmq/RmFrpcConfigManageMapper.xml | 133 ++++++++ .../rocketmq/RmFrpcPortMappingMapper.xml | 91 ++++++ 22 files changed, 1365 insertions(+), 52 deletions(-) create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcConfigManageController.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcPortMappingController.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcConfigManage.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcPortMapping.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpMsgVo.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpRspVo.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcConfigManageMapper.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcPortMappingMapper.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcConfigManageService.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcPortMappingService.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcConfigManageServiceImpl.java create mode 100644 tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcPortMappingServiceImpl.java create mode 100644 tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcConfigManageMapper.xml create mode 100644 tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcPortMappingMapper.xml diff --git a/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmResourceRegistrationRemote.java b/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmResourceRegistrationRemote.java index 3139040..1f1e468 100644 --- a/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmResourceRegistrationRemote.java +++ b/tongran-api/tongran-api-system/src/main/java/com/tongran/system/api/domain/RmResourceRegistrationRemote.java @@ -178,5 +178,7 @@ public class RmResourceRegistrationRemote extends BaseEntity @Excel(name = "上机时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date onboardTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date delAlarmTime; } diff --git a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java index d8892a0..f183649 100644 --- a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java +++ b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/enums/MsgEnum.java @@ -15,6 +15,8 @@ public enum MsgEnum { 多公网IP探测("NETWORK_DETECT"), + 修改frp配置文件应答("UPDATE_FRP_RSP"), + 获取最新策略("GET_POLICY"), 获取最新策略应答("GET_POLICY_RSP"), diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/controller/RmResourceRegistrationController.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/controller/RmResourceRegistrationController.java index 33b2bcb..aaf1d4c 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/controller/RmResourceRegistrationController.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/controller/RmResourceRegistrationController.java @@ -17,7 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -157,16 +156,16 @@ public class RmResourceRegistrationController extends BaseController @GetMapping("/getAlarmFlag") public AjaxResult getAlarmFlag() { - List list = rmResourceRegistrationService.selectRmResourceRegistrationList(new RmResourceRegistration()); - for (RmResourceRegistration item : list) { - - boolean isAlarm = (item.getCpuUtil() != null && item.getCpuUtil().compareTo(BigDecimal.valueOf(80)) >= 0) || - (item.getMemUtil() != null && item.getMemUtil().compareTo(BigDecimal.valueOf(60)) >= 0); - - if (isAlarm) { - return success(true); // 只要有一个告警就返回 - } - } +// List list = rmResourceRegistrationService.selectRmResourceRegistrationList(new RmResourceRegistration()); +// for (RmResourceRegistration item : list) { +// +// boolean isAlarm = (item.getCpuUtil() != null && item.getCpuUtil().compareTo(BigDecimal.valueOf(80)) >= 0) || +// (item.getMemUtil() != null && item.getMemUtil().compareTo(BigDecimal.valueOf(60)) >= 0); +// +// if (isAlarm) { +// return success(true); // 只要有一个告警就返回 +// } +// } return success(false); } diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java index b2b732f..65a821c 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/EpsServerRevenueConfigServiceImpl.java @@ -174,45 +174,89 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi epsInitialTrafficData.setStartTime(epsServerRevenueConfig.getStartTime()); epsInitialTrafficData.setEndTime(epsServerRevenueConfig.getEndTime()); List dataList = epsInitialTrafficDataService.getAllTraficMsg(epsInitialTrafficData); + + if (dataList == null || dataList.isEmpty()) { + return R.ok("没有需要处理的数据"); + } + List batchList = new ArrayList<>(); - for (EpsInitialTrafficData initialTrafficData : dataList) { - // 根据clientId查询业务名称 - RmResourceRegistration rmResourceRegistration = new RmResourceRegistration(); - rmResourceRegistration.setClientId(initialTrafficData.getClientId()); - List registerLst = rmResourceRegistrationMapper.selectRmResourceRegistrationList(rmResourceRegistration); - if(registerLst != null && !registerLst.isEmpty()){ - RmResourceRegistration registerMsg = registerLst.get(0); - // 赋值 - if(registerMsg != null){ - String businessName = registerMsg.getBusinessName(); - if(businessName != null){ - initialTrafficData.setBusinessName(businessName); - // 根据业务名称查询业务代码 - EpsBusiness epsBusiness = epsBusinessMapper.selectEpsBusinessByName(businessName); - if(epsBusiness != null){ - initialTrafficData.setBusinessId(epsBusiness.getId()); + int batchSize = 1000; // 每批处理数量 + int totalCount = 0; + int successCount = 0; + int batchNumber = 0; + + try { + for (EpsInitialTrafficData initialTrafficData : dataList) { + // 根据clientId查询业务名称 + RmResourceRegistration rmResourceRegistration = new RmResourceRegistration(); + rmResourceRegistration.setClientId(initialTrafficData.getClientId()); + List registerLst = rmResourceRegistrationMapper.selectRmResourceRegistrationList(rmResourceRegistration); + + if(registerLst != null && !registerLst.isEmpty()){ + RmResourceRegistration registerMsg = registerLst.get(0); + // 赋值 + if(registerMsg != null){ + String businessName = registerMsg.getBusinessName(); + if(businessName != null){ + initialTrafficData.setBusinessName(businessName); + // 根据业务名称查询业务代码 + EpsBusiness epsBusiness = epsBusinessMapper.selectEpsBusinessByName(businessName); + if(epsBusiness != null){ + initialTrafficData.setBusinessId(epsBusiness.getId()); + } } + initialTrafficData.setServiceSn(registerMsg.getHardwareSn()); + initialTrafficData.setRevenueMethod("1"); } - initialTrafficData.setServiceSn(registerMsg.getHardwareSn()); - initialTrafficData.setRevenueMethod("1"); + } + // id自增 + initialTrafficData.setId(null); + batchList.add(initialTrafficData); + + // 达到批次大小时保存 + if (batchList.size() >= batchSize) { + batchNumber++; + totalCount += batchList.size(); + epsInitialTrafficData.setDataList(batchList); + epsInitialTrafficDataService.saveBatch(epsInitialTrafficData); + log.info("第{}批流量数据批量入库成功,数据量:{}", batchNumber, batchList.size()); + + // 处理接口名称 + processInterfaceNames(batchList); + + successCount += batchList.size(); + // 清空当前批次,准备下一批 + batchList = new ArrayList<>(); } } - // id自增 - initialTrafficData.setId(null); - batchList.add(initialTrafficData); - } - epsInitialTrafficData.setDataList(batchList); - // 流量相关数据入库 - try { - epsInitialTrafficDataService.saveBatch(epsInitialTrafficData); - log.info("流量数据批量入库成功,数据量:{}", batchList.size()); - // 接口名称保存 - processInterfaceNames(batchList); - return R.ok("数据保存成功"); + + // 处理最后一批不足1000条的数据 + if (!batchList.isEmpty()) { + batchNumber++; + totalCount += batchList.size(); + epsInitialTrafficData.setDataList(batchList); + epsInitialTrafficDataService.saveBatch(epsInitialTrafficData); + log.info("第{}批流量数据批量入库成功,数据量:{}", batchNumber, batchList.size()); + + // 处理最后一批的接口名称 + processInterfaceNames(batchList); + + successCount += batchList.size(); + } + + log.info("流量数据批量入库完成,总批次数:{},总数据量:{},成功数量:{}", + batchNumber, totalCount, successCount); + + if (successCount == totalCount) { + return R.ok("数据保存成功,共处理" + successCount + "条数据"); + } else { + return R.fail("数据保存部分成功,应处理" + totalCount + "条,实际成功" + successCount + "条"); + } + } catch (Exception e) { - log.error("流量数据入库失败,数据量:{},错误原因:{}", - batchList.size(), e.getMessage(), e); - return R.fail("数据保存失败:" + e.getMessage()); + log.error("流量数据入库失败,已处理批次:{},成功数量:{},当前批次数量:{},错误原因:{}", + batchNumber, successCount, batchList.size(), e.getMessage(), e); + return R.fail("数据保存失败:" + e.getMessage() + ",已成功保存" + successCount + "条"); } } /** @@ -261,7 +305,7 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi records.sort(Comparator .comparing(AllInterfaceName::getInterfaceName) .thenComparing(AllInterfaceName::getClientId) - .thenComparing(AllInterfaceName::getSwitchIp) + .thenComparing(AllInterfaceName::getServerIp) .thenComparing(AllInterfaceName::getResourceType)); allInterfaceNameMapper.batchInsert(records); diff --git a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmMonitorConfigServiceImpl.java b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmMonitorConfigServiceImpl.java index af1b869..4772a62 100644 --- a/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmMonitorConfigServiceImpl.java +++ b/tongran-modules/tongran-system/src/main/java/com/tongran/system/service/impl/RmMonitorConfigServiceImpl.java @@ -177,6 +177,10 @@ public class RmMonitorConfigServiceImpl implements IRmMonitorConfigService rmMonitorConfig.setDeployDevice(clientIds.toString()); } List serverTrafficList = epsInitialTrafficDataService.getServerTrafficByMonitorView(rmMonitorConfig); + if(serverTrafficList == null || serverTrafficList.isEmpty()){ + log.warn("该监控项暂无数据"); + continue; + } RmMonitorConfigDetails configDetailsQuery = new RmMonitorConfigDetails(); configDetailsQuery.setMonitorId(rmMonitorConfig.getId()); // 查询该数据是否存在 @@ -206,6 +210,10 @@ public class RmMonitorConfigServiceImpl implements IRmMonitorConfigService } }else{ List switchInfoDetailsList = initialSwitchInfoDetailsService.getMonitorViewDetails(rmMonitorConfig); + if(switchInfoDetailsList == null || switchInfoDetailsList.isEmpty()){ + log.warn("该监控项暂无数据"); + continue; + } RmMonitorConfigDetails configDetailsQuery = new RmMonitorConfigDetails(); configDetailsQuery.setMonitorId(rmMonitorConfig.getId()); // 查询该数据是否存在 diff --git a/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml b/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml index 0d9f43b..bfbf72e 100644 --- a/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml +++ b/tongran-modules/tongran-system/src/main/resources/mapper/system/RmResourceRegistrationMapper.xml @@ -24,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcConfigManageController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcConfigManageController.java new file mode 100644 index 0000000..98231f3 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcConfigManageController.java @@ -0,0 +1,113 @@ +package com.tongran.rocketmq.controller; + +import com.tongran.common.core.utils.poi.ExcelUtil; +import com.tongran.common.core.web.controller.BaseController; +import com.tongran.common.core.web.domain.AjaxResult; +import com.tongran.common.core.web.page.PageDomain; +import com.tongran.common.core.web.page.TableDataInfo; +import com.tongran.common.log.annotation.Log; +import com.tongran.common.log.enums.BusinessType; +import com.tongran.common.security.annotation.RequiresPermissions; +import com.tongran.rocketmq.domain.RmFrpcConfigManage; +import com.tongran.rocketmq.service.IRmFrpcConfigManageService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * FRPC配置管理Controller + * + * @author gyt + * @date 2025-12-19 + */ +@RestController +@RequestMapping("/frpcConfigManage") +@RequiresPermissions("rocketmq:frpcConfigManage") +public class RmFrpcConfigManageController extends BaseController +{ + @Autowired + private IRmFrpcConfigManageService rmFrpcConfigManageService; + + /** + * 查询FRPC配置管理列表 + */ + @PostMapping("/list") + public TableDataInfo list(@RequestBody RmFrpcConfigManage rmFrpcConfigManage) + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(rmFrpcConfigManage.getPageNum()); + pageDomain.setPageSize(rmFrpcConfigManage.getPageSize()); + startPage(pageDomain); + List list = rmFrpcConfigManageService.selectRmFrpcConfigManageList(rmFrpcConfigManage); + return getDataTable(list); + } + + /** + * 导出FRPC配置管理列表 + */ + @RequiresPermissions("rocketmq:frpcConfigManage:export") + @Log(title = "FRPC配置管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, @RequestBody RmFrpcConfigManage rmFrpcConfigManage) + { + List list = rmFrpcConfigManageService.selectRmFrpcConfigManageList(rmFrpcConfigManage); + ExcelUtil util = new ExcelUtil(RmFrpcConfigManage.class); + util.showColumn(rmFrpcConfigManage.getProperties()); + util.exportExcel(response, list, "FRPC配置管理数据"); + } + + /** + * 获取FRPC配置管理详细信息 + */ + @RequiresPermissions("rocketmq:frpcConfigManage:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(rmFrpcConfigManageService.selectRmFrpcConfigManageById(id)); + } + + /** + * 新增FRPC配置管理 + */ + @RequiresPermissions("rocketmq:frpcConfigManage:add") + @Log(title = "FRPC配置管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RmFrpcConfigManage rmFrpcConfigManage) + { + return toAjax(rmFrpcConfigManageService.insertRmFrpcConfigManage(rmFrpcConfigManage)); + } + + /** + * 修改FRPC配置管理 + */ + @RequiresPermissions("rocketmq:frpcConfigManage:edit") + @Log(title = "FRPC配置管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody RmFrpcConfigManage rmFrpcConfigManage) + { + return toAjax(rmFrpcConfigManageService.updateRmFrpcConfigManage(rmFrpcConfigManage)); + } + + /** + * 删除FRPC配置管理 + */ + @RequiresPermissions("rocketmq:frpcConfigManage:remove") + @Log(title = "FRPC配置管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(rmFrpcConfigManageService.deleteRmFrpcConfigManageByIds(ids)); + } + + /** + * 生成FRP连接 + */ + @Log(title = "生成FRP连接", businessType = BusinessType.OTHER) + @PostMapping("/addFrpConnect") + public AjaxResult addFrpConnect(@RequestBody RmFrpcConfigManage rmFrpcConfigManage) + { + return toAjax(rmFrpcConfigManageService.addFrpConnect(rmFrpcConfigManage)); + } +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcPortMappingController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcPortMappingController.java new file mode 100644 index 0000000..5ffc89a --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/RmFrpcPortMappingController.java @@ -0,0 +1,58 @@ +package com.tongran.rocketmq.controller; + +import com.tongran.common.core.web.controller.BaseController; +import com.tongran.common.core.web.domain.AjaxResult; +import com.tongran.common.log.annotation.Log; +import com.tongran.common.log.enums.BusinessType; +import com.tongran.common.security.annotation.RequiresPermissions; +import com.tongran.rocketmq.domain.RmFrpcPortMapping; +import com.tongran.rocketmq.service.IRmFrpcPortMappingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * FRPC端口映射配置Controller + * + * @author gyt + * @date 2025-12-19 + */ +@RestController +@RequestMapping("/frpcPortMapping") +public class RmFrpcPortMappingController extends BaseController +{ + @Autowired + private IRmFrpcPortMappingService rmFrpcPortMappingService; + + /** + * 查询FRPC端口映射配置列表 + */ + @RequiresPermissions("rocketmq:frpcPortMapping:list") + @PostMapping("/list") + public AjaxResult list(@RequestBody RmFrpcPortMapping rmFrpcPortMapping) + { + List list = rmFrpcPortMappingService.selectRmFrpcPortMappingList(rmFrpcPortMapping); + return success(list); + } + + + /** + * 获取FRPC端口映射配置详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(rmFrpcPortMappingService.selectRmFrpcPortMappingById(id)); + } + + /** + * 新增FRPC端口映射配置 + */ + @Log(title = "FRPC端口映射配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RmFrpcPortMapping rmFrpcPortMapping) + { + return toAjax(rmFrpcPortMappingService.insertRmFrpcPortMapping(rmFrpcPortMapping)); + } +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcConfigManage.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcConfigManage.java new file mode 100644 index 0000000..a7504b7 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcConfigManage.java @@ -0,0 +1,89 @@ +package com.tongran.rocketmq.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.tongran.common.core.annotation.Excel; +import com.tongran.common.core.web.domain.BaseEntity; +import lombok.Data; + +import java.util.Date; + +/** + * FRPC配置管理对象 rm_frpc_config_manage + * + * @author gyt + * @date 2025-12-19 + */ +@Data +public class RmFrpcConfigManage extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 客户端ID */ + @Excel(name = "客户端ID") + private String clientId; + + /** FRPC服务器地址 */ + @Excel(name = "FRPC服务器地址") + private String frpcServerAddr; + + /** FRPC服务器端口 */ + @Excel(name = "FRPC服务器端口") + private String frpcServerPort; + + /** FRPC远程端口 */ + @Excel(name = "FRPC远程端口") + private String frpcRemotePort; + + /** FRPC本地端口 */ + @Excel(name = "FRPC本地端口") + private String frpcLocalPort; + + /** FRPC本地IP */ + @Excel(name = "FRPC本地IP") + private String frpcLocalIp; + + /** FRPC配置名称 */ + @Excel(name = "FRPC配置名称") + private String frpcName; + + /** FRP连接地址生成状态(0-未生成,1-生成中,2已生成) */ + @Excel(name = "FRP连接地址生成状态", readConverterExp = "0=未生成,1=生成中,2=已生成") + private Long frpcConnectionStatus; + + /** FRPC服务状态(0-未运行,1-运行) */ + @Excel(name = "FRPC服务状态", readConverterExp = "0=未运行,1=运行") + private String frpcStatus; + + /** FRPC连接生成时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "FRPC连接生成时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date frpcCreateTime; + /** 起始远程端口 */ + private Integer startRemotePort; + + /** 结束远程端口 */ + private Integer endRemotePort; + // 管理网相关字段 + + @Excel(name = "管理网-公网IP") + private String mgmtPublicIp; // 管理网-公网IP + + @Excel(name = "管理网-接口名称") + private String mgmtInterfaceName; // 管理网-接口名称 + + @Excel(name = "管理网-mac地址") + private String mgmtMacAddress; // 管理网-mac地址 + + @Excel(name = "管理网-接口类型") + private String mgmtInterfaceType; // 管理网-接口类型 + + @Excel(name = "管理网-IPv4地址") + private String mgmtIpv4Address; // 管理网-IPv4地址 + + @Excel(name = "管理网-网关") + private String mgmtGateway; // 管理网-网关地址 + +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcPortMapping.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcPortMapping.java new file mode 100644 index 0000000..154150c --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/RmFrpcPortMapping.java @@ -0,0 +1,37 @@ +package com.tongran.rocketmq.domain; + +import com.tongran.common.core.annotation.Excel; +import com.tongran.common.core.web.domain.BaseEntity; +import lombok.Data; + +/** + * FRPC端口映射配置对象 rm_frpc_port_mapping + * + * @author gyt + * @date 2025-12-19 + */ +@Data +public class RmFrpcPortMapping extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 起始远程端口 */ + @Excel(name = "起始远程端口") + private Integer startRemotePort; + + /** 结束远程端口 */ + @Excel(name = "结束远程端口") + private Integer endRemotePort; + + /** 服务器端口 */ + @Excel(name = "服务器端口") + private String serverPort; + + /** 服务器地址 */ + @Excel(name = "服务器地址") + private String serverAddr; + +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpMsgVo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpMsgVo.java new file mode 100644 index 0000000..66f020e --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpMsgVo.java @@ -0,0 +1,24 @@ +package com.tongran.rocketmq.domain.vo; + +import lombok.Data; + +/** + * FRPC端口映射配置对象 rm_frpc_port_mapping + * + * @author gyt + * @date 2025-12-19 + */ +@Data +public class FrpMsgVo +{ + + /** 远程端口 */ + private Integer remotePort; + + /** 服务器端口 */ + private String serverPort; + + /** 服务器地址 */ + private String serverAddr; + +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpRspVo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpRspVo.java new file mode 100644 index 0000000..e3d037b --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/FrpRspVo.java @@ -0,0 +1,41 @@ +package com.tongran.rocketmq.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.time.Instant; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class FrpRspVo { + /** + * 状态码,0、失败;1、成功 + */ + private Integer resCode; + /** + * 描述 + */ + private String resMsg; + + /** frps地址 */ + private String serverAddr; + /** frps端口 */ + private String serverPort; + /** frpc端口 */ + private String remotePort; + /** frpc 名称 */ + private String name; + /** frpc 类型 */ + private String type; + /** frpc 映射ip */ + private String localIP; + /** frpc 映射端口 */ + private String localPort; + /** frpc运行状态(0未运行,1已运行) */ + private String isRunning; + + /** + * 时间戳 + */ + private Long timestamp = Instant.now().getEpochSecond(); +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java index d8d59db..0e28bad 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/vo/PolicyTypeVo.java @@ -17,6 +17,8 @@ public class PolicyTypeVo { private String routes; /** 业务网卡名称*/ private String netName; + /** frp配置信息 */ + private String frpMsg; /** 时间戳 */ private Long timestamp = Instant.now().getEpochSecond(); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java index 0eea7dd..8ff9eb3 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/handler/MessageHandler.java @@ -7,14 +7,10 @@ import com.tongran.common.core.enums.MsgEnum; import com.tongran.common.core.utils.DateUtils; import com.tongran.common.core.utils.StringUtils; import com.tongran.rocketmq.domain.*; -import com.tongran.rocketmq.domain.vo.CollectDataVo; -import com.tongran.rocketmq.domain.vo.RegisterMsgVo; -import com.tongran.rocketmq.domain.vo.RspResultVo; -import com.tongran.rocketmq.domain.vo.RspVo; +import com.tongran.rocketmq.domain.vo.*; import com.tongran.rocketmq.enums.AlarmTypeEnum; import com.tongran.rocketmq.enums.PushMethodEnum; import com.tongran.rocketmq.service.*; -import com.tongran.rocketmq.snmp.scheduler.MultiSwitchCollectionScheduler; import com.tongran.rocketmq.utils.DataProcessUtil; import com.tongran.rocketmq.utils.JsonDataParser; import com.tongran.rocketmq.utils.WeChatWorkBot; @@ -101,7 +97,7 @@ public class MessageHandler { @Autowired private IRmAlarmPushConfigService rmAlarmPushConfigService; @Autowired - private MultiSwitchCollectionScheduler multiSwitchCollectionScheduler; + private IRmFrpcConfigManageService rmFrpcConfigManageService; /** @@ -124,6 +120,39 @@ public class MessageHandler { registerHandler(MsgEnum.系统其他上报.getValue(), this::handleOtherSystemMessage); registerHandler(MsgEnum.心跳上报.getValue(), this::handleHeartbeatMessage); registerHandler(MsgEnum.多公网IP探测.getValue(), this::handleNetWorkDelectMessage); + registerHandler(MsgEnum.修改frp配置文件应答.getValue(), this::handleUpdateFrpMessage); + } + + private void handleUpdateFrpMessage(DeviceMessage message) { + List rspVoList = JsonDataParser.parseJsonData(message.getData(), FrpRspVo.class); + if (!rspVoList.isEmpty()) { + FrpRspVo rsp = rspVoList.get(0); + // 时间戳转换 + long timestamp = rsp.getTimestamp(); + long millis = timestamp * 1000; + Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒 + if(rsp.getResCode() == 1) { + // 运行成功 修改相关信息 + RmFrpcConfigManage frpcData = new RmFrpcConfigManage(); + frpcData.setClientId(message.getClientId()); + frpcData.setFrpcName(rsp.getName()); + frpcData.setFrpcStatus(rsp.getIsRunning()); + frpcData.setFrpcLocalPort(rsp.getLocalPort()); + frpcData.setFrpcLocalIp(rsp.getLocalIP()); + frpcData.setFrpcCreateTime(createTime); + frpcData.setFrpcConnectionStatus(2L); + frpcData.setFrpcRemotePort(rsp.getRemotePort()); + frpcData.setFrpcServerAddr(rsp.getServerAddr()); + frpcData.setFrpcServerPort(rsp.getServerPort()); + rmFrpcConfigManageService.insertRmFrpcConfigManage(frpcData); + } else if(rsp.getResCode() == 2){ + RmFrpcConfigManage configManage = new RmFrpcConfigManage(); + configManage.setFrpcRemotePort(rsp.getRemotePort()); + rmFrpcConfigManageService.addFrpConnect(configManage); + } else{ + log.error("生成连接失败:{}",rsp.getResMsg()); + } + } } /** diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcConfigManageMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcConfigManageMapper.java new file mode 100644 index 0000000..a693cbc --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcConfigManageMapper.java @@ -0,0 +1,61 @@ +package com.tongran.rocketmq.mapper; + +import java.util.List; +import com.tongran.rocketmq.domain.RmFrpcConfigManage; + +/** + * FRPC配置管理Mapper接口 + * + * @author gyt + * @date 2025-12-19 + */ +public interface RmFrpcConfigManageMapper +{ + /** + * 查询FRPC配置管理 + * + * @param id FRPC配置管理主键 + * @return FRPC配置管理 + */ + public RmFrpcConfigManage selectRmFrpcConfigManageById(Long id); + + /** + * 查询FRPC配置管理列表 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return FRPC配置管理集合 + */ + public List selectRmFrpcConfigManageList(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 新增FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + public int insertRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 修改FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + public int updateRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 删除FRPC配置管理 + * + * @param id FRPC配置管理主键 + * @return 结果 + */ + public int deleteRmFrpcConfigManageById(Long id); + + /** + * 批量删除FRPC配置管理 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteRmFrpcConfigManageByIds(Long[] ids); +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcPortMappingMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcPortMappingMapper.java new file mode 100644 index 0000000..d8263c8 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/RmFrpcPortMappingMapper.java @@ -0,0 +1,64 @@ +package com.tongran.rocketmq.mapper; + +import com.tongran.rocketmq.domain.RmFrpcPortMapping; + +import java.util.List; + +/** + * FRPC端口映射配置Mapper接口 + * + * @author gyt + * @date 2025-12-19 + */ +public interface RmFrpcPortMappingMapper +{ + /** + * 查询FRPC端口映射配置 + * + * @param id FRPC端口映射配置主键 + * @return FRPC端口映射配置 + */ + public RmFrpcPortMapping selectRmFrpcPortMappingById(Long id); + + /** + * 查询FRPC端口映射配置列表 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return FRPC端口映射配置集合 + */ + public List selectRmFrpcPortMappingList(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 新增FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + public int insertRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 修改FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + public int updateRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 删除FRPC端口映射配置 + * + * @param id FRPC端口映射配置主键 + * @return 结果 + */ + public int deleteRmFrpcPortMappingById(Long id); + + /** + * 批量删除FRPC端口映射配置 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteRmFrpcPortMappingByIds(Long[] ids); + + void truncateFrpcPortMapping(); +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcConfigManageService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcConfigManageService.java new file mode 100644 index 0000000..4aad303 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcConfigManageService.java @@ -0,0 +1,69 @@ +package com.tongran.rocketmq.service; + +import com.tongran.rocketmq.domain.RmFrpcConfigManage; + +import java.util.List; + +/** + * FRPC配置管理Service接口 + * + * @author gyt + * @date 2025-12-19 + */ +public interface IRmFrpcConfigManageService +{ + /** + * 查询FRPC配置管理 + * + * @param id FRPC配置管理主键 + * @return FRPC配置管理 + */ + public RmFrpcConfigManage selectRmFrpcConfigManageById(Long id); + + /** + * 查询FRPC配置管理列表 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return FRPC配置管理集合 + */ + public List selectRmFrpcConfigManageList(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 新增FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + public int insertRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 修改FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + public int updateRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage); + + /** + * 批量删除FRPC配置管理 + * + * @param ids 需要删除的FRPC配置管理主键集合 + * @return 结果 + */ + public int deleteRmFrpcConfigManageByIds(Long[] ids); + + /** + * 删除FRPC配置管理信息 + * + * @param id FRPC配置管理主键 + * @return 结果 + */ + public int deleteRmFrpcConfigManageById(Long id); + + /** + * 生成frp连接 + * @param rmFrpcConfigManage + * @return + */ + int addFrpConnect(RmFrpcConfigManage rmFrpcConfigManage); +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcPortMappingService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcPortMappingService.java new file mode 100644 index 0000000..9d97a2d --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IRmFrpcPortMappingService.java @@ -0,0 +1,61 @@ +package com.tongran.rocketmq.service; + +import java.util.List; +import com.tongran.rocketmq.domain.RmFrpcPortMapping; + +/** + * FRPC端口映射配置Service接口 + * + * @author gyt + * @date 2025-12-19 + */ +public interface IRmFrpcPortMappingService +{ + /** + * 查询FRPC端口映射配置 + * + * @param id FRPC端口映射配置主键 + * @return FRPC端口映射配置 + */ + public RmFrpcPortMapping selectRmFrpcPortMappingById(Long id); + + /** + * 查询FRPC端口映射配置列表 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return FRPC端口映射配置集合 + */ + public List selectRmFrpcPortMappingList(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 新增FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + public int insertRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 修改FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + public int updateRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping); + + /** + * 批量删除FRPC端口映射配置 + * + * @param ids 需要删除的FRPC端口映射配置主键集合 + * @return 结果 + */ + public int deleteRmFrpcPortMappingByIds(Long[] ids); + + /** + * 删除FRPC端口映射配置信息 + * + * @param id FRPC端口映射配置主键 + * @return 结果 + */ + public int deleteRmFrpcPortMappingById(Long id); +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcConfigManageServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcConfigManageServiceImpl.java new file mode 100644 index 0000000..6c4f181 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcConfigManageServiceImpl.java @@ -0,0 +1,286 @@ +package com.tongran.rocketmq.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.tongran.common.core.enums.MsgEnum; +import com.tongran.common.core.utils.DateUtils; +import com.tongran.rocketmq.domain.DeviceMessage; +import com.tongran.rocketmq.domain.RmFrpcConfigManage; +import com.tongran.rocketmq.domain.RmFrpcPortMapping; +import com.tongran.rocketmq.domain.RmNetworkInterface; +import com.tongran.rocketmq.domain.vo.FrpMsgVo; +import com.tongran.rocketmq.domain.vo.PolicyTypeVo; +import com.tongran.rocketmq.mapper.RmFrpcConfigManageMapper; +import com.tongran.rocketmq.mapper.RmFrpcPortMappingMapper; +import com.tongran.rocketmq.model.ProducerMode; +import com.tongran.rocketmq.producer.MessageProducer; +import com.tongran.rocketmq.service.IRmFrpcConfigManageService; +import com.tongran.rocketmq.service.IRmNetworkInterfaceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * FRPC配置管理Service业务层处理 + * + * @author gyt + * @date 2025-12-19 + */ +@Service +public class RmFrpcConfigManageServiceImpl implements IRmFrpcConfigManageService +{ + // Redis key定义 + private static final String USED_PORTS_KEY = "frpc:used_ports"; + + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private RmFrpcConfigManageMapper rmFrpcConfigManageMapper; + @Autowired + private RmFrpcPortMappingMapper rmFrpcPortMappingMapper; + @Autowired + private IRmNetworkInterfaceService rmNetworkInterfaceService; + @Autowired + private ProducerMode producerMode; + + /** + * 查询FRPC配置管理 + * + * @param id FRPC配置管理主键 + * @return FRPC配置管理 + */ + @Override + public RmFrpcConfigManage selectRmFrpcConfigManageById(Long id) + { + RmFrpcConfigManage rmFrpcConfigManage = rmFrpcConfigManageMapper.selectRmFrpcConfigManageById(id); + setNetWorkMsg(rmFrpcConfigManage); + return rmFrpcConfigManage; + } + + /** + * 查询FRPC配置管理列表 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return FRPC配置管理 + */ + @Override + public List selectRmFrpcConfigManageList(RmFrpcConfigManage rmFrpcConfigManage) + { + List list = rmFrpcConfigManageMapper.selectRmFrpcConfigManageList(rmFrpcConfigManage); + if(list != null){ + for (RmFrpcConfigManage configManage : list) { + // 设置管理网信息 + setNetWorkMsg(configManage); + } + } + return list; + } + /** + * 网卡信息赋值 + * @param frpcConfigManage + */ + public void setNetWorkMsg(RmFrpcConfigManage frpcConfigManage) { + String clientId = frpcConfigManage.getClientId(); + // 根据clientId查询网卡信息 + RmNetworkInterface queryParam = new RmNetworkInterface(); + queryParam.setClientId(clientId); + queryParam.setNewFlag(1); + // 获取网络接口列表 + List networkList = rmNetworkInterfaceService.selectRmNetworkInterfaceList(queryParam); + + if (networkList == null || networkList.isEmpty()) { + return; + } + + for (RmNetworkInterface network : networkList) { + if ("2".equals(network.getBindIp()) || "3".equals(network.getBindIp())) { + // 管理网IP处理 + frpcConfigManage.setMgmtPublicIp(network.getPublicIp()); + frpcConfigManage.setMgmtInterfaceName(network.getInterfaceName()); + frpcConfigManage.setMgmtMacAddress(network.getMacAddress()); + frpcConfigManage.setMgmtInterfaceType(network.getInterfaceType()); + frpcConfigManage.setMgmtIpv4Address(network.getIpv4Address()); + frpcConfigManage.setMgmtGateway(network.getGateway()); + } + } + } + + /** + * 新增FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + @Override + public int insertRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage) + { + rmFrpcConfigManage.setCreateTime(DateUtils.getNowDate()); + int rows = rmFrpcConfigManageMapper.insertRmFrpcConfigManage(rmFrpcConfigManage); + return 1; + } + + /** + * 修改FRPC配置管理 + * + * @param rmFrpcConfigManage FRPC配置管理 + * @return 结果 + */ + @Override + public int updateRmFrpcConfigManage(RmFrpcConfigManage rmFrpcConfigManage) + { + rmFrpcConfigManage.setUpdateTime(DateUtils.getNowDate()); + return rmFrpcConfigManageMapper.updateRmFrpcConfigManage(rmFrpcConfigManage); + } + + /** + * 批量删除FRPC配置管理 + * + * @param ids 需要删除的FRPC配置管理主键 + * @return 结果 + */ + @Override + public int deleteRmFrpcConfigManageByIds(Long[] ids) + { + return rmFrpcConfigManageMapper.deleteRmFrpcConfigManageByIds(ids); + } + + /** + * 删除FRPC配置管理信息 + * + * @param id FRPC配置管理主键 + * @return 结果 + */ + @Override + public int deleteRmFrpcConfigManageById(Long id) + { + return rmFrpcConfigManageMapper.deleteRmFrpcConfigManageById(id); + } + + @Override + public int addFrpConnect(RmFrpcConfigManage rmFrpcConfigManage) { + // 查询frps配置 + List portMappingList = rmFrpcPortMappingMapper.selectRmFrpcPortMappingList(new RmFrpcPortMapping()); + Integer startRemotePort = rmFrpcConfigManage.getStartRemotePort(); + Integer endRemotePort = rmFrpcConfigManage.getEndRemotePort(); + String serverPort = null; + String serverAddr = null; + if(portMappingList != null && !portMappingList.isEmpty()){ + RmFrpcPortMapping portMapping = portMappingList.get(0); + startRemotePort = portMapping.getStartRemotePort(); + endRemotePort = portMapping.getEndRemotePort(); + serverPort = portMapping.getServerPort(); + serverAddr = portMapping.getServerAddr(); + } + if(startRemotePort == null || endRemotePort == null){ + throw new RuntimeException("请先设置FRPS端口范围"); + } + String clientId = rmFrpcConfigManage.getClientId(); + if(rmFrpcConfigManage.getFrpcRemotePort() != null){ + // 此端口被占用存储到redis,再次随机可用端口 + addUsedPort(Integer.parseInt(rmFrpcConfigManage.getFrpcRemotePort())); + } + // 获取一个可用的随机端口 + int availablePort = getRandomAvailablePort(startRemotePort, endRemotePort); + + if (availablePort != -1) { + // 将端口标记为已使用 + if (addUsedPort(availablePort)) { + // 构建端口下发信息 + FrpMsgVo frpMsgVo = new FrpMsgVo(); + frpMsgVo.setServerPort(serverPort); + frpMsgVo.setServerAddr(serverAddr); + frpMsgVo.setRemotePort(availablePort); + String frpMsgStr = JSONObject.toJSONString(frpMsgVo); + PolicyTypeVo policyTypeVo = new PolicyTypeVo(); + policyTypeVo.setFrpMsg(frpMsgStr); + MessageProducer messageProducer = new MessageProducer(); + String configJson = JSONObject.toJSONString(policyTypeVo); + DeviceMessage message = new DeviceMessage(); + message.setClientId(clientId); + message.setData(configJson); + message.setDataType(MsgEnum.获取最新策略应答.getValue()); + + messageProducer.sendAsyncProducerMessage( + producerMode.getAgentTopic(), + "", + "", + JSONObject.toJSONString(message) + ); + } + return 1; + }else{ + throw new RuntimeException("该端口范围内无可用端口:" + startRemotePort + "~" + endRemotePort); + } + } + /** + * 获取下一个可用的随机端口 + */ + public int getRandomAvailablePort(int startPort, int endPort) { + validatePortRange(startPort, endPort); + + // 获取已使用的端口集合 + Set usedPorts = redisTemplate.opsForSet().members(USED_PORTS_KEY); + if (usedPorts == null) { + usedPorts = new HashSet<>(); + } + + // 创建所有端口的列表 + List allPorts = new ArrayList<>(); + for (int i = startPort; i <= endPort; i++) { + allPorts.add(i); + } + + // 随机打乱 + Collections.shuffle(allPorts); + + // 查找第一个未在Redis中存储的端口 + for (int port : allPorts) { + if (!usedPorts.contains(String.valueOf(port))) { + return port; + } + } + + return -1; // 没有可用端口 + } + + /** + * 判断端口是否可用(只检查Redis中是否存在) + */ + public boolean isPortAvailable(int port) { + // 检查Redis中是否已使用 + Boolean isUsed = redisTemplate.opsForSet().isMember(USED_PORTS_KEY, String.valueOf(port)); + return !Boolean.TRUE.equals(isUsed); + } + + /** + * 添加端口到已用集合 + */ + public boolean addUsedPort(int port) { + Long result = redisTemplate.opsForSet().add(USED_PORTS_KEY, String.valueOf(port)); + return result != null && result > 0; + } + + /** + * 从已用集合中移除端口 + */ + public boolean removeUsedPort(int port) { + Long result = redisTemplate.opsForSet().remove(USED_PORTS_KEY, String.valueOf(port)); + return result != null && result > 0; + } + + /** + * 验证端口范围参数 + */ + private void validatePortRange(int startPort, int endPort) { + if (startPort < 1 || startPort > 65535) { + throw new IllegalArgumentException("起始端口必须在1-65535之间"); + } + if (endPort < 1 || endPort > 65535) { + throw new IllegalArgumentException("结束端口必须在1-65535之间"); + } + if (startPort > endPort) { + throw new IllegalArgumentException("起始端口不能大于结束端口"); + } + } +} diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcPortMappingServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcPortMappingServiceImpl.java new file mode 100644 index 0000000..c897369 --- /dev/null +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/RmFrpcPortMappingServiceImpl.java @@ -0,0 +1,100 @@ +package com.tongran.rocketmq.service.impl; + +import com.tongran.common.core.utils.DateUtils; +import com.tongran.rocketmq.domain.RmFrpcPortMapping; +import com.tongran.rocketmq.mapper.RmFrpcPortMappingMapper; +import com.tongran.rocketmq.service.IRmFrpcPortMappingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * FRPC端口映射配置Service业务层处理 + * + * @author gyt + * @date 2025-12-19 + */ +@Service +public class RmFrpcPortMappingServiceImpl implements IRmFrpcPortMappingService +{ + @Autowired + private RmFrpcPortMappingMapper rmFrpcPortMappingMapper; + + /** + * 查询FRPC端口映射配置 + * + * @param id FRPC端口映射配置主键 + * @return FRPC端口映射配置 + */ + @Override + public RmFrpcPortMapping selectRmFrpcPortMappingById(Long id) + { + return rmFrpcPortMappingMapper.selectRmFrpcPortMappingById(id); + } + + /** + * 查询FRPC端口映射配置列表 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return FRPC端口映射配置 + */ + @Override + public List selectRmFrpcPortMappingList(RmFrpcPortMapping rmFrpcPortMapping) + { + return rmFrpcPortMappingMapper.selectRmFrpcPortMappingList(rmFrpcPortMapping); + } + + /** + * 新增FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + @Override + public int insertRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping) + { + // 清理配置表 + rmFrpcPortMappingMapper.truncateFrpcPortMapping(); + // 插入表 + int rows = rmFrpcPortMappingMapper.insertRmFrpcPortMapping(rmFrpcPortMapping); + return 1; + } + + /** + * 修改FRPC端口映射配置 + * + * @param rmFrpcPortMapping FRPC端口映射配置 + * @return 结果 + */ + @Override + public int updateRmFrpcPortMapping(RmFrpcPortMapping rmFrpcPortMapping) + { + rmFrpcPortMapping.setUpdateTime(DateUtils.getNowDate()); + return rmFrpcPortMappingMapper.updateRmFrpcPortMapping(rmFrpcPortMapping); + } + + /** + * 批量删除FRPC端口映射配置 + * + * @param ids 需要删除的FRPC端口映射配置主键 + * @return 结果 + */ + @Override + public int deleteRmFrpcPortMappingByIds(Long[] ids) + { + return rmFrpcPortMappingMapper.deleteRmFrpcPortMappingByIds(ids); + } + + /** + * 删除FRPC端口映射配置信息 + * + * @param id FRPC端口映射配置主键 + * @return 结果 + */ + @Override + public int deleteRmFrpcPortMappingById(Long id) + { + return rmFrpcPortMappingMapper.deleteRmFrpcPortMappingById(id); + } +} diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcConfigManageMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcConfigManageMapper.xml new file mode 100644 index 0000000..48b776b --- /dev/null +++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcConfigManageMapper.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, client_id, frpc_server_addr, frpc_server_port, frpc_remote_port, frpc_local_port, frpc_name, frpc_connection_status, frpc_create_time, create_time, update_time, create_by, update_by, frpc_local_ip, frpc_status from rm_frpc_config_manage + + + + + + + + INSERT INTO rm_frpc_config_manage + + client_id, + frpc_server_addr, + frpc_server_port, + frpc_remote_port, + frpc_local_port, + frpc_name, + frpc_connection_status, + frpc_create_time, + create_time, + update_time, + create_by, + update_by, + frpc_local_ip, + frpc_status, + + + #{clientId}, + #{frpcServerAddr}, + #{frpcServerPort}, + #{frpcRemotePort}, + #{frpcLocalPort}, + #{frpcName}, + #{frpcConnectionStatus}, + #{frpcCreateTime}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + #{frpcLocalIp}, + #{frpcStatus}, + + ON DUPLICATE KEY UPDATE + + client_id = VALUES(client_id), + frpc_server_addr = VALUES(frpc_server_addr), + frpc_server_port = VALUES(frpc_server_port), + frpc_remote_port = VALUES(frpc_remote_port), + frpc_local_port = VALUES(frpc_local_port), + frpc_name = VALUES(frpc_name), + frpc_connection_status = VALUES(frpc_connection_status), + frpc_create_time = VALUES(frpc_create_time), + + update_time = NOW(), + update_by = VALUES(update_by), + frpc_local_ip = VALUES(frpc_local_ip), + frpc_status = VALUES(frpc_status), + + + + + update rm_frpc_config_manage + + client_id = #{clientId}, + frpc_server_addr = #{frpcServerAddr}, + frpc_server_port = #{frpcServerPort}, + frpc_remote_port = #{frpcRemotePort}, + frpc_local_port = #{frpcLocalPort}, + frpc_name = #{frpcName}, + frpc_connection_status = #{frpcConnectionStatus}, + frpc_create_time = #{frpcCreateTime}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + frpc_local_ip = #{frpcLocalIp}, + frpc_status = #{frpcStatus}, + + where id = #{id} + + + + delete from rm_frpc_config_manage where id = #{id} + + + + delete from rm_frpc_config_manage where id in + + #{id} + + + \ No newline at end of file diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcPortMappingMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcPortMappingMapper.xml new file mode 100644 index 0000000..061852d --- /dev/null +++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/RmFrpcPortMappingMapper.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + select id, start_remote_port, end_remote_port, server_port, server_addr, create_time, update_time, create_by, update_by from rm_frpc_port_mapping + + + + + + + + insert into rm_frpc_port_mapping + + start_remote_port, + end_remote_port, + server_port, + server_addr, + create_time, + update_time, + create_by, + update_by, + + + #{startRemotePort}, + #{endRemotePort}, + #{serverPort}, + #{serverAddr}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + + + + + update rm_frpc_port_mapping + + start_remote_port = #{startRemotePort}, + end_remote_port = #{endRemotePort}, + server_port = #{serverPort}, + server_addr = #{serverAddr}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from rm_frpc_port_mapping where id = #{id} + + + + delete from rm_frpc_port_mapping where id in + + #{id} + + + + + TRUNCATE TABLE rm_frpc_port_mapping + + \ No newline at end of file