67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import { NacosNamingClient } from 'nacos';
|
||
// @ts-ignore
|
||
import { formatServiceUrl, getLocalIP } from "./utils";
|
||
|
||
const logger = console;
|
||
|
||
|
||
export interface RegisterOptions {
|
||
serverList: string;
|
||
/** 服务名称(如 'main-app') */
|
||
serviceName: string;
|
||
/** 服务端口号 */
|
||
port: number;
|
||
/** 命名空间(用于环境隔离,默认 'public') */
|
||
namespace?: string;
|
||
}
|
||
|
||
|
||
export class nacosServiceManage {
|
||
|
||
public nacosClient!: NacosNamingClient;
|
||
public initOptions!: RegisterOptions;
|
||
|
||
|
||
constructor(option: RegisterOptions) {
|
||
this.initOptions = option;
|
||
this.init()
|
||
}
|
||
|
||
|
||
async init() {
|
||
this.nacosClient = new NacosNamingClient({
|
||
logger,
|
||
serverList: this.initOptions.serverList,
|
||
namespace: this.initOptions.namespace || 'public',
|
||
});
|
||
await this.nacosClient.ready();
|
||
this.reg()
|
||
}
|
||
|
||
/**
|
||
* 注册服务到Nacos并返回客户端实例
|
||
*/
|
||
async reg() {
|
||
const { serviceName, port } = this.initOptions;
|
||
const ip = getLocalIP();
|
||
// @ts-ignore
|
||
await this.nacosClient.registerInstance(serviceName, {
|
||
port, ip
|
||
})
|
||
console.log(`[nacos] 服务 ${ serviceName } 已注册:${ formatServiceUrl(ip, port) }`);
|
||
}
|
||
|
||
/**
|
||
* 从Nacos发现服务地址
|
||
* @param serviceName 发现选项
|
||
* @returns 服务地址(如 'http://192.168.1.101:1301')
|
||
*/
|
||
async find(serviceName: string) {
|
||
const instances = await this.nacosClient.getAllInstances(serviceName);
|
||
if (instances.length === 0) {
|
||
throw new Error(`[nacos] 未发现服务 ${ serviceName } 的实例`);
|
||
}
|
||
return formatServiceUrl(instances[0].ip, instances[0].port);
|
||
}
|
||
|
||
} |