Compare commits
No commits in common. 'master' and 'main' have entirely different histories.
@ -1,167 +0,0 @@
|
|||||||
/**
|
|
||||||
* 进阶题测试类
|
|
||||||
* 测试动态配置管理系统和边车模式功能
|
|
||||||
*/
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class AdvancedExampleTest {
|
|
||||||
// 辅助方法:重复字符
|
|
||||||
private static String repeatChar(char c, int count) {
|
|
||||||
StringBuilder sb = new StringBuilder(count);
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
sb.append(c);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
public static void main(String[] args) {
|
|
||||||
System.out.println("=== 进阶题测试开始 ===\n");
|
|
||||||
|
|
||||||
// 测试动态配置管理系统
|
|
||||||
testDynamicConfigManager();
|
|
||||||
|
|
||||||
System.out.println("\n" + repeatChar('-', 50) + "\n");
|
|
||||||
|
|
||||||
// 测试边车模式
|
|
||||||
testSidecar();
|
|
||||||
|
|
||||||
System.out.println("\n=== 进阶题测试完成 ===");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试动态配置管理系统
|
|
||||||
private static void testDynamicConfigManager() {
|
|
||||||
System.out.println("1. 测试动态配置管理系统功能");
|
|
||||||
|
|
||||||
// 获取配置管理器实例
|
|
||||||
DynamicConfigManager configManager = DynamicConfigManager.getInstance();
|
|
||||||
|
|
||||||
// 添加配置监听器
|
|
||||||
configManager.addListener(new DynamicConfigManager.ConfigChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onConfigChange(String key, Object oldValue, Object newValue) {
|
|
||||||
System.out.println("监听器收到配置变更通知: ");
|
|
||||||
System.out.println(" 键: " + key);
|
|
||||||
System.out.println(" 旧值: " + oldValue);
|
|
||||||
System.out.println(" 新值: " + newValue);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 设置单个配置
|
|
||||||
System.out.println("\n设置单个配置:");
|
|
||||||
configManager.setConfig("server.port", 8080);
|
|
||||||
configManager.setConfig("database.url", "jdbc:mysql://localhost:3306/test");
|
|
||||||
configManager.setConfig("logging.level", "INFO");
|
|
||||||
configManager.setConfig("feature.cache.enabled", true);
|
|
||||||
|
|
||||||
// 获取配置
|
|
||||||
System.out.println("\n获取配置值:");
|
|
||||||
int port = configManager.getConfig("server.port", 8080);
|
|
||||||
String dbUrl = configManager.getConfig("database.url", "");
|
|
||||||
String logLevel = configManager.getConfig("logging.level", "DEBUG");
|
|
||||||
boolean cacheEnabled = configManager.getConfig("feature.cache.enabled", false);
|
|
||||||
String nonExistent = configManager.getConfig("non.existent", "默认值");
|
|
||||||
|
|
||||||
System.out.println("server.port = " + port);
|
|
||||||
System.out.println("database.url = " + dbUrl);
|
|
||||||
System.out.println("logging.level = " + logLevel);
|
|
||||||
System.out.println("feature.cache.enabled = " + cacheEnabled);
|
|
||||||
System.out.println("non.existent = " + nonExistent);
|
|
||||||
|
|
||||||
// 热更新配置测试
|
|
||||||
System.out.println("\n测试配置热更新:");
|
|
||||||
System.out.println("更新前的日志级别: " + configManager.getConfig("logging.level", "DEBUG"));
|
|
||||||
configManager.setConfig("logging.level", "DEBUG"); // 触发监听器
|
|
||||||
System.out.println("更新后的日志级别: " + configManager.getConfig("logging.level", "DEBUG"));
|
|
||||||
|
|
||||||
// 批量更新配置
|
|
||||||
System.out.println("\n批量更新配置:");
|
|
||||||
Map<String, Object> batchConfigs = new HashMap<>();
|
|
||||||
batchConfigs.put("cache.size", 1000);
|
|
||||||
batchConfigs.put("timeout.seconds", 30);
|
|
||||||
batchConfigs.put("retries.max", 3);
|
|
||||||
configManager.setConfigs(batchConfigs);
|
|
||||||
|
|
||||||
// 查看所有配置
|
|
||||||
System.out.println("\n当前所有配置键:");
|
|
||||||
System.out.println(configManager.getAllKeys());
|
|
||||||
System.out.println("配置总数: " + configManager.size());
|
|
||||||
|
|
||||||
// 移除配置
|
|
||||||
System.out.println("\n移除配置:");
|
|
||||||
configManager.removeConfig("cache.size");
|
|
||||||
System.out.println("移除后配置总数: " + configManager.size());
|
|
||||||
System.out.println("cache.size 是否存在: " + configManager.containsKey("cache.size"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试边车模式
|
|
||||||
private static void testSidecar() {
|
|
||||||
System.out.println("2. 测试边车模式功能");
|
|
||||||
|
|
||||||
// 创建边车实例
|
|
||||||
Sidecar sidecar = new Sidecar("test-app-v1");
|
|
||||||
|
|
||||||
// 添加边车功能
|
|
||||||
System.out.println("\n添加边车功能:");
|
|
||||||
sidecar.addFeature(new Sidecar.LoggingFeature());
|
|
||||||
sidecar.addFeature(new Sidecar.MonitoringFeature());
|
|
||||||
|
|
||||||
// 添加自定义功能
|
|
||||||
sidecar.addFeature(new Sidecar.SidecarFeature() {
|
|
||||||
@Override
|
|
||||||
public String getName() { return "安全检查"; }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void start() { System.out.println("安全检查功能已启动"); }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void stop() { System.out.println("安全检查功能已停止"); }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleRequest(Sidecar.RequestContext context) {
|
|
||||||
System.out.println("安全检查: 请求 " + context.getRequestId() + " 路径 " + context.getPath());
|
|
||||||
// 模拟安全检查
|
|
||||||
if (context.getPath().contains("admin") && !context.getPath().startsWith("/api/auth")) {
|
|
||||||
context.markError("未授权访问管理路径");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 启动边车
|
|
||||||
System.out.println("\n启动边车:");
|
|
||||||
sidecar.start();
|
|
||||||
|
|
||||||
// 测试同步请求处理
|
|
||||||
System.out.println("\n测试同步请求处理:");
|
|
||||||
sidecar.handleRequestSync("req-001", "/api/users/list");
|
|
||||||
sidecar.handleRequestSync("req-002", "/api/products/123");
|
|
||||||
|
|
||||||
// 测试未授权请求(应该被安全检查拦截)
|
|
||||||
System.out.println("\n测试未授权请求:");
|
|
||||||
sidecar.handleRequestSync("req-003", "/api/admin/dashboard");
|
|
||||||
|
|
||||||
// 测试异步请求处理
|
|
||||||
System.out.println("\n测试异步请求处理:");
|
|
||||||
for (int i = 4; i <= 10; i++) {
|
|
||||||
sidecar.handleRequestAsync("req-" + String.format("%03d", i), "/api/async/test/" + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 等待异步请求处理完成
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查看统计信息
|
|
||||||
System.out.println("\n边车统计信息:");
|
|
||||||
System.out.println(sidecar.getStats());
|
|
||||||
|
|
||||||
// 停止边车
|
|
||||||
System.out.println("\n停止边车:");
|
|
||||||
sidecar.stop();
|
|
||||||
|
|
||||||
// 测试边车停止后的请求处理
|
|
||||||
System.out.println("\n测试边车停止后的请求处理:");
|
|
||||||
sidecar.handleRequestSync("req-011", "/api/test/stopped");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,132 +0,0 @@
|
|||||||
/**
|
|
||||||
* 基础题测试类
|
|
||||||
* 测试服务注册中心和断路器功能
|
|
||||||
*/
|
|
||||||
public class BasicExampleTest {
|
|
||||||
// 辅助方法:重复字符
|
|
||||||
private static String repeatChar(char c, int count) {
|
|
||||||
StringBuilder sb = new StringBuilder(count);
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
sb.append(c);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
System.out.println("=== 基础题测试开始 ===\n");
|
|
||||||
|
|
||||||
// 测试服务注册中心
|
|
||||||
testServiceRegistry();
|
|
||||||
|
|
||||||
System.out.println("\n" + repeatChar('-', 50) + "\n");
|
|
||||||
|
|
||||||
// 测试断路器
|
|
||||||
testCircuitBreaker();
|
|
||||||
|
|
||||||
System.out.println("\n=== 基础题测试完成 ===");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试服务注册中心
|
|
||||||
private static void testServiceRegistry() {
|
|
||||||
System.out.println("1. 测试服务注册中心功能");
|
|
||||||
|
|
||||||
// 获取服务注册中心实例
|
|
||||||
ServiceRegistry registry = ServiceRegistry.getInstance();
|
|
||||||
|
|
||||||
// 注册服务
|
|
||||||
System.out.println("\n注册服务实例:");
|
|
||||||
registry.register("userService", "192.168.1.1", 8080);
|
|
||||||
registry.register("userService", "192.168.1.2", 8080);
|
|
||||||
registry.register("orderService", "192.168.1.3", 8081);
|
|
||||||
|
|
||||||
// 发现服务
|
|
||||||
System.out.println("\n发现所有服务:");
|
|
||||||
System.out.println("已注册服务列表: " + registry.getAllServices());
|
|
||||||
|
|
||||||
// 测试服务发现
|
|
||||||
System.out.println("\n发现特定服务实例:");
|
|
||||||
java.util.List<ServiceRegistry.ServiceInstance> userInstances = registry.discover("userService");
|
|
||||||
System.out.println("userService 实例: " + userInstances);
|
|
||||||
|
|
||||||
java.util.List<ServiceRegistry.ServiceInstance> orderInstances = registry.discover("orderService");
|
|
||||||
System.out.println("orderService 实例: " + orderInstances);
|
|
||||||
|
|
||||||
// 测试获取随机实例
|
|
||||||
System.out.println("\n获取随机服务实例:");
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
ServiceRegistry.ServiceInstance instance = registry.getRandomInstance("userService");
|
|
||||||
System.out.println("随机选择 userService 实例[" + i + "]: " + instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试注销服务
|
|
||||||
System.out.println("\n注销服务实例:");
|
|
||||||
registry.deregister("userService", "192.168.1.1", 8080);
|
|
||||||
|
|
||||||
// 检查注销后的服务
|
|
||||||
System.out.println("\n注销后的 userService 实例: ");
|
|
||||||
userInstances = registry.discover("userService");
|
|
||||||
System.out.println(userInstances);
|
|
||||||
|
|
||||||
// 测试不存在的服务
|
|
||||||
System.out.println("\n测试不存在的服务:");
|
|
||||||
java.util.List<ServiceRegistry.ServiceInstance> nonExistent = registry.discover("paymentService");
|
|
||||||
System.out.println("不存在的服务发现结果: " + nonExistent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试断路器
|
|
||||||
private static void testCircuitBreaker() {
|
|
||||||
System.out.println("2. 测试断路器功能");
|
|
||||||
|
|
||||||
// 创建断路器实例(简化配置以便快速测试)
|
|
||||||
CircuitBreaker breaker = new CircuitBreaker("testService", 3, 2000, 1);
|
|
||||||
|
|
||||||
System.out.println("\n初始状态: " + breaker.getState());
|
|
||||||
|
|
||||||
// 测试失败触发开路
|
|
||||||
System.out.println("\n测试失败触发开路:");
|
|
||||||
for (int i = 1; i <= 4; i++) {
|
|
||||||
boolean allowed = breaker.allowRequest();
|
|
||||||
System.out.println("请求 " + i + " 允许通过: " + allowed + ", 当前状态: " + breaker.getState());
|
|
||||||
if (allowed) {
|
|
||||||
// 模拟服务调用失败
|
|
||||||
breaker.recordFailure();
|
|
||||||
System.out.println(" 记录失败,失败计数: " + breaker.getFailureCount());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试开路状态拒绝请求
|
|
||||||
System.out.println("\n测试开路状态拒绝请求:");
|
|
||||||
for (int i = 1; i <= 3; i++) {
|
|
||||||
boolean allowed = breaker.allowRequest();
|
|
||||||
System.out.println("开路状态请求 " + i + " 允许通过: " + allowed + ", 当前状态: " + breaker.getState());
|
|
||||||
try {
|
|
||||||
Thread.sleep(500);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 等待超时进入半开状态
|
|
||||||
System.out.println("\n等待超时进入半开状态...");
|
|
||||||
try {
|
|
||||||
Thread.sleep(2500); // 等待超过重置时间
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试半开状态下成功请求
|
|
||||||
System.out.println("\n测试半开状态下成功请求:");
|
|
||||||
boolean allowed = breaker.allowRequest();
|
|
||||||
System.out.println("半开状态请求允许通过: " + allowed + ", 当前状态: " + breaker.getState());
|
|
||||||
if (allowed) {
|
|
||||||
// 模拟服务调用成功
|
|
||||||
breaker.recordSuccess();
|
|
||||||
System.out.println(" 记录成功,断路器状态: " + breaker.getState());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 测试重置断路器
|
|
||||||
System.out.println("\n测试重置断路器:");
|
|
||||||
breaker.reset();
|
|
||||||
System.out.println("重置后的状态: " + breaker.getState() + ", 失败计数: " + breaker.getFailureCount());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,194 +0,0 @@
|
|||||||
/**
|
|
||||||
* 挑战题测试类
|
|
||||||
* 测试微服务治理框架和云原生应用生命周期管理系统
|
|
||||||
*/
|
|
||||||
public class ChallengeExampleTest {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
System.out.println("========== 开始测试挑战题 ==========");
|
|
||||||
|
|
||||||
// 测试微服务治理框架
|
|
||||||
testMicroServiceGovernance();
|
|
||||||
|
|
||||||
// 测试云原生应用生命周期管理系统
|
|
||||||
testCloudNativeLifecycleManager();
|
|
||||||
|
|
||||||
System.out.println("========== 挑战题测试完成 ==========");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试微服务治理框架
|
|
||||||
*/
|
|
||||||
private static void testMicroServiceGovernance() {
|
|
||||||
System.out.println("\n1. 测试微服务治理框架:");
|
|
||||||
|
|
||||||
// 获取治理框架实例
|
|
||||||
MicroServiceGovernance governance = MicroServiceGovernance.getInstance();
|
|
||||||
|
|
||||||
// 注册服务
|
|
||||||
System.out.println("\n1.1 注册服务:");
|
|
||||||
governance.registerService("user-service", "192.168.1.101", 8080);
|
|
||||||
governance.registerService("user-service", "192.168.1.102", 8080);
|
|
||||||
governance.registerService("order-service", "192.168.1.201", 8081);
|
|
||||||
governance.registerService("payment-service", "192.168.1.301", 8082);
|
|
||||||
|
|
||||||
// 列出已注册的服务
|
|
||||||
System.out.println("\n1.2 已注册的服务:");
|
|
||||||
governance.listServices().forEach(service -> {
|
|
||||||
System.out.println(service);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 测试服务调用(正常情况)
|
|
||||||
System.out.println("\n1.3 测试服务调用(正常情况):");
|
|
||||||
for (int i = 0; i < 5; i++) {
|
|
||||||
String result = governance.callService("user-service", "GET", "/api/users" + i);
|
|
||||||
System.out.println("调用结果:" + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟服务故障
|
|
||||||
System.out.println("\n1.4 模拟服务故障:");
|
|
||||||
governance.simulateServiceFailure("user-service", "192.168.1.101", 8080, true);
|
|
||||||
|
|
||||||
// 测试断路器功能
|
|
||||||
System.out.println("\n1.5 测试断路器功能:");
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
try {
|
|
||||||
String result = governance.callService("user-service", "GET", "/api/users/faulty" + i);
|
|
||||||
System.out.println("调用结果:" + result);
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("调用异常:" + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注销服务
|
|
||||||
System.out.println("\n1.6 注销服务:");
|
|
||||||
governance.deregisterService("order-service", "192.168.1.201", 8081);
|
|
||||||
System.out.println("注销后服务列表:");
|
|
||||||
governance.listServices().forEach(service -> {
|
|
||||||
System.out.println(service);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 显示治理统计信息
|
|
||||||
System.out.println("\n1.7 治理统计信息:");
|
|
||||||
governance.printGovernanceStats();
|
|
||||||
|
|
||||||
System.out.println("\n微服务治理框架测试完成");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 测试云原生应用生命周期管理系统
|
|
||||||
*/
|
|
||||||
private static void testCloudNativeLifecycleManager() {
|
|
||||||
System.out.println("\n2. 测试云原生应用生命周期管理系统:");
|
|
||||||
|
|
||||||
// 获取生命周期管理器实例
|
|
||||||
CloudNativeLifecycleManager lifecycleManager = CloudNativeLifecycleManager.getInstance();
|
|
||||||
|
|
||||||
// 添加事件监听器
|
|
||||||
lifecycleManager.addEventListener(new CloudNativeLifecycleManager.LifecycleEventListener() {
|
|
||||||
@Override
|
|
||||||
public void onApplicationCreated(CloudNativeLifecycleManager.Application app) {
|
|
||||||
System.out.println("事件:应用已创建 - ID: " + app.getId() + ", 名称: " + app.getConfig().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onApplicationDeployed(CloudNativeLifecycleManager.Application app) {
|
|
||||||
System.out.println("事件:应用已部署 - ID: " + app.getId() + ", 状态: " + app.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onApplicationScaled(CloudNativeLifecycleManager.Application app, int oldReplicas, int newReplicas) {
|
|
||||||
System.out.println("事件:应用已扩展 - ID: " + app.getId() + ", 从 " + oldReplicas + " 到 " + newReplicas + " 副本");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onApplicationUpdated(CloudNativeLifecycleManager.Application app, CloudNativeLifecycleManager.ApplicationConfig oldConfig) {
|
|
||||||
System.out.println("事件:应用已更新 - ID: " + app.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onApplicationDestroyed(String appId) {
|
|
||||||
System.out.println("事件:应用已销毁 - ID: " + appId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 显示初始资源状态
|
|
||||||
System.out.println("\n2.1 初始资源状态:");
|
|
||||||
lifecycleManager.getResourceStatus().forEach((resource, amount) -> {
|
|
||||||
System.out.println(resource + ": " + amount);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 创建应用配置
|
|
||||||
System.out.println("\n2.2 创建应用:");
|
|
||||||
CloudNativeLifecycleManager.ApplicationConfig config1 = new CloudNativeLifecycleManager.ApplicationConfig("nginx-app", "nginx:latest");
|
|
||||||
config1.setReplicas(2);
|
|
||||||
config1.getEnvVars().put("ENV", "production");
|
|
||||||
config1.getResources().put("cpu", 1);
|
|
||||||
config1.getResources().put("memory", 1024);
|
|
||||||
config1.getPorts().add(new CloudNativeLifecycleManager.PortMapping(80, 8080, "TCP"));
|
|
||||||
|
|
||||||
CloudNativeLifecycleManager.Application app1 = lifecycleManager.createApplication(config1);
|
|
||||||
|
|
||||||
CloudNativeLifecycleManager.ApplicationConfig config2 = new CloudNativeLifecycleManager.ApplicationConfig("redis-app", "redis:latest");
|
|
||||||
config2.setReplicas(1);
|
|
||||||
config2.getResources().put("cpu", 1);
|
|
||||||
config2.getResources().put("memory", 2048);
|
|
||||||
config2.getPorts().add(new CloudNativeLifecycleManager.PortMapping(6379, 6379, "TCP"));
|
|
||||||
|
|
||||||
CloudNativeLifecycleManager.Application app2 = lifecycleManager.createApplication(config2);
|
|
||||||
|
|
||||||
// 部署应用
|
|
||||||
System.out.println("\n2.3 部署应用:");
|
|
||||||
lifecycleManager.deployApplication(app1.getId());
|
|
||||||
lifecycleManager.deployApplication(app2.getId());
|
|
||||||
|
|
||||||
// 显示应用列表
|
|
||||||
System.out.println("\n2.4 应用列表:");
|
|
||||||
for (CloudNativeLifecycleManager.Application app : lifecycleManager.getApplications()) {
|
|
||||||
System.out.println("ID: " + app.getId() + ", 名称: " + app.getConfig().getName() + ", 状态: " + app.getStatus() + ", 副本数: " + app.getPods().size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 扩展应用
|
|
||||||
System.out.println("\n2.5 扩展应用:");
|
|
||||||
lifecycleManager.scaleApplication(app1.getId(), 3);
|
|
||||||
|
|
||||||
// 更新应用配置
|
|
||||||
System.out.println("\n2.6 更新应用配置:");
|
|
||||||
CloudNativeLifecycleManager.ApplicationConfig updatedConfig = new CloudNativeLifecycleManager.ApplicationConfig("nginx-app-updated", "nginx:1.21");
|
|
||||||
updatedConfig.setReplicas(4);
|
|
||||||
updatedConfig.getEnvVars().put("ENV", "development");
|
|
||||||
updatedConfig.getResources().put("cpu", 1);
|
|
||||||
updatedConfig.getResources().put("memory", 1536);
|
|
||||||
updatedConfig.getPorts().add(new CloudNativeLifecycleManager.PortMapping(80, 8081, "TCP"));
|
|
||||||
|
|
||||||
lifecycleManager.updateApplication(app1.getId(), updatedConfig);
|
|
||||||
|
|
||||||
// 显示更新后的应用详情
|
|
||||||
System.out.println("\n2.7 更新后的应用详情:");
|
|
||||||
CloudNativeLifecycleManager.Application updatedApp = lifecycleManager.getApplication(app1.getId());
|
|
||||||
System.out.println("ID: " + updatedApp.getId());
|
|
||||||
System.out.println("名称: " + updatedApp.getConfig().getName());
|
|
||||||
System.out.println("镜像: " + updatedApp.getConfig().getImage());
|
|
||||||
System.out.println("副本数: " + updatedApp.getPods().size());
|
|
||||||
System.out.println("状态: " + updatedApp.getStatus());
|
|
||||||
System.out.println("环境变量: " + updatedApp.getConfig().getEnvVars());
|
|
||||||
System.out.println("端口: " + updatedApp.getConfig().getPorts());
|
|
||||||
|
|
||||||
// 销毁应用
|
|
||||||
System.out.println("\n2.8 销毁应用:");
|
|
||||||
lifecycleManager.destroyApplication(app1.getId());
|
|
||||||
|
|
||||||
// 显示最终应用列表和资源状态
|
|
||||||
System.out.println("\n2.9 最终应用列表:");
|
|
||||||
for (CloudNativeLifecycleManager.Application app : lifecycleManager.getApplications()) {
|
|
||||||
System.out.println("ID: " + app.getId() + ", 名称: " + app.getConfig().getName() + ", 状态: " + app.getStatus());
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println("\n2.10 最终资源状态:");
|
|
||||||
lifecycleManager.getResourceStatus().forEach((resource, amount) -> {
|
|
||||||
System.out.println(resource + ": " + amount);
|
|
||||||
});
|
|
||||||
|
|
||||||
System.out.println("\n云原生应用生命周期管理系统测试完成");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,496 +0,0 @@
|
|||||||
/**
|
|
||||||
* 微服务治理框架
|
|
||||||
* 包含服务发现、负载均衡和熔断降级功能
|
|
||||||
*/
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
public class MicroServiceGovernance {
|
|
||||||
// 服务注册中心组件
|
|
||||||
private final ServiceRegistry serviceRegistry;
|
|
||||||
// 负载均衡器映射
|
|
||||||
private final Map<String, LoadBalancer> loadBalancers;
|
|
||||||
// 断路器映射
|
|
||||||
private final Map<String, CircuitBreaker> circuitBreakers;
|
|
||||||
// 故障服务列表
|
|
||||||
private final Map<String, Boolean> faultyServices = new ConcurrentHashMap<>();
|
|
||||||
// 服务调用统计
|
|
||||||
private final Map<String, CallStats> callStats = new ConcurrentHashMap<>();
|
|
||||||
// 单例实例
|
|
||||||
private static volatile MicroServiceGovernance instance;
|
|
||||||
|
|
||||||
private MicroServiceGovernance() {
|
|
||||||
this.serviceRegistry = new ServiceRegistry();
|
|
||||||
this.loadBalancers = new ConcurrentHashMap<>();
|
|
||||||
this.circuitBreakers = new ConcurrentHashMap<>();
|
|
||||||
System.out.println("微服务治理框架初始化完成");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取单例实例
|
|
||||||
public static MicroServiceGovernance getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
synchronized (MicroServiceGovernance.class) {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new MicroServiceGovernance();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务注册
|
|
||||||
public void registerService(String serviceName, String host, int port) {
|
|
||||||
serviceRegistry.register(serviceName, host, port);
|
|
||||||
// 为新服务初始化负载均衡器
|
|
||||||
getLoadBalancer(serviceName);
|
|
||||||
// 为新服务初始化断路器
|
|
||||||
getCircuitBreaker(serviceName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务注销
|
|
||||||
public void deregisterService(String serviceName, String host, int port) {
|
|
||||||
serviceRegistry.deregister(serviceName, host, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取负载均衡器
|
|
||||||
private LoadBalancer getLoadBalancer(String serviceName) {
|
|
||||||
return loadBalancers.computeIfAbsent(serviceName, name -> {
|
|
||||||
LoadBalancer balancer = new LoadBalancer(name);
|
|
||||||
System.out.println("为服务 " + name + " 创建负载均衡器");
|
|
||||||
return balancer;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取断路器
|
|
||||||
private CircuitBreaker getCircuitBreaker(String serviceName) {
|
|
||||||
return circuitBreakers.computeIfAbsent(serviceName, name -> {
|
|
||||||
CircuitBreaker breaker = new CircuitBreaker(name, 5, 10000, 2);
|
|
||||||
System.out.println("为服务 " + name + " 创建断路器");
|
|
||||||
return breaker;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 调用服务(适配测试类的方法签名)
|
|
||||||
public String callService(String serviceName, String method, String path) {
|
|
||||||
// 创建一个简单的参数映射
|
|
||||||
Map<String, String> params = new HashMap<>();
|
|
||||||
params.put("path", path);
|
|
||||||
params.put("timestamp", String.valueOf(System.currentTimeMillis()));
|
|
||||||
|
|
||||||
return callServiceInternal(serviceName, method, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务调用(集成了服务发现、负载均衡和熔断降级)
|
|
||||||
public ServiceCallResult callService(String serviceName, String path, Map<String, String> params) {
|
|
||||||
// 获取断路器
|
|
||||||
CircuitBreaker circuitBreaker = getCircuitBreaker(serviceName);
|
|
||||||
|
|
||||||
// 检查断路器状态
|
|
||||||
if (!circuitBreaker.allowRequest()) {
|
|
||||||
System.out.println("服务调用被断路器拒绝: " + serviceName + " (状态: " + circuitBreaker.getState() + ")");
|
|
||||||
return new ServiceCallResult(false, "服务暂时不可用,请稍后再试", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 获取服务实例列表
|
|
||||||
List<ServiceRegistry.ServiceInstance> instances = serviceRegistry.discover(serviceName);
|
|
||||||
if (instances.isEmpty()) {
|
|
||||||
circuitBreaker.recordFailure();
|
|
||||||
return new ServiceCallResult(false, "未找到可用的服务实例: " + serviceName, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 负载均衡选择实例
|
|
||||||
LoadBalancer loadBalancer = getLoadBalancer(serviceName);
|
|
||||||
ServiceRegistry.ServiceInstance instance = loadBalancer.choose(instances);
|
|
||||||
|
|
||||||
if (instance == null) {
|
|
||||||
circuitBreaker.recordFailure();
|
|
||||||
return new ServiceCallResult(false, "负载均衡失败,未选择到服务实例", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟服务调用
|
|
||||||
System.out.println("调用服务: " + serviceName + " 实例: " + instance + " 路径: " + path);
|
|
||||||
|
|
||||||
// 模拟随机失败(用于测试熔断)
|
|
||||||
boolean success = simulateServiceCall(instance, serviceName);
|
|
||||||
|
|
||||||
// 更新调用统计
|
|
||||||
updateCallStats(serviceName, instance, success);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
circuitBreaker.recordSuccess();
|
|
||||||
Map<String, Object> response = new HashMap<>();
|
|
||||||
response.put("instance", instance.toString());
|
|
||||||
response.put("path", path);
|
|
||||||
response.put("timestamp", System.currentTimeMillis());
|
|
||||||
return new ServiceCallResult(true, "调用成功", response);
|
|
||||||
} else {
|
|
||||||
circuitBreaker.recordFailure();
|
|
||||||
return new ServiceCallResult(false, "服务调用失败", null);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
circuitBreaker.recordFailure();
|
|
||||||
return new ServiceCallResult(false, "服务调用异常: " + e.getMessage(), null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 内部调用服务方法
|
|
||||||
public String callServiceInternal(String serviceName, String method, Map<String, String> params) {
|
|
||||||
// 1. 通过服务注册中心发现服务
|
|
||||||
List<ServiceRegistry.ServiceInstance> instances = serviceRegistry.discover(serviceName);
|
|
||||||
if (instances.isEmpty()) {
|
|
||||||
return "服务不可用: " + serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 通过负载均衡器选择实例
|
|
||||||
LoadBalancer loadBalancer = getLoadBalancer(serviceName);
|
|
||||||
ServiceRegistry.ServiceInstance instance = loadBalancer.choose(instances);
|
|
||||||
if (instance == null) {
|
|
||||||
return "无法选择服务实例: " + serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 通过断路器调用服务
|
|
||||||
String key = serviceName + ":" + instance.getHost() + ":" + instance.getPort();
|
|
||||||
CircuitBreaker circuitBreaker = circuitBreakers.computeIfAbsent(key, name -> new CircuitBreaker(name, 5, 10000, 2));
|
|
||||||
|
|
||||||
if (!circuitBreaker.allowRequest()) {
|
|
||||||
return "服务调用被断路器拒绝: " + serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 模拟服务调用
|
|
||||||
String result = simulateServiceCallInternal(instance, method, params);
|
|
||||||
circuitBreaker.recordSuccess();
|
|
||||||
|
|
||||||
// 更新调用统计
|
|
||||||
updateCallStats(serviceName, instance, true);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
} catch (Exception e) {
|
|
||||||
circuitBreaker.recordFailure();
|
|
||||||
|
|
||||||
// 更新调用统计
|
|
||||||
updateCallStats(serviceName, instance, false);
|
|
||||||
|
|
||||||
return "服务调用失败: " + e.getMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟服务调用(内部方法)
|
|
||||||
private String simulateServiceCallInternal(ServiceRegistry.ServiceInstance instance, String method, Map<String, String> params) {
|
|
||||||
// 检查故障服务列表
|
|
||||||
String faultKey = instance.getHost() + ":" + instance.getPort();
|
|
||||||
if (faultyServices.containsKey(faultKey) && faultyServices.get(faultKey)) {
|
|
||||||
throw new RuntimeException("模拟服务故障: " + instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟处理延迟
|
|
||||||
try {
|
|
||||||
Thread.sleep(10 + (int)(Math.random() * 50));
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成调用结果
|
|
||||||
String path = params.getOrDefault("path", "");
|
|
||||||
return method + " " + instance.getHost() + ":" + instance.getPort() + path + " - 调用成功";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟服务调用(随机失败以测试熔断)
|
|
||||||
private boolean simulateServiceCall(ServiceRegistry.ServiceInstance instance, String serviceName) {
|
|
||||||
// 检查故障服务列表
|
|
||||||
String faultKey = instance.getHost() + ":" + instance.getPort();
|
|
||||||
if (faultyServices.containsKey(faultKey) && faultyServices.get(faultKey)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// 90%的成功率,用于测试
|
|
||||||
return Math.random() < 0.9;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新调用统计
|
|
||||||
private void updateCallStats(String serviceName, ServiceRegistry.ServiceInstance instance, boolean success) {
|
|
||||||
CallStats stats = callStats.computeIfAbsent(serviceName, k -> new CallStats());
|
|
||||||
stats.recordCall(success);
|
|
||||||
|
|
||||||
// 更新实例统计
|
|
||||||
String instanceKey = instance.getHost() + ":" + instance.getPort();
|
|
||||||
stats.instanceStats.computeIfAbsent(instanceKey, k -> new ServiceInstanceStats()).recordCall(success);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 列出所有服务
|
|
||||||
public List<String> listServices() {
|
|
||||||
List<String> services = new ArrayList<>();
|
|
||||||
// 从服务注册中心获取所有服务
|
|
||||||
serviceRegistry.getAllServices().forEach(service -> {
|
|
||||||
List<ServiceRegistry.ServiceInstance> instances = serviceRegistry.discover(service);
|
|
||||||
for (ServiceRegistry.ServiceInstance instance : instances) {
|
|
||||||
services.add(service + " - " + instance.getHost() + ":" + instance.getPort());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 模拟服务故障
|
|
||||||
public void simulateServiceFailure(String serviceName, String host, int port, boolean isFaulty) {
|
|
||||||
String key = host + ":" + port;
|
|
||||||
faultyServices.put(key, isFaulty);
|
|
||||||
System.out.println("服务故障状态更新: " + serviceName + "[" + host + ":" + port + "] = " + (isFaulty ? "故障" : "正常"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 打印治理统计信息
|
|
||||||
public void printGovernanceStats() {
|
|
||||||
System.out.println("===== 微服务治理统计 =====");
|
|
||||||
|
|
||||||
// 打印服务调用统计
|
|
||||||
callStats.forEach((service, stats) -> {
|
|
||||||
System.out.println("\n服务: " + service);
|
|
||||||
System.out.println(" 总调用次数: " + stats.getTotalCalls());
|
|
||||||
System.out.println(" 成功调用: " + stats.getSuccessCalls());
|
|
||||||
System.out.println(" 失败调用: " + stats.getFailureCalls());
|
|
||||||
System.out.println(" 成功率: " + String.format("%.2f%%",
|
|
||||||
stats.getTotalCalls() > 0 ? (double) stats.getSuccessCalls() / stats.getTotalCalls() * 100 : 0));
|
|
||||||
|
|
||||||
// 打印实例统计
|
|
||||||
System.out.println(" 实例统计:");
|
|
||||||
stats.getInstanceStats().forEach((instance, instanceStats) -> {
|
|
||||||
System.out.println(" " + instance + ": 调用 " + instanceStats.getTotalCalls() + " 次, 成功率 " +
|
|
||||||
String.format("%.2f%%", instanceStats.getSuccessRate()));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// 打印断路器状态
|
|
||||||
System.out.println("\n断路器状态:");
|
|
||||||
circuitBreakers.forEach((key, breaker) -> {
|
|
||||||
System.out.println(" " + key + ": " + breaker.getState() + ", 失败计数: " + breaker.getFailureCount());
|
|
||||||
});
|
|
||||||
|
|
||||||
System.out.println("========================");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取服务治理统计信息
|
|
||||||
public Map<String, Object> getGovernanceStats() {
|
|
||||||
Map<String, Object> stats = new HashMap<>();
|
|
||||||
|
|
||||||
// 服务统计
|
|
||||||
Map<String, Integer> serviceStats = new HashMap<>();
|
|
||||||
for (String service : serviceRegistry.getAllServices()) {
|
|
||||||
int instanceCount = serviceRegistry.discover(service).size();
|
|
||||||
serviceStats.put(service, instanceCount);
|
|
||||||
}
|
|
||||||
stats.put("services", serviceStats);
|
|
||||||
|
|
||||||
// 断路器统计
|
|
||||||
Map<String, String> breakerStats = new HashMap<>();
|
|
||||||
for (Map.Entry<String, CircuitBreaker> entry : circuitBreakers.entrySet()) {
|
|
||||||
CircuitBreaker breaker = entry.getValue();
|
|
||||||
breakerStats.put(entry.getKey(), breaker.getState() + " (失败: " + breaker.getFailureCount() + ")");
|
|
||||||
}
|
|
||||||
stats.put("circuitBreakers", breakerStats);
|
|
||||||
|
|
||||||
// 添加调用统计
|
|
||||||
stats.put("callStats", callStats);
|
|
||||||
|
|
||||||
return stats;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务调用统计
|
|
||||||
private static class CallStats {
|
|
||||||
private final AtomicInteger totalCalls = new AtomicInteger(0);
|
|
||||||
private final AtomicInteger successCalls = new AtomicInteger(0);
|
|
||||||
private final AtomicInteger failureCalls = new AtomicInteger(0);
|
|
||||||
private final Map<String, ServiceInstanceStats> instanceStats = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
// Getters
|
|
||||||
public int getTotalCalls() { return totalCalls.get(); }
|
|
||||||
public int getSuccessCalls() { return successCalls.get(); }
|
|
||||||
public int getFailureCalls() { return failureCalls.get(); }
|
|
||||||
public Map<String, ServiceInstanceStats> getInstanceStats() { return instanceStats; }
|
|
||||||
|
|
||||||
// 更新统计
|
|
||||||
public void recordCall(boolean success) {
|
|
||||||
totalCalls.incrementAndGet();
|
|
||||||
if (success) {
|
|
||||||
successCalls.incrementAndGet();
|
|
||||||
} else {
|
|
||||||
failureCalls.incrementAndGet();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务实例调用统计
|
|
||||||
private static class ServiceInstanceStats {
|
|
||||||
private final AtomicInteger totalCalls = new AtomicInteger(0);
|
|
||||||
private final AtomicInteger successCalls = new AtomicInteger(0);
|
|
||||||
|
|
||||||
public void recordCall(boolean success) {
|
|
||||||
totalCalls.incrementAndGet();
|
|
||||||
if (success) {
|
|
||||||
successCalls.incrementAndGet();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTotalCalls() { return totalCalls.get(); }
|
|
||||||
public int getSuccessCalls() { return successCalls.get(); }
|
|
||||||
public double getSuccessRate() {
|
|
||||||
int total = getTotalCalls();
|
|
||||||
return total > 0 ? (double) getSuccessCalls() / total * 100 : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务注册中心内部类
|
|
||||||
public static class ServiceRegistry {
|
|
||||||
private final Map<String, List<ServiceInstance>> services = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
public void register(String serviceName, String host, int port) {
|
|
||||||
services.computeIfAbsent(serviceName, k -> new ArrayList<>()).add(new ServiceInstance(host, port));
|
|
||||||
System.out.println("服务注册: " + serviceName + " at " + host + ":" + port);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deregister(String serviceName, String host, int port) {
|
|
||||||
List<ServiceInstance> instances = services.get(serviceName);
|
|
||||||
if (instances != null) {
|
|
||||||
instances.removeIf(instance -> instance.getHost().equals(host) && instance.getPort() == port);
|
|
||||||
if (instances.isEmpty()) {
|
|
||||||
services.remove(serviceName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ServiceInstance> discover(String serviceName) {
|
|
||||||
List<ServiceInstance> instances = services.get(serviceName);
|
|
||||||
return instances != null ? new ArrayList<>(instances) : Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Set<String> getAllServices() {
|
|
||||||
return new HashSet<>(services.keySet());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ServiceInstance {
|
|
||||||
private final String host;
|
|
||||||
private final int port;
|
|
||||||
|
|
||||||
public ServiceInstance(String host, int port) {
|
|
||||||
this.host = host;
|
|
||||||
this.port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getHost() { return host; }
|
|
||||||
public int getPort() { return port; }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() { return host + ":" + port; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 负载均衡器内部类
|
|
||||||
public static class LoadBalancer {
|
|
||||||
private final String name;
|
|
||||||
private final AtomicInteger counter = new AtomicInteger(0);
|
|
||||||
|
|
||||||
public LoadBalancer(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 轮询负载均衡
|
|
||||||
public ServiceRegistry.ServiceInstance choose(List<ServiceRegistry.ServiceInstance> instances) {
|
|
||||||
if (instances == null || instances.isEmpty()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 轮询选择实例
|
|
||||||
int index = Math.abs(counter.getAndIncrement() % instances.size());
|
|
||||||
return instances.get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 断路器内部类
|
|
||||||
public static class CircuitBreaker {
|
|
||||||
public enum State { CLOSED, OPEN, HALF_OPEN }
|
|
||||||
|
|
||||||
private final String name;
|
|
||||||
private final int failureThreshold;
|
|
||||||
private final long resetTimeoutMs;
|
|
||||||
private final int successThreshold;
|
|
||||||
|
|
||||||
private volatile State state = State.CLOSED;
|
|
||||||
private final AtomicInteger failureCount = new AtomicInteger(0);
|
|
||||||
private final AtomicInteger successCount = new AtomicInteger(0);
|
|
||||||
private volatile long lastFailureTime = 0;
|
|
||||||
|
|
||||||
public CircuitBreaker(String name, int failureThreshold, long resetTimeoutMs, int successThreshold) {
|
|
||||||
this.name = name;
|
|
||||||
this.failureThreshold = failureThreshold;
|
|
||||||
this.resetTimeoutMs = resetTimeoutMs;
|
|
||||||
this.successThreshold = successThreshold;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean allowRequest() {
|
|
||||||
if (state == State.CLOSED) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (state == State.OPEN) {
|
|
||||||
if (System.currentTimeMillis() - lastFailureTime > resetTimeoutMs) {
|
|
||||||
state = State.HALF_OPEN;
|
|
||||||
System.out.println("断路器状态切换: " + name + " 从 OPEN 到 HALF_OPEN");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return state == State.HALF_OPEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void recordSuccess() {
|
|
||||||
if (state == State.CLOSED) {
|
|
||||||
failureCount.set(0);
|
|
||||||
} else if (state == State.HALF_OPEN) {
|
|
||||||
if (successCount.incrementAndGet() >= successThreshold) {
|
|
||||||
reset();
|
|
||||||
System.out.println("断路器状态切换: " + name + " 从 HALF_OPEN 到 CLOSED");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void recordFailure() {
|
|
||||||
if (state == State.CLOSED) {
|
|
||||||
if (failureCount.incrementAndGet() >= failureThreshold) {
|
|
||||||
state = State.OPEN;
|
|
||||||
lastFailureTime = System.currentTimeMillis();
|
|
||||||
System.out.println("断路器状态切换: " + name + " 从 CLOSED 到 OPEN");
|
|
||||||
}
|
|
||||||
} else if (state == State.HALF_OPEN) {
|
|
||||||
state = State.OPEN;
|
|
||||||
lastFailureTime = System.currentTimeMillis();
|
|
||||||
successCount.set(0);
|
|
||||||
System.out.println("断路器状态切换: " + name + " 从 HALF_OPEN 到 OPEN");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void reset() {
|
|
||||||
state = State.CLOSED;
|
|
||||||
failureCount.set(0);
|
|
||||||
successCount.set(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public State getState() { return state; }
|
|
||||||
public int getFailureCount() { return failureCount.get(); }
|
|
||||||
public String getName() { return name; }
|
|
||||||
}
|
|
||||||
|
|
||||||
// 服务调用结果
|
|
||||||
public static class ServiceCallResult {
|
|
||||||
private final boolean success;
|
|
||||||
private final String message;
|
|
||||||
private final Map<String, Object> data;
|
|
||||||
|
|
||||||
public ServiceCallResult(boolean success, String message, Map<String, Object> data) {
|
|
||||||
this.success = success;
|
|
||||||
this.message = message;
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSuccess() { return success; }
|
|
||||||
public String getMessage() { return message; }
|
|
||||||
public Map<String, Object> getData() { return data; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in new issue