@jiaxinjiang/nest-nacos
Version:
Nacos component for NestJs.
95 lines • 4.56 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NacosNamingService = void 0;
const common_1 = require("@nestjs/common");
const nacos_logger_1 = require("../nacos.logger");
const nacos_naming_constants_1 = require("./nacos.naming.constants");
const NacosNamingClient = require('nacos').NacosNamingClient;
let NacosNamingService = class NacosNamingService {
constructor(options) {
this.options = options;
this.logger = new nacos_logger_1.NacosLogger(options.naming.loggerLevel, options.naming.logger);
this.namingClient = new NacosNamingClient(Object.assign(Object.assign({}, options.naming), { logger: this.logger }));
}
async onModuleInit() {
await this.namingClient.ready();
}
async onModuleDestroy() {
await this.namingClient.close();
}
registerInstance(serviceName, instance, groupName) {
return this.namingClient.registerInstance(serviceName, instance, groupName);
}
deregisterInstance(serviceName, instance, groupName) {
return this.namingClient.deregisterInstance(serviceName, instance, groupName);
}
getAllInstances(serviceName, groupName, clusters, subscribe) {
return this.namingClient.getAllInstances(serviceName, groupName, clusters, subscribe);
}
selectInstances(serviceName, groupName, clusters, healthy, subscribe) {
return this.namingClient.selectInstances(serviceName, groupName, clusters, healthy, subscribe);
}
getServerStatus() {
return this.namingClient.getServerStatus();
}
subscribe(info, listener = () => null) {
return this.namingClient.subscribe(info, (instances) => listener(instances, this.logger));
}
unSubscribe(info, listener = () => null) {
return this.namingClient.unSubscribe(info, (instances) => listener(instances, this.logger));
}
async selectOneHealthyInstance(serviceName, groupName, clusters) {
const instances = await this.namingClient.selectInstances(serviceName, groupName, clusters, true);
let totalWeight = 0;
for (const instance of instances) {
totalWeight += instance.weight;
}
let pos = Math.random() * totalWeight;
for (const instance of instances) {
if (instance.weight) {
pos -= instance.weight;
if (pos <= 0) {
return instance;
}
}
}
throw new Error(`Not found healthy service ${serviceName}!`);
}
axiosRequestInterceptor() {
return async (config) => {
const results = /(?<=:\/\/)[a-zA-Z\.\-_0-9]+(?=\/|$)/.exec(config.url);
if (results && results.length) {
let service;
const serviceName = results[0];
const target = this.options.subscribers.find(item => serviceName.toLocaleLowerCase() ===
item.serviceName.toLocaleLowerCase());
if (target) {
service = await this.selectOneHealthyInstance(target.serviceName, target.groupName, target.clusters);
}
if (service) {
config.url = config.url.replace(serviceName, `${service.ip}:${service.port}`);
}
}
return config;
};
}
};
NacosNamingService = __decorate([
common_1.Injectable(),
__param(0, common_1.Inject(nacos_naming_constants_1.NACOS_NAMING_OPTION)),
__metadata("design:paramtypes", [Object])
], NacosNamingService);
exports.NacosNamingService = NacosNamingService;
//# sourceMappingURL=nacos.naming.service.js.map