From 23671e12d87ba6f9d506d0cb0ccb72f7786c6b0b Mon Sep 17 00:00:00 2001 From: pf5ub3a78 <1162620239@qq.com> Date: Sun, 2 Nov 2025 21:27:24 +0800 Subject: [PATCH] SOA2 --- ServiceMonitor.java | 108 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 ServiceMonitor.java diff --git a/ServiceMonitor.java b/ServiceMonitor.java new file mode 100644 index 0000000..c1182db --- /dev/null +++ b/ServiceMonitor.java @@ -0,0 +1,108 @@ +package com.soa.monitoring; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +/** + * 服务监控组件 - 负责监控服务的性能、可用性和错误率 + */ +public class ServiceMonitor { + private static final Logger logger = LogManager.getLogger(ServiceMonitor.class); + private static ServiceMonitor instance; + private final Map metricsMap = new ConcurrentHashMap<>(); + + private ServiceMonitor() {} + + /** + * 获取监控器单例 + */ + public static synchronized ServiceMonitor getInstance() { + if (instance == null) { + instance = new ServiceMonitor(); + } + return instance; + } + + /** + * 记录服务调用开始 + */ + public long startMonitoring(String serviceName) { + return System.currentTimeMillis(); + } + + /** + * 记录服务调用结束 + */ + public void endMonitoring(String serviceName, long startTime, boolean success) { + long executionTime = System.currentTimeMillis() - startTime; + + ServiceMetrics metrics = metricsMap.computeIfAbsent(serviceName, k -> new ServiceMetrics()); + metrics.recordCall(executionTime, success); + + logger.info("Service: {} - Execution time: {}ms, Status: {}", + serviceName, executionTime, success ? "SUCCESS" : "FAILED"); + + // 检查性能阈值 + if (executionTime > 1000) { // 1秒阈值 + logger.warn("Service {} performance warning: execution time {}ms exceeds threshold", + serviceName, executionTime); + } + } + + /** + * 获取服务指标 + */ + public ServiceMetrics getServiceMetrics(String serviceName) { + return metricsMap.get(serviceName); + } + + /** + * 打印所有服务的监控报告 + */ + public void printMonitoringReport() { + logger.info("===== SERVICE MONITORING REPORT ====="); + for (Map.Entry entry : metricsMap.entrySet()) { + String serviceName = entry.getKey(); + ServiceMetrics metrics = entry.getValue(); + logger.info("Service: {}", serviceName); + logger.info(" Total calls: {}", metrics.getTotalCalls()); + logger.info(" Successful calls: {}", metrics.getSuccessfulCalls()); + logger.info(" Failed calls: {}", metrics.getFailedCalls()); + logger.info(" Avg response time: {}ms", metrics.getAvgResponseTime()); + logger.info(" Error rate: {}%", metrics.getErrorRate()); + } + logger.info("==================================="); + } + + /** + * 服务指标内部类 + */ + public static class ServiceMetrics { + private long totalCalls = 0; + private long successfulCalls = 0; + private long failedCalls = 0; + private long totalResponseTime = 0; + + public synchronized void recordCall(long executionTime, boolean success) { + totalCalls++; + totalResponseTime += executionTime; + if (success) { + successfulCalls++; + } else { + failedCalls++; + } + } + + public long getTotalCalls() { return totalCalls; } + public long getSuccessfulCalls() { return successfulCalls; } + public long getFailedCalls() { return failedCalls; } + public double getAvgResponseTime() { + return totalCalls > 0 ? (double) totalResponseTime / totalCalls : 0; + } + public double getErrorRate() { + return totalCalls > 0 ? (double) failedCalls / totalCalls * 100 : 0; + } + } +} \ No newline at end of file