@danqiusheng/nest-nacos 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +21 -21
- package/README.en.md +197 -0
- package/README.md +353 -385
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/nacos-config.service.d.ts +25 -45
- package/dist/nacos-config.service.d.ts.map +1 -1
- package/dist/nacos-config.service.js +241 -102
- package/dist/nacos-config.service.js.map +1 -1
- package/dist/nacos-naming.service.d.ts +16 -46
- package/dist/nacos-naming.service.d.ts.map +1 -1
- package/dist/nacos-naming.service.js +119 -88
- package/dist/nacos-naming.service.js.map +1 -1
- package/dist/nacos.decorators.d.ts +0 -4
- package/dist/nacos.decorators.d.ts.map +1 -1
- package/dist/nacos.decorators.js +1 -12
- package/dist/nacos.decorators.js.map +1 -1
- package/dist/nacos.health.d.ts +2 -6
- package/dist/nacos.health.d.ts.map +1 -1
- package/dist/nacos.health.js +5 -25
- package/dist/nacos.health.js.map +1 -1
- package/dist/nacos.interfaces.d.ts +85 -57
- package/dist/nacos.interfaces.d.ts.map +1 -1
- package/dist/nacos.module.d.ts +2 -11
- package/dist/nacos.module.d.ts.map +1 -1
- package/dist/nacos.module.js +22 -19
- package/dist/nacos.module.js.map +1 -1
- package/dist/nacos.providers.d.ts +4 -11
- package/dist/nacos.providers.d.ts.map +1 -1
- package/dist/nacos.providers.js +37 -23
- package/dist/nacos.providers.js.map +1 -1
- package/dist/nacos.utils.d.ts +6 -0
- package/dist/nacos.utils.d.ts.map +1 -0
- package/dist/nacos.utils.js +79 -0
- package/dist/nacos.utils.js.map +1 -0
- package/package.json +19 -10
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -27,4 +27,5 @@ __exportStar(require("./nacos-naming.service"), exports);
|
|
|
27
27
|
__exportStar(require("./nacos-config.service"), exports);
|
|
28
28
|
__exportStar(require("./nacos.decorators"), exports);
|
|
29
29
|
__exportStar(require("./nacos.health"), exports);
|
|
30
|
+
__exportStar(require("./nacos.utils"), exports);
|
|
30
31
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,oDAAkC;AAClC,qDAAmC;AACnC,iDAA+B;AAC/B,oDAAkC;AAClC,yDAAuC;AACvC,yDAAuC;AACvC,qDAAmC;AACnC,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,oDAAkC;AAClC,qDAAmC;AACnC,iDAA+B;AAC/B,oDAAkC;AAClC,yDAAuC;AACvC,yDAAuC;AACvC,qDAAmC;AACnC,iDAA+B;AAC/B,gDAA8B"}
|
|
@@ -1,62 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NestJS Nacos 插件 - Config 服务(配置中心)
|
|
3
|
-
*
|
|
4
|
-
* 封装 NacosConfigClient,负责:
|
|
5
|
-
* - 配置读取与发布
|
|
6
|
-
* - 配置变更订阅(服务端推送)
|
|
7
|
-
* - 本地配置缓存(支持热更新)
|
|
8
|
-
*/
|
|
9
1
|
import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
10
2
|
import { NacosConfigClient } from 'nacos';
|
|
11
|
-
import { NacosModuleOptions } from './nacos.interfaces';
|
|
3
|
+
import { NacosConfigDescriptor, NacosConfigFormat, NacosConfigState, NacosModuleOptions } from './nacos.interfaces';
|
|
4
|
+
type ConfigListener = (content: string, parsed?: unknown) => void;
|
|
12
5
|
export declare class NacosConfigService implements OnModuleInit, OnModuleDestroy {
|
|
13
6
|
private readonly client;
|
|
14
7
|
private readonly options;
|
|
15
8
|
private readonly logger;
|
|
16
|
-
/** 配置缓存:key = `${dataId}@@${group}` */
|
|
17
9
|
private readonly cache;
|
|
18
|
-
|
|
10
|
+
private readonly parsedCache;
|
|
19
11
|
private readonly listeners;
|
|
12
|
+
private readonly sdkListeners;
|
|
13
|
+
private readonly states;
|
|
20
14
|
constructor(client: NacosConfigClient | null, options: NacosModuleOptions | null);
|
|
21
|
-
/** 模块初始化:等待客户端就绪 + 预加载订阅配置 */
|
|
22
15
|
onModuleInit(): Promise<void>;
|
|
23
16
|
onModuleDestroy(): Promise<void>;
|
|
24
|
-
|
|
25
|
-
* 获取配置内容
|
|
26
|
-
* @param dataId 配置 ID
|
|
27
|
-
* @param group 分组名,默认 'DEFAULT_GROUP'
|
|
28
|
-
* @returns 配置内容字符串
|
|
29
|
-
*/
|
|
17
|
+
preload(descriptors: NacosConfigDescriptor[]): Promise<void>;
|
|
30
18
|
getConfig(dataId: string, group?: string): Promise<string>;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
getConfigAsJson<T = any>(dataId: string, group?: string): Promise<T>;
|
|
35
|
-
/**
|
|
36
|
-
* 发布配置
|
|
37
|
-
* @param dataId 配置 ID
|
|
38
|
-
* @param group 分组名
|
|
39
|
-
* @param content 配置内容
|
|
40
|
-
*/
|
|
19
|
+
getParsedConfig<T = unknown>(dataId: string, group?: string, format?: NacosConfigFormat): Promise<T>;
|
|
20
|
+
getConfigAsJson<T = unknown>(dataId: string, group?: string): Promise<T>;
|
|
21
|
+
getMergedConfig<T = Record<string, unknown>>(descriptors?: NacosConfigDescriptor[]): Promise<T>;
|
|
41
22
|
publish(dataId: string, group: string, content: string): Promise<boolean>;
|
|
42
|
-
/**
|
|
43
|
-
* 删除配置
|
|
44
|
-
*/
|
|
45
23
|
remove(dataId: string, group: string): Promise<boolean>;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* @param group 分组名
|
|
50
|
-
* @param listener 回调函数,参数为新配置内容
|
|
51
|
-
*/
|
|
52
|
-
subscribe(dataId: string, group: string, listener: (content: string) => void): void;
|
|
53
|
-
/**
|
|
54
|
-
* 取消订阅
|
|
55
|
-
*/
|
|
56
|
-
unSubscribe(dataId: string, group: string, listener?: (content: string) => void): void;
|
|
57
|
-
/** 获取原始客户端 */
|
|
24
|
+
subscribe(dataId: string, group: string, listener: ConfigListener): void;
|
|
25
|
+
unSubscribe(dataId: string, group: string, listener?: ConfigListener): void;
|
|
26
|
+
getLoadedConfigs(): NacosConfigState[];
|
|
58
27
|
getRawClient(): NacosConfigClient | null;
|
|
59
|
-
|
|
60
|
-
private
|
|
28
|
+
private loadDescriptor;
|
|
29
|
+
private ensureSdkSubscription;
|
|
30
|
+
private acceptContent;
|
|
31
|
+
private loadFallback;
|
|
32
|
+
private writeFallback;
|
|
33
|
+
private cachePath;
|
|
34
|
+
private normalizeDescriptor;
|
|
35
|
+
private parse;
|
|
36
|
+
private key;
|
|
37
|
+
private splitKey;
|
|
38
|
+
private errorMessage;
|
|
39
|
+
private removeThroughSdk;
|
|
61
40
|
}
|
|
41
|
+
export {};
|
|
62
42
|
//# sourceMappingURL=nacos-config.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nacos-config.service.d.ts","sourceRoot":"","sources":["../src/nacos-config.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nacos-config.service.d.ts","sourceRoot":"","sources":["../src/nacos-config.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,eAAe,EAAE,YAAY,EAAY,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAG5B,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAElE,qBACa,kBAAmB,YAAW,YAAY,EAAE,eAAe;IAS3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgD;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAGF,MAAM,EAAE,iBAAiB,GAAG,IAAI,EACtC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAGlF,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAW7B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,OAAO,CAAC,WAAW,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnE,eAAe,CAAC,CAAC,GAAG,OAAO,EAC/B,MAAM,EAAE,MAAM,EACd,KAAK,SAAkB,EACvB,MAAM,GAAE,iBAA0B,GACjC,OAAO,CAAC,CAAC,CAAC;IASP,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjF,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,WAAW,GAAE,qBAAqB,EAAyC,GAC1E,OAAO,CAAC,CAAC,CAAC;IAcP,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAczE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYxE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI;IAc3E,gBAAgB,IAAI,gBAAgB,EAAE;IAItC,YAAY,IAAI,iBAAiB,GAAG,IAAI;YAI1B,cAAc;IA0B5B,OAAO,CAAC,qBAAqB;YA2Bf,aAAa;YA0Bb,YAAY;YAcZ,aAAa;IAO3B,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,YAAY;YAIN,gBAAgB;CAmC/B"}
|
|
@@ -14,157 +14,296 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
14
14
|
var NacosConfigService_1;
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.NacosConfigService = void 0;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* 封装 NacosConfigClient,负责:
|
|
21
|
-
* - 配置读取与发布
|
|
22
|
-
* - 配置变更订阅(服务端推送)
|
|
23
|
-
* - 本地配置缓存(支持热更新)
|
|
24
|
-
*/
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
const fs_1 = require("fs");
|
|
19
|
+
const path_1 = require("path");
|
|
25
20
|
const common_1 = require("@nestjs/common");
|
|
26
21
|
const nacos_constants_1 = require("./nacos.constants");
|
|
22
|
+
const nacos_utils_1 = require("./nacos.utils");
|
|
27
23
|
let NacosConfigService = NacosConfigService_1 = class NacosConfigService {
|
|
28
24
|
constructor(client, options) {
|
|
29
25
|
this.client = client;
|
|
30
26
|
this.options = options;
|
|
31
27
|
this.logger = new common_1.Logger(NacosConfigService_1.name);
|
|
32
|
-
/** 配置缓存:key = `${dataId}@@${group}` */
|
|
33
28
|
this.cache = new Map();
|
|
34
|
-
|
|
29
|
+
this.parsedCache = new Map();
|
|
35
30
|
this.listeners = new Map();
|
|
31
|
+
this.sdkListeners = new Map();
|
|
32
|
+
this.states = new Map();
|
|
36
33
|
}
|
|
37
|
-
/** 模块初始化:等待客户端就绪 + 预加载订阅配置 */
|
|
38
34
|
async onModuleInit() {
|
|
39
35
|
if (!this.client) {
|
|
40
|
-
this.
|
|
36
|
+
if ((this.options?.subscribeConfigs?.length ?? 0) > 0) {
|
|
37
|
+
await this.preload(this.options.subscribeConfigs);
|
|
38
|
+
}
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
43
|
-
await this.client.ready();
|
|
44
|
-
this.
|
|
45
|
-
// 预加载并订阅配置项
|
|
46
|
-
const configs = this.options?.subscribeConfigs ?? [];
|
|
47
|
-
for (const { dataId, group } of configs) {
|
|
48
|
-
await this.loadAndSubscribe(dataId, group);
|
|
49
|
-
}
|
|
41
|
+
await (0, nacos_utils_1.withRetry)(() => this.client.ready(), this.options?.configLoading?.retry ?? this.options?.retry);
|
|
42
|
+
await this.preload(this.options?.subscribeConfigs ?? []);
|
|
50
43
|
}
|
|
51
44
|
async onModuleDestroy() {
|
|
52
45
|
if (!this.client)
|
|
53
46
|
return;
|
|
54
|
-
this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
for (const [key, wrapper] of this.sdkListeners) {
|
|
48
|
+
const { dataId, group } = this.splitKey(key);
|
|
49
|
+
this.client.unSubscribe({ dataId, group }, wrapper);
|
|
50
|
+
}
|
|
51
|
+
this.sdkListeners.clear();
|
|
52
|
+
this.listeners.clear();
|
|
53
|
+
await Promise.resolve(this.client.close());
|
|
54
|
+
}
|
|
55
|
+
async preload(descriptors) {
|
|
56
|
+
for (const descriptor of descriptors) {
|
|
57
|
+
await this.loadDescriptor(this.normalizeDescriptor(descriptor));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
62
60
|
async getConfig(dataId, group = 'DEFAULT_GROUP') {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const key = `${dataId}@@${group}`;
|
|
66
|
-
if (this.cache.has(key)) {
|
|
61
|
+
const key = this.key(dataId, group);
|
|
62
|
+
if (this.cache.has(key))
|
|
67
63
|
return this.cache.get(key);
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
if (!this.client)
|
|
65
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
66
|
+
const content = await (0, nacos_utils_1.withRetry)(() => this.client.getConfig(dataId, group), this.options?.configLoading?.retry ?? this.options?.retry);
|
|
70
67
|
this.cache.set(key, content);
|
|
71
68
|
return content;
|
|
72
69
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
async getParsedConfig(dataId, group = 'DEFAULT_GROUP', format = 'auto') {
|
|
71
|
+
const key = this.key(dataId, group);
|
|
72
|
+
if (this.parsedCache.has(key))
|
|
73
|
+
return this.parsedCache.get(key);
|
|
77
74
|
const content = await this.getConfig(dataId, group);
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
75
|
+
const parsed = this.parse(content, format, dataId);
|
|
76
|
+
this.parsedCache.set(key, parsed);
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
async getConfigAsJson(dataId, group = 'DEFAULT_GROUP') {
|
|
80
|
+
return this.getParsedConfig(dataId, group, 'json');
|
|
81
|
+
}
|
|
82
|
+
async getMergedConfig(descriptors = this.options?.subscribeConfigs ?? []) {
|
|
83
|
+
let merged = {};
|
|
84
|
+
for (const input of descriptors) {
|
|
85
|
+
const descriptor = this.normalizeDescriptor(input);
|
|
86
|
+
const value = await this.getParsedConfig(descriptor.dataId, descriptor.group, descriptor.format);
|
|
87
|
+
merged = (0, nacos_utils_1.mergeConfigValues)(merged, value);
|
|
84
88
|
}
|
|
89
|
+
return merged;
|
|
85
90
|
}
|
|
86
|
-
/**
|
|
87
|
-
* 发布配置
|
|
88
|
-
* @param dataId 配置 ID
|
|
89
|
-
* @param group 分组名
|
|
90
|
-
* @param content 配置内容
|
|
91
|
-
*/
|
|
92
91
|
async publish(dataId, group, content) {
|
|
93
92
|
if (!this.client)
|
|
94
|
-
throw new Error('NacosConfigClient
|
|
95
|
-
const result = await this.client.publishSingle(dataId, group, content);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
93
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
94
|
+
const result = await (0, nacos_utils_1.withRetry)(() => this.client.publishSingle(dataId, group, content), this.options?.retry);
|
|
95
|
+
if (result) {
|
|
96
|
+
const key = this.key(dataId, group);
|
|
97
|
+
this.cache.set(key, content);
|
|
98
|
+
this.parsedCache.delete(key);
|
|
99
|
+
}
|
|
99
100
|
return result;
|
|
100
101
|
}
|
|
101
|
-
/**
|
|
102
|
-
* 删除配置
|
|
103
|
-
*/
|
|
104
102
|
async remove(dataId, group) {
|
|
105
103
|
if (!this.client)
|
|
106
|
-
throw new Error('NacosConfigClient
|
|
107
|
-
const result = await this.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
104
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
105
|
+
const result = await (0, nacos_utils_1.withRetry)(() => this.removeThroughSdk(dataId, group), this.options?.retry);
|
|
106
|
+
if (result) {
|
|
107
|
+
const key = this.key(dataId, group);
|
|
108
|
+
this.cache.delete(key);
|
|
109
|
+
this.parsedCache.delete(key);
|
|
110
|
+
this.states.delete(key);
|
|
111
|
+
}
|
|
111
112
|
return result;
|
|
112
113
|
}
|
|
113
|
-
/**
|
|
114
|
-
* 订阅配置变更(服务端推送)
|
|
115
|
-
* @param dataId 配置 ID
|
|
116
|
-
* @param group 分组名
|
|
117
|
-
* @param listener 回调函数,参数为新配置内容
|
|
118
|
-
*/
|
|
119
114
|
subscribe(dataId, group, listener) {
|
|
120
115
|
if (!this.client)
|
|
121
|
-
throw new Error('NacosConfigClient
|
|
122
|
-
const key =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
this.listeners.
|
|
127
|
-
};
|
|
128
|
-
this.client.subscribe({ dataId, group }, wrapper);
|
|
129
|
-
if (!this.listeners.has(key)) {
|
|
130
|
-
this.listeners.set(key, new Set());
|
|
116
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
117
|
+
const key = this.key(dataId, group);
|
|
118
|
+
let callbacks = this.listeners.get(key);
|
|
119
|
+
if (!callbacks) {
|
|
120
|
+
callbacks = new Set();
|
|
121
|
+
this.listeners.set(key, callbacks);
|
|
131
122
|
}
|
|
132
|
-
|
|
133
|
-
this.
|
|
123
|
+
callbacks.add(listener);
|
|
124
|
+
this.ensureSdkSubscription(dataId, group);
|
|
134
125
|
}
|
|
135
|
-
/**
|
|
136
|
-
* 取消订阅
|
|
137
|
-
*/
|
|
138
126
|
unSubscribe(dataId, group, listener) {
|
|
139
127
|
if (!this.client)
|
|
140
|
-
throw new Error('NacosConfigClient
|
|
141
|
-
const key =
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
128
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
129
|
+
const key = this.key(dataId, group);
|
|
130
|
+
const callbacks = this.listeners.get(key);
|
|
131
|
+
if (listener)
|
|
132
|
+
callbacks?.delete(listener);
|
|
133
|
+
else
|
|
134
|
+
callbacks?.clear();
|
|
135
|
+
if (!callbacks || callbacks.size === 0) {
|
|
136
|
+
const wrapper = this.sdkListeners.get(key);
|
|
137
|
+
if (wrapper)
|
|
138
|
+
this.client.unSubscribe({ dataId, group }, wrapper);
|
|
148
139
|
this.listeners.delete(key);
|
|
140
|
+
this.sdkListeners.delete(key);
|
|
149
141
|
}
|
|
150
142
|
}
|
|
151
|
-
|
|
143
|
+
getLoadedConfigs() {
|
|
144
|
+
return Array.from(this.states.values()).map((state) => ({ ...state }));
|
|
145
|
+
}
|
|
152
146
|
getRawClient() {
|
|
153
147
|
return this.client;
|
|
154
148
|
}
|
|
155
|
-
|
|
156
|
-
|
|
149
|
+
async loadDescriptor(descriptor) {
|
|
150
|
+
const mode = this.options?.configLoading?.failureMode ?? 'throw';
|
|
151
|
+
try {
|
|
152
|
+
if (!this.client)
|
|
153
|
+
throw new Error('NacosConfigClient is not initialized');
|
|
154
|
+
const content = await (0, nacos_utils_1.withRetry)(() => this.client.getConfig(descriptor.dataId, descriptor.group), this.options?.configLoading?.retry ?? this.options?.retry);
|
|
155
|
+
await this.acceptContent(descriptor, content, 'nacos', true);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
let loadedFallback = false;
|
|
159
|
+
if (mode === 'fallback') {
|
|
160
|
+
loadedFallback = await this.loadFallback(descriptor);
|
|
161
|
+
}
|
|
162
|
+
if (!loadedFallback && descriptor.required && mode !== 'continue') {
|
|
163
|
+
throw new Error(`Failed to preload Nacos config ${descriptor.dataId} (${descriptor.group}): ${this.errorMessage(error)}`);
|
|
164
|
+
}
|
|
165
|
+
if (!loadedFallback) {
|
|
166
|
+
this.logger.warn(`Skipped config ${descriptor.dataId} (${descriptor.group}): ${this.errorMessage(error)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (descriptor.subscribe && this.client)
|
|
170
|
+
this.ensureSdkSubscription(descriptor.dataId, descriptor.group);
|
|
171
|
+
}
|
|
172
|
+
ensureSdkSubscription(dataId, group) {
|
|
173
|
+
if (!this.client)
|
|
174
|
+
return;
|
|
175
|
+
const key = this.key(dataId, group);
|
|
176
|
+
if (this.sdkListeners.has(key))
|
|
177
|
+
return;
|
|
178
|
+
const descriptor = this.normalizeDescriptor(this.options?.subscribeConfigs?.find((item) => item.dataId === dataId && (item.group ?? 'DEFAULT_GROUP') === group) ?? { dataId, group });
|
|
179
|
+
const wrapper = (content) => {
|
|
180
|
+
void this.acceptContent(descriptor, content, 'nacos', true)
|
|
181
|
+
.then(() => {
|
|
182
|
+
const parsed = this.parsedCache.get(key);
|
|
183
|
+
for (const callback of this.listeners.get(key) ?? []) {
|
|
184
|
+
try {
|
|
185
|
+
callback(content, parsed);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
this.logger.error(`Config listener failed for ${dataId} (${group})`, error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
.catch((error) => this.logger.error(`Config update rejected for ${dataId} (${group})`, error));
|
|
193
|
+
};
|
|
194
|
+
this.sdkListeners.set(key, wrapper);
|
|
195
|
+
this.client.subscribe({ dataId, group }, wrapper);
|
|
196
|
+
}
|
|
197
|
+
async acceptContent(descriptor, content, source, persist) {
|
|
198
|
+
const key = this.key(descriptor.dataId, descriptor.group);
|
|
199
|
+
const parsed = this.parse(content, descriptor.format, descriptor.dataId);
|
|
200
|
+
this.cache.set(key, content);
|
|
201
|
+
this.parsedCache.set(key, parsed);
|
|
202
|
+
this.states.set(key, {
|
|
203
|
+
dataId: descriptor.dataId,
|
|
204
|
+
group: descriptor.group,
|
|
205
|
+
format: (0, nacos_utils_1.resolveConfigFormat)(descriptor.dataId, descriptor.format),
|
|
206
|
+
source,
|
|
207
|
+
updatedAt: new Date().toISOString(),
|
|
208
|
+
});
|
|
209
|
+
if (persist && this.cachePath(descriptor)) {
|
|
210
|
+
try {
|
|
211
|
+
await this.writeFallback(this.cachePath(descriptor), content);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
this.logger.warn(`Failed to write config cache for ${descriptor.dataId}: ${this.errorMessage(error)}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async loadFallback(descriptor) {
|
|
219
|
+
const path = this.cachePath(descriptor);
|
|
220
|
+
if (!path)
|
|
221
|
+
return false;
|
|
222
|
+
try {
|
|
223
|
+
const content = await fs_1.promises.readFile(path, 'utf8');
|
|
224
|
+
await this.acceptContent(descriptor, content, 'fallback', false);
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async writeFallback(path, content) {
|
|
232
|
+
await fs_1.promises.mkdir((0, path_1.dirname)(path), { recursive: true });
|
|
233
|
+
const temporary = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
234
|
+
await fs_1.promises.writeFile(temporary, content, 'utf8');
|
|
235
|
+
await fs_1.promises.rename(temporary, path);
|
|
236
|
+
}
|
|
237
|
+
cachePath(descriptor) {
|
|
238
|
+
if (descriptor.cachePath)
|
|
239
|
+
return (0, path_1.resolve)(descriptor.cachePath);
|
|
240
|
+
const cacheDir = this.options?.configLoading?.cacheDir;
|
|
241
|
+
if (!cacheDir)
|
|
242
|
+
return undefined;
|
|
243
|
+
const digest = (0, crypto_1.createHash)('sha256')
|
|
244
|
+
.update(`${descriptor.dataId}@@${descriptor.group ?? 'DEFAULT_GROUP'}`)
|
|
245
|
+
.digest('hex')
|
|
246
|
+
.slice(0, 16);
|
|
247
|
+
return (0, path_1.join)((0, path_1.resolve)(cacheDir), `${digest}.cache`);
|
|
248
|
+
}
|
|
249
|
+
normalizeDescriptor(descriptor) {
|
|
250
|
+
return {
|
|
251
|
+
dataId: descriptor.dataId,
|
|
252
|
+
group: descriptor.group ?? 'DEFAULT_GROUP',
|
|
253
|
+
format: descriptor.format ?? 'auto',
|
|
254
|
+
subscribe: descriptor.subscribe ?? true,
|
|
255
|
+
required: descriptor.required ?? true,
|
|
256
|
+
cachePath: descriptor.cachePath,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
parse(content, format, dataId) {
|
|
157
260
|
try {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
});
|
|
163
|
-
void content;
|
|
261
|
+
return (0, nacos_utils_1.parseConfigContent)(content, format, dataId);
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
throw new Error(`Invalid ${(0, nacos_utils_1.resolveConfigFormat)(dataId, format)} config ${dataId}: ${this.errorMessage(error)}`);
|
|
164
265
|
}
|
|
165
|
-
|
|
166
|
-
|
|
266
|
+
}
|
|
267
|
+
key(dataId, group) {
|
|
268
|
+
return `${dataId}@@${group}`;
|
|
269
|
+
}
|
|
270
|
+
splitKey(key) {
|
|
271
|
+
const separator = key.lastIndexOf('@@');
|
|
272
|
+
return { dataId: key.slice(0, separator), group: key.slice(separator + 2) };
|
|
273
|
+
}
|
|
274
|
+
errorMessage(error) {
|
|
275
|
+
return error instanceof Error ? error.message : String(error);
|
|
276
|
+
}
|
|
277
|
+
async removeThroughSdk(dataId, group) {
|
|
278
|
+
// nacos@2.6.x sends `tenant=public` when removing the public namespace,
|
|
279
|
+
// although publish/get use the empty namespace. Use the official
|
|
280
|
+
// nacos-config DataClient directly for this one operation so the request
|
|
281
|
+
// omits tenant entirely and does not depend on cluster-client's 7777
|
|
282
|
+
// leader/follower state.
|
|
283
|
+
const isPublic = !this.options?.config?.namespace || this.options.config.namespace === 'public';
|
|
284
|
+
if (isPublic) {
|
|
285
|
+
if (this.client.options) {
|
|
286
|
+
const { DataClient } = require('nacos-config');
|
|
287
|
+
const config = this.options?.config;
|
|
288
|
+
const directClient = new DataClient({
|
|
289
|
+
serverAddr: config?.serverAddr,
|
|
290
|
+
namespace: undefined,
|
|
291
|
+
username: config?.username,
|
|
292
|
+
password: config?.password,
|
|
293
|
+
ssl: config?.ssl,
|
|
294
|
+
accessKey: config?.accessKey,
|
|
295
|
+
secretKey: config?.secretKey,
|
|
296
|
+
signatureRegionId: config?.signatureRegionId,
|
|
297
|
+
});
|
|
298
|
+
try {
|
|
299
|
+
return await directClient.remove(dataId, group);
|
|
300
|
+
}
|
|
301
|
+
finally {
|
|
302
|
+
directClient.close();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
167
305
|
}
|
|
306
|
+
return this.client.remove(dataId, group);
|
|
168
307
|
}
|
|
169
308
|
};
|
|
170
309
|
exports.NacosConfigService = NacosConfigService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nacos-config.service.js","sourceRoot":"","sources":["../src/nacos-config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;GAOG;AACH,2CAAqG;AAErG,uDAAuE;AAIhE,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAO7B,YAC2C,MAAiD,EACvD,OAAmD;QAD5B,WAAM,GAAN,MAAM,CAA0B;QACtC,YAAO,GAAP,OAAO,CAA2B;QARvE,WAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAC9D,uCAAuC;QACtB,UAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACnD,yCAAyC;QACxB,cAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAK5E,CAAC;IAEJ,8BAA8B;IAC9B,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAEzC,YAAY;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC;QACrD,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,KAAK,GAAG,eAAe;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAU,MAAc,EAAE,KAAK,GAAG,eAAe;QACpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,oBAAoB,CAAC,CAAC;YACnD,OAAO,OAAuB,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,KAAa;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,MAAc,EAAE,KAAa,EAAE,QAAmC;QAC1E,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,sBAAsB;QACtB,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc,EAAE,KAAa,EAAE,QAAoC;QAC7E,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAQ,CAAC,CAAC;QACnF,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,cAAc;IACd,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,qBAAqB;IACb,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,KAAa;QAC1D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,MAAM,KAAK,KAAK,GAAG,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,KAAK,OAAO,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF,CAAA;AAlJY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,qCAAmB,CAAC,CAAA;IACvC,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,+BAAa,CAAC,CAAA;;GATzB,kBAAkB,CAkJ9B"}
|
|
1
|
+
{"version":3,"file":"nacos-config.service.js","sourceRoot":"","sources":["../src/nacos-config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +1,38 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NestJS Nacos 插件 - Naming 服务(服务发现/注册)
|
|
3
|
-
*
|
|
4
|
-
* 封装 NacosNamingClient,负责:
|
|
5
|
-
* - 客户端生命周期管理(初始化 / 关闭)
|
|
6
|
-
* - 服务实例自动注册与注销
|
|
7
|
-
* - 服务订阅与实例查询
|
|
8
|
-
*/
|
|
9
1
|
import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
10
2
|
import { NacosNamingClient } from 'nacos';
|
|
11
|
-
import { NacosInstanceOptions, NacosModuleOptions } from './nacos.interfaces';
|
|
3
|
+
import { NacosInstanceOptions, NacosInstanceSelectionOptions, NacosModuleOptions, NacosServiceInstance } from './nacos.interfaces';
|
|
12
4
|
export declare class NacosNamingService implements OnModuleInit, OnModuleDestroy {
|
|
13
5
|
private readonly client;
|
|
14
6
|
private readonly options;
|
|
15
7
|
private readonly logger;
|
|
16
|
-
|
|
17
|
-
private
|
|
8
|
+
private readonly registeredInstances;
|
|
9
|
+
private readonly subscriptions;
|
|
10
|
+
private readonly roundRobinIndexes;
|
|
18
11
|
constructor(client: NacosNamingClient | null, options: NacosModuleOptions | null);
|
|
19
|
-
/** 模块初始化:等待客户端就绪 + 自动注册实例 */
|
|
20
12
|
onModuleInit(): Promise<void>;
|
|
21
|
-
/** 模块销毁:注销所有已注册实例 + 关闭客户端 */
|
|
22
13
|
onModuleDestroy(): Promise<void>;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* 注销服务实例
|
|
30
|
-
* @param inst 实例配置
|
|
31
|
-
*/
|
|
32
|
-
deregister(inst: NacosInstanceOptions): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* 查询服务的所有实例
|
|
35
|
-
* @param serviceName 服务名
|
|
36
|
-
* @param groupName 分组名
|
|
37
|
-
* @param clusters 集群名
|
|
38
|
-
* @param subscribe 是否订阅,默认 true
|
|
39
|
-
*/
|
|
40
|
-
getAllInstances(serviceName: string, groupName?: string, clusters?: string, subscribe?: boolean): Promise<import("nacos-naming").Hosts>;
|
|
41
|
-
/**
|
|
42
|
-
* 查询健康实例
|
|
43
|
-
*/
|
|
44
|
-
selectInstances(serviceName: string, groupName?: string, clusters?: string, healthy?: boolean, subscribe?: boolean): Promise<import("nacos-naming").Hosts>;
|
|
45
|
-
/**
|
|
46
|
-
* 订阅服务实例变更(服务端推送)
|
|
47
|
-
* @param info 服务信息,字符串为 serviceName,对象为 { serviceName, groupName, clusters }
|
|
48
|
-
* @param listener 回调函数,参数为实例列表
|
|
49
|
-
*/
|
|
14
|
+
register(instance: NacosInstanceOptions): Promise<void>;
|
|
15
|
+
deregister(instance: NacosInstanceOptions): Promise<void>;
|
|
16
|
+
updateWeight(instance: NacosInstanceOptions, weight: number): Promise<void>;
|
|
17
|
+
getAllInstances(serviceName: string, groupName?: string, clusters?: string, subscribe?: boolean): Promise<NacosServiceInstance[]>;
|
|
18
|
+
selectInstances(serviceName: string, groupName?: string, clusters?: string, healthy?: boolean, subscribe?: boolean): Promise<NacosServiceInstance[]>;
|
|
19
|
+
selectInstance(serviceName: string, selection?: NacosInstanceSelectionOptions): Promise<NacosServiceInstance>;
|
|
50
20
|
subscribe(info: string | {
|
|
51
21
|
serviceName: string;
|
|
52
22
|
groupName?: string;
|
|
53
23
|
clusters?: string;
|
|
54
24
|
}, listener: (hosts: any[]) => void): void;
|
|
55
|
-
/**
|
|
56
|
-
* 取消订阅
|
|
57
|
-
*/
|
|
58
25
|
unSubscribe(info: string | {
|
|
59
26
|
serviceName: string;
|
|
60
27
|
groupName?: string;
|
|
61
28
|
clusters?: string;
|
|
62
29
|
}, listener?: (hosts: any[]) => void): void;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
/** 获取原始客户端(需要使用高级 API 时) */
|
|
30
|
+
getServerStatus(): Promise<'UP' | 'DOWN'>;
|
|
31
|
+
getRegisteredInstances(): NacosInstanceOptions[];
|
|
66
32
|
getRawClient(): NacosNamingClient | null;
|
|
33
|
+
private weighted;
|
|
34
|
+
private matchesMetadata;
|
|
35
|
+
private sameInstance;
|
|
36
|
+
private subscriptionKey;
|
|
67
37
|
}
|
|
68
38
|
//# sourceMappingURL=nacos-naming.service.d.ts.map
|