首次提交

This commit is contained in:
qmqz
2025-01-02 10:08:03 +08:00
commit fd62ed3d98
16 changed files with 1143 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:EasyDartModule/base/discovery/Discovery.dart';
class NacosDiscovery implements Discovery {
// final String host;
// final String namespaceId;
final DiscoveryConfig config;
final Dio dio;
bool healthCheck = true;
NacosDiscovery(this.config) : dio = Dio(BaseOptions(baseUrl: config.host));
// 注册实例到 Nacos
@override
Future<bool> registerInstance(String serviceName, String ip, int port,
{String groupName = 'DEFAULT_GROUP'}) async {
try {
final response = await dio.post(
'/nacos/v2/ns/instance',
queryParameters: {
'serviceName': serviceName,
'ip': ip,
'port': port,
'groupName': groupName,
'namespaceId': config.namespaceId,
'ephemeral': true
},
);
if (response.statusCode == 200) {
print('服务注册成功: $serviceName');
healthCheck = true;
//启动定时器 更新服务健康状态
Future.doWhile(() async {
if (healthCheck) {
await Future.delayed(Duration(seconds: 5), () async {
//发送心跳包
try {
final rr = await dio
.put("/nacos/v1/ns/instance/beat", queryParameters: {
'serviceName': serviceName,
'ip': ip,
'port': port,
'groupName': groupName,
'namespaceId': config.namespaceId,
});
print(rr);
} catch (e) {
print(e);
}
});
}
return healthCheck;
}).then((v) {
print("心跳线程结束");
});
// Timer.periodic(Duration(seconds: 5), (timer) async {
// //判断是否取消注册
// if (!healthCheck) {
// timer.cancel();
// return;
// }
// });
return true;
} else {
print('服务注册失败: ${response.statusCode} - ${response.data}');
return false;
}
} catch (e) {
print('请求失败: $e');
return false;
}
}
// 注销实例
@override
Future<bool> deRegisterInstance(String serviceName, String ip, int port,
{String groupName = 'DEFAULT_GROUP'}) async {
try {
final response = await dio.delete(
'/nacos/v2/ns/instance',
queryParameters: {
'serviceName': serviceName,
'ip': ip,
'port': port,
'groupName': groupName,
'namespaceId': config.namespaceId,
},
);
if (response.statusCode == 200) {
print('服务注销成功: $serviceName');
//标记心跳线程为退出状态
healthCheck = false;
return true;
} else {
print('服务注销失败: ${response.statusCode} - ${response.data}');
return false;
}
} catch (e) {
print('请求失败: $e');
return false;
}
}
// 获取服务实例列表
@override
Future<List<Map<String, dynamic>>> getInstanceList(String serviceName,
{String groupName = 'DEFAULT_GROUP'}) async {
try {
final response = await dio.get(
'/nacos/v2/ns/instance/list',
queryParameters: {
'serviceName': serviceName,
'groupName': groupName,
'namespaceId': config.namespaceId,
'healthyOnly': true,
},
);
if (response.statusCode == 200) {
final instances = response.data["data"]['hosts'];
// print('服务实例列表: $instances');
return List<Map<String, dynamic>>.from(instances);
} else {
print('获取服务实例列表失败: ${response.statusCode} - ${response.data}');
return [];
}
} catch (e) {
print('请求失败: $e');
return [];
}
}
// 获取配置
@override
Future<String> getConfig(String dataId,
{String group = 'DEFAULT_GROUP'}) async {
try {
final response = await dio.get(
'/nacos/v2/cs/config',
queryParameters: {
'dataId': dataId,
'group': group,
'namespaceId': config.namespaceId,
},
);
if (response.statusCode == 200) {
// print('获取配置成功: ${response.data}');
return response.data["data"];
} else {
print('获取配置失败: ${response.statusCode} - ${response.data}');
return '';
}
} catch (e) {
print('请求失败: $e');
return '';
}
}
// 发布配置
@override
Future<bool> publishConfig(
String dataId, String group, String content) async {
try {
final response = await dio.post(
'/nacos/v2/cs/config',
queryParameters: {
'dataId': dataId,
'group': group,
'namespaceId': config.namespaceId,
'content': content,
},
);
if (response.statusCode == 200) {
print('配置发布成功: $dataId');
return true;
} else {
print('配置发布失败: ${response.statusCode} - ${response.data}');
return false;
}
} catch (e) {
print('请求失败: $e');
return false;
}
}
// 删除配置
@override
Future<bool> deleteConfig(String dataId, String group) async {
try {
final response = await dio.delete(
'/nacos/v2/cs/config',
queryParameters: {
'dataId': dataId,
'group': group,
'namespaceId': config.namespaceId,
},
);
if (response.statusCode == 200) {
print('配置删除成功: $dataId');
return true;
} else {
print('配置删除失败: ${response.statusCode} - ${response.data}');
return false;
}
} catch (e) {
print('请求失败: $e');
return false;
}
}
}