diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index edcb3cf..a5e4156 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -13,17 +13,19 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 服务注册地址 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: # 配置中心地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java index daa3482..cad9512 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/MsgEnum.java @@ -71,6 +71,8 @@ public enum MsgEnum { Agent版本更新("AGENT_VERSION_UPDATE"), + MTR探测上报("MTR_DETECT"), + Agent版本更新应答("AGENT_VERSION_UPDATE_RSP"); private String value; diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java index 696e20e..57428cb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java @@ -6,6 +6,7 @@ import java.lang.management.ManagementFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; +import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; @@ -43,6 +44,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils Date now = calendar.getTime(); return now; } + /** + * 获取今天的时间范围数组 + * 返回:String[2] {开始时间, 结束时间} + * 格式:["2024-01-15 00:00:00", "2024-01-15 23:59:59"] + */ + public static String[] getTodayTimeRange() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startOfDay = now.with(LocalTime.MIN); + LocalDateTime endOfDay = now.with(LocalTime.MAX); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return new String[] { + startOfDay.format(formatter), + endOfDay.format(formatter) + }; + } /** * 获取当前日期, 默认格式为yyyy-MM-dd diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TableSubUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TableSubUtil.java new file mode 100644 index 0000000..ea8842a --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/TableSubUtil.java @@ -0,0 +1,110 @@ +package com.ruoyi.common.core.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.Set; + +public class TableSubUtil { + + // 日期格式 + private static final String YEAR_MONTH_FORMAT = "yyyy_MM"; + private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 根据创建时间获取表名 + * @param createTime 记录创建时间 + * @param prefix 表名前缀 + * @return 对应的分表名称 + * @throws IllegalArgumentException 如果createTime为null + * + * 示例: + * 2023-08-05 14:30:00 → rm_mtr_probe_result_2023_08_01_10 + * 2023-08-15 09:15:00 → rm_mtr_probe_result_2023_08_11_20 + * 2023-08-25 18:45:00 → rm_mtr_probe_result_2023_08_21_31 + */ + public static String getTableName(Date createTime, String prefix) { + if (createTime == null) { + throw new IllegalArgumentException("创建时间不能为null"); + } + + SimpleDateFormat yearMonthFormat = new SimpleDateFormat(YEAR_MONTH_FORMAT); + String yearMonth = yearMonthFormat.format(createTime); + + SimpleDateFormat dayFormat = new SimpleDateFormat("dd"); + int day = Integer.parseInt(dayFormat.format(createTime)); + + return String.format("%s_%s_%s", + prefix, + yearMonth, + getDayRange(day)); + } + + /** + * 获取时间范围内涉及的所有表名 + * @param startTime 开始时间 (格式: "yyyy-MM-dd HH:mm:ss") + * @param endTime 结束时间 (格式: "yyyy-MM-dd HH:mm:ss") + * @param prefix 表名前缀 + * @return 按时间顺序排列的表名集合 + */ + public static Set getTableNamesBetween(String startTime, String endTime, String prefix) { + Date start = parseDateTime(startTime); + Date end = parseDateTime(endTime); + validateTimeRange(start, end); + + Set tableNames = new LinkedHashSet<>(); + + // 使用java.util.Calendar进行日期操作 + java.util.Calendar current = java.util.Calendar.getInstance(); + current.setTime(start); + current.set(java.util.Calendar.HOUR_OF_DAY, 0); + current.set(java.util.Calendar.MINUTE, 0); + current.set(java.util.Calendar.SECOND, 0); + current.set(java.util.Calendar.MILLISECOND, 0); + + java.util.Calendar endCal = java.util.Calendar.getInstance(); + endCal.setTime(end); + + while (!current.after(endCal)) { + tableNames.add(getTableName(current.getTime(), prefix)); + current.add(java.util.Calendar.DAY_OF_MONTH, 1); + } + + return tableNames; + } + + // 解析字符串为Date + private static Date parseDateTime(String dateTimeStr) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + throw new IllegalArgumentException("时间字符串不能为空"); + } + try { + SimpleDateFormat format = new SimpleDateFormat(DATE_TIME_FORMAT); + return format.parse(dateTimeStr); + } catch (ParseException e) { + throw new IllegalArgumentException("时间格式必须为: yyyy-MM-dd HH:mm:ss", e); + } + } + + // 获取日期区间 + private static String getDayRange(int day) { + if (day < 1 || day > 31) { + throw new IllegalArgumentException("日期必须在1-31之间"); + } + + if (day <= 10) return "01_10"; + if (day <= 20) return "11_20"; + return "21_31"; + } + + // 验证时间范围 + private static void validateTimeRange(Date start, Date end) { + if (start == null || end == null) { + throw new IllegalArgumentException("时间范围参数不能为null"); + } + if (start.after(end)) { + throw new IllegalArgumentException("开始时间不能晚于结束时间"); + } + } +} \ No newline at end of file diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 1e8693b..07147df 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -13,17 +13,19 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 服务注册地址 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: # 配置中心地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml index 654a23a..ee2018a 100644 --- a/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml @@ -14,14 +14,16 @@ spring: nacos: discovery: # 服务注册地址 -# server-addr: 127.0.0.1:8848 - server-addr: 172.16.15.103:8848 + server-addr: 172.16.15.52:8848 +# server-addr: 172.16.15.103:8848 + namespace: ${spring.cloud.nacos.config.namespace} username: ${spring.cloud.nacos.config.username} password: ${spring.cloud.nacos.config.password} config: # 配置中心地址 -# server-addr: 127.0.0.1:8848 - server-addr: 172.16.15.103:8848 + server-addr: 172.16.15.52:8848 +# server-addr: 172.16.15.103:8848 + namespace: saas-local username: nacos password: nacos # 配置文件格式 diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml index 15c683d..2423fef 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/bootstrap.yml @@ -13,17 +13,19 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 服务注册地址 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 配置中心地址 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrClientRegistrationController.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrClientRegistrationController.java index 8bf578a..1d37d55 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrClientRegistrationController.java +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrClientRegistrationController.java @@ -50,7 +50,7 @@ public class RmMtrClientRegistrationController extends BaseController @RequiresPermissions("mtragent:mtrClientRegistration:export") @Log(title = "MTR客户端注册", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, RmMtrClientRegistration rmMtrClientRegistration) + public void export(HttpServletResponse response, @RequestBody RmMtrClientRegistration rmMtrClientRegistration) { List list = rmMtrClientRegistrationService.selectRmMtrClientRegistrationList(rmMtrClientRegistration); ExcelUtil util = new ExcelUtil(RmMtrClientRegistration.class); @@ -101,5 +101,4 @@ public class RmMtrClientRegistrationController extends BaseController int rows = rmMtrClientRegistrationService.addAgentUpdatePolicy(rmMtrClientRegistration); return toAjax(rows); } - } diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrProbeResultController.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrProbeResultController.java new file mode 100644 index 0000000..4f2725e --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/controller/RmMtrProbeResultController.java @@ -0,0 +1,110 @@ +package com.ruoyi.mtragent.controller; + +import com.ruoyi.common.core.utils.poi.ExcelUtil; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.TableDataInfo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.common.security.annotation.RequiresPermissions; +import com.ruoyi.mtragent.domain.RmMtrProbeResult; +import com.ruoyi.mtragent.service.IRmMtrProbeResultService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 网络mtr探测结果Controller + * + * @author gyt + * @date 2025-11-20 + */ +@RestController +@RequestMapping("/mtrProbeResult") +public class RmMtrProbeResultController extends BaseController +{ + @Autowired + private IRmMtrProbeResultService rmMtrProbeResultService; + + /** + * 查询网络mtr探测结果列表 + */ + @RequiresPermissions("mtragent:mtrProbeResult:list") + @GetMapping("/list") + public TableDataInfo list(RmMtrProbeResult rmMtrProbeResult) + { + startPage(); + List list = rmMtrProbeResultService.selectRmMtrProbeResultList(rmMtrProbeResult); + return getDataTable(list); + } + + /** + * 导出网络mtr探测结果列表 + */ + @RequiresPermissions("mtragent:mtrProbeResult:export") + @Log(title = "网络mtr探测结果", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, RmMtrProbeResult rmMtrProbeResult) + { + List list = rmMtrProbeResultService.selectRmMtrProbeResultList(rmMtrProbeResult); + ExcelUtil util = new ExcelUtil(RmMtrProbeResult.class); + util.exportExcel(response, list, "网络mtr探测结果数据"); + } + + /** + * 获取网络mtr探测结果详细信息 + */ + @RequiresPermissions("mtragent:mtrProbeResult:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(rmMtrProbeResultService.selectRmMtrProbeResultById(id)); + } + + /** + * 新增网络mtr探测结果 + */ + @RequiresPermissions("mtragent:mtrProbeResult:add") + @Log(title = "网络mtr探测结果", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody RmMtrProbeResult rmMtrProbeResult) + { + return toAjax(rmMtrProbeResultService.insertRmMtrProbeResult(rmMtrProbeResult)); + } + + /** + * 修改网络mtr探测结果 + */ + @RequiresPermissions("mtragent:mtrProbeResult:edit") + @Log(title = "网络mtr探测结果", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody RmMtrProbeResult rmMtrProbeResult) + { + return toAjax(rmMtrProbeResultService.updateRmMtrProbeResult(rmMtrProbeResult)); + } + + /** + * 删除网络mtr探测结果 + */ + @RequiresPermissions("mtragent:mtrProbeResult:remove") + @Log(title = "网络mtr探测结果", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(rmMtrProbeResultService.deleteRmMtrProbeResultByIds(ids)); + } + + /** + * 查看丢包率趋势 + */ + @RequiresPermissions("mtragent:mtrProbeResult:list") + @PostMapping("/getLossRateByMtrClientId") + public AjaxResult getLossRateByMtrClientId(@RequestBody RmMtrProbeResult rmMtrProbeResult) + { + Map list = rmMtrProbeResultService.getLossRateByMtrClientId(rmMtrProbeResult); + return success(list); + } +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/RmMtrProbeResult.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/RmMtrProbeResult.java new file mode 100644 index 0000000..f7883cd --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/RmMtrProbeResult.java @@ -0,0 +1,50 @@ +package com.ruoyi.mtragent.domain; + +import com.ruoyi.common.core.annotation.Excel; +import com.ruoyi.common.core.web.domain.BaseEntity; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 网络mtr探测结果对象 rm_mtr_probe_result + * + * @author gyt + * @date 2025-11-20 + */ +@Data +public class RmMtrProbeResult extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** MTR客户端ID */ + @Excel(name = "MTR客户端ID") + private String mtrClientId; + + /** 客户端ID */ + @Excel(name = "客户端ID") + private String clientId; + + /** 公网IP地址 */ + @Excel(name = "公网IP地址") + private String publicIp; + + /** 丢包率(%) */ + @Excel(name = "丢包率(%)") + private BigDecimal packetLossRate; + /** 表名 */ + private String tableName; + /** 批量新增集合 */ + private List list; + /** 开始时间 */ + private String startTime; + /** 结束时间 */ + private String endTime; + + + +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/vo/MtrResultVo.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/vo/MtrResultVo.java new file mode 100644 index 0000000..50e6553 --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/domain/vo/MtrResultVo.java @@ -0,0 +1,15 @@ +package com.ruoyi.mtragent.domain.vo; + +import lombok.Data; + +@Data +public class MtrResultVo { + private String targetIp; // 目标IP + private Long policyId; // 策略ID + private double firstLossPercent; // 第一次探测丢包率 + private double finalLossPercent; // 最终丢包率 + private long timestamp; // 探测时间戳 + private boolean hasRetry; // 是否重试 + private String errorMsg; // 错误信息 + +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/handler/MessageHandler.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/handler/MessageHandler.java index 4a66abc..478bb0d 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/handler/MessageHandler.java +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/handler/MessageHandler.java @@ -5,10 +5,7 @@ import com.ruoyi.common.core.enums.MsgEnum; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.mtragent.domain.*; -import com.ruoyi.mtragent.domain.vo.MessageVo; -import com.ruoyi.mtragent.domain.vo.PolicyTypeVo; -import com.ruoyi.mtragent.domain.vo.RegisterMsgVo; -import com.ruoyi.mtragent.domain.vo.RspVo; +import com.ruoyi.mtragent.domain.vo.*; import com.ruoyi.mtragent.enums.AlarmTypeEnum; import com.ruoyi.mtragent.enums.PushMethodEnum; import com.ruoyi.mtragent.model.ProducerMode; @@ -28,6 +25,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import java.math.BigDecimal; import java.util.*; import java.util.function.Consumer; @@ -66,6 +64,10 @@ public class MessageHandler { private IRmMtrPolicyConfigService rmMtrPolicyConfigService; @Autowired private ProducerMode producerMode; + @Autowired + private IRmNetworkInterfaceService rmNetworkInterfaceService; + @Autowired + private IRmMtrProbeResultService rmMtrProbeResultService; /** @@ -80,7 +82,48 @@ public class MessageHandler { registerHandler(MsgEnum.获取最新策略.getValue(), this::handleNewPolicyMessage); registerHandler(MsgEnum.心跳上报.getValue(), this::handleHeartbeatMessage); registerHandler(MsgEnum.多公网IP探测.getValue(), this::handleNetWorkDelectMessage); + registerHandler(MsgEnum.MTR探测上报.getValue(), this::handleMtrDelectMessage); } + + private void handleMtrDelectMessage(DeviceMessage message) { + List mtrResultVoList = JsonDataParser.parseJsonData(message.getData(), MtrResultVo.class); + if(mtrResultVoList != null && !mtrResultVoList.isEmpty()){ + String mtrClientId = message.getClientId(); + List rmMtrProbeResultList = new ArrayList<>(); + for (MtrResultVo mtrResultVo : mtrResultVoList) { + if(mtrResultVo.getFinalLossPercent() != -1.0){ + // 时间戳转换 + long timestamp = mtrResultVo.getTimestamp(); + long millis = timestamp * 1000; + Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒 + RmMtrProbeResult rmMtrProbeResult = new RmMtrProbeResult(); + rmMtrProbeResult.setCreateTime(createTime); + // 拿到ip + String ip = mtrResultVo.getTargetIp(); + // 查询clientId + RmNetworkInterface networkInfo = new RmNetworkInterface(); + networkInfo.setPublicIp(ip); + networkInfo.setNewFlag(1); + List rmNetworkInterfaceList = rmNetworkInterfaceService.selectRmNetworkInterfaceList(networkInfo); + if(rmNetworkInterfaceList != null && !rmNetworkInterfaceList.isEmpty()){ + RmNetworkInterface rmNetworkInterface = rmNetworkInterfaceList.get(0); + rmMtrProbeResult.setClientId(rmNetworkInterface.getClientId()); + } + rmMtrProbeResult.setMtrClientId(mtrClientId); + rmMtrProbeResult.setPublicIp(ip); + rmMtrProbeResult.setPacketLossRate(new BigDecimal(mtrResultVo.getFinalLossPercent())); + rmMtrProbeResultList.add(rmMtrProbeResult); + }else{ + log.debug("探测失败,失败原因:{}", mtrResultVo.getErrorMsg()); + } + } + RmMtrProbeResult insertData = new RmMtrProbeResult(); + insertData.setList(rmMtrProbeResultList); + // 结果批量入库 + rmMtrProbeResultService.batchInsertRmMtrProbeResult(insertData); + } + } + private void handleRegisterMessage(DeviceMessage message) { MessageProducer messageProducer = new MessageProducer(); List interfaces = JsonDataParser.parseJsonData(message.getData(), RegisterMsgVo.class); diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/mapper/RmMtrProbeResultMapper.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/mapper/RmMtrProbeResultMapper.java new file mode 100644 index 0000000..aa86adf --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/mapper/RmMtrProbeResultMapper.java @@ -0,0 +1,71 @@ +package com.ruoyi.mtragent.mapper; + +import com.ruoyi.mtragent.domain.RmMtrProbeResult; + +import java.util.List; + +/** + * 网络mtr探测结果Mapper接口 + * + * @author gyt + * @date 2025-11-20 + */ +public interface RmMtrProbeResultMapper +{ + /** + * 查询网络mtr探测结果 + * + * @param id 网络mtr探测结果主键 + * @return 网络mtr探测结果 + */ + public RmMtrProbeResult selectRmMtrProbeResultById(Long id); + + /** + * 查询网络mtr探测结果列表 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 网络mtr探测结果集合 + */ + public List selectRmMtrProbeResultList(RmMtrProbeResult rmMtrProbeResult); + + /** + * 新增网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + public int insertRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult); + + /** + * 修改网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + public int updateRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult); + + /** + * 删除网络mtr探测结果 + * + * @param id 网络mtr探测结果主键 + * @return 结果 + */ + public int deleteRmMtrProbeResultById(Long id); + + /** + * 批量删除网络mtr探测结果 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteRmMtrProbeResultByIds(Long[] ids); + + void batchInsertRmMtrProbeResult(RmMtrProbeResult batchData); + + /** + * 分表查询 + * @param condition + * @return + */ + List selectByCondition(RmMtrProbeResult condition); +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrClientRegistrationService.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrClientRegistrationService.java index 69d9ef0..59b7fa1 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrClientRegistrationService.java +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrClientRegistrationService.java @@ -66,4 +66,5 @@ public interface IRmMtrClientRegistrationService * @return */ int addAgentUpdatePolicy(RmMtrClientRegistration rmMtrClientRegistration); + } diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrProbeResultService.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrProbeResultService.java new file mode 100644 index 0000000..3dbc79c --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/IRmMtrProbeResultService.java @@ -0,0 +1,72 @@ +package com.ruoyi.mtragent.service; + +import com.ruoyi.mtragent.domain.RmMtrProbeResult; + +import java.util.List; +import java.util.Map; + +/** + * 网络mtr探测结果Service接口 + * + * @author gyt + * @date 2025-11-20 + */ +public interface IRmMtrProbeResultService +{ + /** + * 查询网络mtr探测结果 + * + * @param id 网络mtr探测结果主键 + * @return 网络mtr探测结果 + */ + public RmMtrProbeResult selectRmMtrProbeResultById(Long id); + + /** + * 查询网络mtr探测结果列表 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 网络mtr探测结果集合 + */ + public List selectRmMtrProbeResultList(RmMtrProbeResult rmMtrProbeResult); + + /** + * 新增网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + public int insertRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult); + + /** + * 修改网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + public int updateRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult); + + /** + * 批量删除网络mtr探测结果 + * + * @param ids 需要删除的网络mtr探测结果主键集合 + * @return 结果 + */ + public int deleteRmMtrProbeResultByIds(Long[] ids); + + /** + * 删除网络mtr探测结果信息 + * + * @param id 网络mtr探测结果主键 + * @return 结果 + */ + public int deleteRmMtrProbeResultById(Long id); + + public void batchInsertRmMtrProbeResult(RmMtrProbeResult result); + + /** + * 查看丢包率趋势 + * @param rmMtrProbeResult + * @return + */ + Map getLossRateByMtrClientId(RmMtrProbeResult rmMtrProbeResult); +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrClientRegistrationServiceImpl.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrClientRegistrationServiceImpl.java index 238c56b..32657c8 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrClientRegistrationServiceImpl.java +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrClientRegistrationServiceImpl.java @@ -209,4 +209,5 @@ public class RmMtrClientRegistrationServiceImpl implements IRmMtrClientRegistrat } return 1; } + } diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrPolicyConfigServiceImpl.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrPolicyConfigServiceImpl.java index 0043c68..8cbd7f3 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrPolicyConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrPolicyConfigServiceImpl.java @@ -243,9 +243,8 @@ public class RmMtrPolicyConfigServiceImpl implements IRmMtrPolicyConfigService private List getServerIdsFromPolicy(RmMtrPolicyConfig policy) { List serverIds = new ArrayList<>(); if (policy.getServerGroup() != null) { - // 先还原换行符分割 - String serverGroup = policy.getServerGroup().replace(";", "\n"); - String[] ids = serverGroup.split("\\r?\\n"); + String serverGroup = policy.getServerGroup(); + String[] ids = serverGroup.split("\n"); for (String id : ids) { if (id != null && !id.trim().isEmpty()) { serverIds.add(id.trim()); diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrProbeResultServiceImpl.java b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrProbeResultServiceImpl.java new file mode 100644 index 0000000..2c029a1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/java/com/ruoyi/mtragent/service/impl/RmMtrProbeResultServiceImpl.java @@ -0,0 +1,219 @@ +package com.ruoyi.mtragent.service.impl; + +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.EchartsDataUtils; +import com.ruoyi.common.core.utils.TableSubUtil; +import com.ruoyi.mtragent.domain.RmMtrProbeResult; +import com.ruoyi.mtragent.mapper.RmMtrProbeResultMapper; +import com.ruoyi.mtragent.service.IRmMtrProbeResultService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 网络mtr探测结果Service业务层处理 + * + * @author gyt + * @date 2025-11-20 + */ +@Service +@Slf4j +public class RmMtrProbeResultServiceImpl implements IRmMtrProbeResultService +{ + @Autowired + private RmMtrProbeResultMapper rmMtrProbeResultMapper; + + private final static String TABLE_PREFIX = "rm_mtr_probe_result"; + + /** + * 查询网络mtr探测结果 + * + * @param id 网络mtr探测结果主键 + * @return 网络mtr探测结果 + */ + @Override + public RmMtrProbeResult selectRmMtrProbeResultById(Long id) + { + return rmMtrProbeResultMapper.selectRmMtrProbeResultById(id); + } + + /** + * 查询网络mtr探测结果列表 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 网络mtr探测结果 + */ + @Override + public List selectRmMtrProbeResultList(RmMtrProbeResult rmMtrProbeResult) + { + return rmMtrProbeResultMapper.selectRmMtrProbeResultList(rmMtrProbeResult); + } + + /** + * 新增网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + @Override + public int insertRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult) + { + Date createTime = rmMtrProbeResult.getCreateTime(); + String tableName = TableSubUtil.getTableName(createTime, TABLE_PREFIX); + return rmMtrProbeResultMapper.insertRmMtrProbeResult(rmMtrProbeResult); + } + + /** + * 修改网络mtr探测结果 + * + * @param rmMtrProbeResult 网络mtr探测结果 + * @return 结果 + */ + @Override + public int updateRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult) + { + rmMtrProbeResult.setUpdateTime(DateUtils.getNowDate()); + return rmMtrProbeResultMapper.updateRmMtrProbeResult(rmMtrProbeResult); + } + + /** + * 批量删除网络mtr探测结果 + * + * @param ids 需要删除的网络mtr探测结果主键 + * @return 结果 + */ + @Override + public int deleteRmMtrProbeResultByIds(Long[] ids) + { + return rmMtrProbeResultMapper.deleteRmMtrProbeResultByIds(ids); + } + + /** + * 删除网络mtr探测结果信息 + * + * @param id 网络mtr探测结果主键 + * @return 结果 + */ + @Override + public int deleteRmMtrProbeResultById(Long id) + { + return rmMtrProbeResultMapper.deleteRmMtrProbeResultById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) + public void batchInsertRmMtrProbeResult(RmMtrProbeResult rmMtrProbeResult) { + if (rmMtrProbeResult == null) { + return; + } + List dataList = rmMtrProbeResult.getList(); + if (dataList == null || dataList.isEmpty()) { + return; + } + + // 按表名分组批量插入 + Map> groupedData = dataList.stream() + .map(data -> { + try { + RmMtrProbeResult processed = new RmMtrProbeResult(); + BeanUtils.copyProperties(data, processed); + if (data.getCreateTime() == null) { + processed.setCreateTime(new Date()); + } + if(data.getUpdateTime() == null){ + processed.setUpdateTime(new Date()); + } + processed.setTableName(TableSubUtil.getTableName(data.getCreateTime(), TABLE_PREFIX)); + return processed; + } catch (Exception e) { + log.error("RmMtrProbeResult数据处理失败", e); + return null; + } + }) + .filter(Objects::nonNull) // 过滤掉处理失败的数据 + .collect(Collectors.groupingBy( + RmMtrProbeResult::getTableName, + LinkedHashMap::new, // 保持插入顺序 + Collectors.toList())); + + groupedData.forEach((tableName, list) -> { + try { + RmMtrProbeResult batchData = new RmMtrProbeResult(); + BeanUtils.copyProperties(rmMtrProbeResult, batchData); + batchData.setTableName(tableName); + batchData.setList(list); + rmMtrProbeResultMapper.batchInsertRmMtrProbeResult(batchData); + } catch (Exception e) { + log.error("表{}插入失败", tableName, e); + throw new RuntimeException("批量插入失败", e); + } + }); + } + + /** + * 分表查询探测结果 + * @param queryParam + * @return + */ + public List getListByTime(RmMtrProbeResult queryParam){ + // 获取涉及的表名 + Set tableNames = TableSubUtil.getTableNamesBetween( + queryParam.getStartTime(), + queryParam.getEndTime(), + TABLE_PREFIX + ); + + // 并行查询各表 + return tableNames.parallelStream() + .flatMap(tableName -> { + RmMtrProbeResult condition = new RmMtrProbeResult(); + condition.setTableName(tableName); + condition.setMtrClientId(queryParam.getMtrClientId()); + condition.setClientId(queryParam.getClientId()); + condition.setStartTime(queryParam.getStartTime()); + condition.setEndTime(queryParam.getEndTime()); + return rmMtrProbeResultMapper.selectByCondition(condition).stream(); + }) + .collect(Collectors.toList()); + } + + /** + * 查看丢包率趋势 + * @param rmMtrProbeResult + * @return + */ + @Override + public Map getLossRateByMtrClientId(RmMtrProbeResult rmMtrProbeResult) { + if(rmMtrProbeResult.getStartTime() == null && rmMtrProbeResult.getEndTime() == null){ + String[] timeRange = DateUtils.getTodayTimeRange(); + rmMtrProbeResult.setStartTime(timeRange[0]); + rmMtrProbeResult.setEndTime(timeRange[1]); + } + List list = getListByTime(rmMtrProbeResult); + if(list == null){ + list = new ArrayList<>(); + } + try { + Map> extractors = new LinkedHashMap<>(); + + extractors.put("packetLossRate", info -> + info != null && info.getPacketLossRate() != null ? + info.getPacketLossRate() : + 0); + Map resultMap = EchartsDataUtils.buildEchartsDataAutoPadding( + list, RmMtrProbeResult::getCreateTime, extractors, rmMtrProbeResult.getStartTime(), rmMtrProbeResult.getEndTime() + ); + return resultMap; + } catch (Exception e){ + e.printStackTrace(); + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-mtragent/src/main/resources/bootstrap.yml index d45aafd..d4e822d 100644 --- a/ruoyi-modules/ruoyi-mtragent/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-mtragent/src/main/resources/bootstrap.yml @@ -14,16 +14,18 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: # 配置中心地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-mtragent/src/main/resources/mapper/mtragent/RmMtrProbeResultMapper.xml b/ruoyi-modules/ruoyi-mtragent/src/main/resources/mapper/mtragent/RmMtrProbeResultMapper.xml new file mode 100644 index 0000000..97eb3d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-mtragent/src/main/resources/mapper/mtragent/RmMtrProbeResultMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + select id, mtr_client_id, client_id, public_ip, packet_loss_rate, create_time, update_time, create_by, update_by from rm_mtr_probe_result + + + + + + + + insert into rm_mtr_probe_result + + mtr_client_id, + client_id, + public_ip, + packet_loss_rate, + create_time, + update_time, + create_by, + update_by, + + + #{mtrClientId}, + #{clientId}, + #{publicIp}, + #{packetLossRate}, + #{createTime}, + #{updateTime}, + #{createBy}, + #{updateBy}, + + + + + update rm_mtr_probe_result + + mtr_client_id = #{mtrClientId}, + client_id = #{clientId}, + public_ip = #{publicIp}, + packet_loss_rate = #{packetLossRate}, + create_time = #{createTime}, + update_time = #{updateTime}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from rm_mtr_probe_result where id = #{id} + + + + delete from rm_mtr_probe_result where id in + + #{id} + + + + INSERT INTO ${tableName} + ( + mtr_client_id, + client_id, + public_ip, + packet_loss_rate, + create_time, + update_time + ) VALUES + + ( + #{item.mtrClientId}, + #{item.clientId}, + #{item.publicIp}, + #{item.packetLossRate}, + #{item.createTime}, + #{item.updateTime} + ) + + + + + \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java index 1a37350..d09463d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EpsInitialTrafficDataMapper.java @@ -16,6 +16,12 @@ public interface EpsInitialTrafficDataMapper { * @param tableName 表名 */ void createEpsInitialTrafficTable(@Param("tableName") String tableName); + + /** + * 创建置顶名称的mtr探测结果表 + * @param tableName + */ + void createMtrProbeResultTable(@Param("tableName") String tableName); /** * 单条插入数据 * @param data 流量数据 @@ -49,4 +55,5 @@ public interface EpsInitialTrafficDataMapper { int updateMachineTraffic(EpsInitialTrafficData epsInitialTrafficData); List getTrafficListByClientIds(EpsInitialTrafficData condition); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java index dd85b43..5a10f7f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EpsInitialTrafficDataServiceImpl.java @@ -64,6 +64,8 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe createTrafficDetailsTable(year, month); // 创建流量初始表 createTrafficStatsTable(year, month); + // 创建mtr探测丢包结果表 + createMtrProbeResultTable(year, month); } private void createTrafficDetailsTable(int year, int month) { @@ -78,6 +80,12 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe }); } + private void createMtrProbeResultTable(int year, int month) { + createRangeTables(year, month, "rm_mtr_probe_result", (tableName) -> { + epsInitialTrafficDataMapper.createMtrProbeResultTable(tableName); + }); + } + /** * 通用创建表方法 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index 9471621..50c0dfa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -13,17 +13,19 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 服务注册地址 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # 配置中心地址 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml index 59c74b7..929e305 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml @@ -66,6 +66,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" INDEX idx_name_time (`name`,create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='初始带宽流量表'; + + CREATE TABLE IF NOT EXISTS ${tableName} ( + id BIGINT(20) AUTO_INCREMENT COMMENT '主键ID', + mtr_client_id VARCHAR(200) COMMENT 'MTR客户端ID', + client_id VARCHAR(200) COMMENT '客户端ID', + public_ip VARCHAR(45) COMMENT '公网IP地址', + packet_loss_rate DECIMAL(5,2) COMMENT '丢包率(%)', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + create_by VARCHAR(64) COMMENT '创建人', + update_by VARCHAR(64) COMMENT '更新人', + PRIMARY KEY (id), + UNIQUE KEY uk_probe_record (mtr_client_id, client_id, create_time), + INDEX idx_mtr_client_id (mtr_client_id, create_time) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='网络mtr探测结果表'; + diff --git a/ruoyi-rocketmq/src/main/resources/bootstrap.yml b/ruoyi-rocketmq/src/main/resources/bootstrap.yml index e6a6bbb..f7709be 100644 --- a/ruoyi-rocketmq/src/main/resources/bootstrap.yml +++ b/ruoyi-rocketmq/src/main/resources/bootstrap.yml @@ -14,16 +14,18 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: ${spring.cloud.nacos.config.username} -# password: ${spring.cloud.nacos.config.password} + namespace: ${spring.cloud.nacos.config.namespace} + username: ${spring.cloud.nacos.config.username} + password: ${spring.cloud.nacos.config.password} config: # 配置中心地址 - server-addr: 127.0.0.1:8848 + server-addr: 172.16.15.52:8848 # server-addr: 172.16.15.103:8848 -# username: nacos -# password: nacos + namespace: saas-local + username: nacos + password: nacos # 配置文件格式 file-extension: yml # 共享配置