首次提交
This commit is contained in:
211
lib/base/discovery/impl/NacosDiscovery.dart
Normal file
211
lib/base/discovery/impl/NacosDiscovery.dart
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user