UNPKG

@jiaxinjiang/nest-nacos

Version:

Nacos component for NestJs.

95 lines 4.56 kB
"use strict"; 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