当前位置: 首页 > news >正文

微服务管家:NestJS 如何使用服务发现 Consul 实现高效的微服务节点管理

前言

微服务架构中,服务发现是一项基础且关键的功能,它允许服务实例在网络中被动态发现。Consul 是一种服务网格解决方案,提供了服务发现、运行状况检查,过去和现代应用程序的连接等功能。

本教程将向您展示如何在 NestJS 框架中集成 Consul 实现服务发现的能力。

什么是 Consul

Consul 是由 HashiCorp 公司开发的一种服务网格解决方案,它提供完整的服务网格特性,并且可以在任何运行您的应用程序的环境中运行。

它具有以下几个主要功能:

  1. 服务发现 - Consul 客户端可以注册服务,例如一个web服务器,以便其他客户端可以使用 Consul 来发现服务的位置。
  2. 运行状况检查 - Consul 客户端可以提供任何数量的运行状况检查服务,以便可以自动移除不健康的服务实例。
  3. KV 存储 - Consul 提供一个简单的键值对存储,用于存储配置和其他用途。
  4. 多数据中心 - Consul 支持多数据中心,这是其特别适用于大型公司和企业的原因。

使用步骤

以下是在 NestJS 应用程序中集成 Consul 用于服务发现的步骤:

一、 安装 Consul

在您的本地机器或服务器上安装 Consul。详细的安装教程可以在 Consul 的官方网站找到。您可以通过它们的指南快速启动和运行 Consul 代理。

# 例如,在macOS上安装 Consul
brew install consul# 启动 Consul agent
consul agent -dev

二、初始化 NestJS 项目

如果您还没有 NestJS 项目,可以用以下命令创建一个:

nest new project-name

三、安装必要的库

为了使 NestJS 能够与 Consul 集成,您需要安装 node-consul,这是 Consul 的 Node.js 客户端库。

npm install consul

四、创建 Consul 服务模块

在 NestJS 项目中创建一个新模块用于封装 Consul 基本操作:

// consul.service.tsimport { Injectable } from '@nestjs/common';
import * as Consul from 'consul';@Injectable()
export class ConsulService {private consul: Consul.Consul;constructor() {this.consul = new Consul({// Consul 的配置项host: 'localhost',port: 8500 // 根据实际端口号修改});}async registerService(serviceInfo: Consul.Agent.Service.RegisterOptions) {return new Promise<void>((resolve, reject) => {this.consul.agent.service.register(serviceInfo, (err) => {if (err) {reject(err);return;}resolve();});});}// 其他 Consul 的操作方法
}

五、 在 NestJS 应用生命周期中应用 Consul 服务

让 NestJS 在应用启动时自动注册服务,并在应用关闭时自动注销服务。

  1. 在您的主模块(例如 AppModule)中导入刚才创建的 ConsulService 服务,并在模块中注册:

    // app.module.ts
    import { Module } from '@nestjs/common';
    import { ConsulService } from './consul.service';@Module({// ...providers: [ConsulService],
    })
    export class AppModule {}
  2. 修改您的主 AppService 或自定义一个新服务来实现 NestJS 应用的生命周期的钩子 onModuleInitonApplicationShutdown

    // app.service.ts
    import { Injectable, OnModuleInit, OnApplicationShutdown } from '@nestjs/common';
    import { ConsulService } from './consul.service';@Injectable()
    export class AppService implements OnModuleInit, OnApplicationShutdown {constructor(private consulService: ConsulService) {}async onModuleInit(): Promise<void> {// 当模块初始化时注册服务try {await this.consulService.registerService({name: 'nestjs-service',// 其他需要的配置});console.log('服务成功注册到Consul');} catch (error) {console.error('服务注册失败:', error);}}async onApplicationShutdown(signal?: string): Promise<void> {// 应用关闭时注销服务try {// 具体的服务注销逻辑console.log(`服务注销成功`);} catch (error) {console.error('服务注销失败:', error);}}
    }
  3. AppService 添加到您的主应用模块中去。这样可以确保注册的服务在 NestJS 应用生命周期中被正确管理:

    // app.module.ts
    // ...
    import { AppService } from './app.service';@Module({// ...providers: [ConsulService, AppService],
    })
    export class AppModule {}

这样,当您的 NestJS 服务启动时,它会自动向 Consul 注册服务,当服务关闭时,它又会自动从 Consul 注销服务。

如何调用 Consul 注册的微服务

消费通过 Consul 发现的服务意味着您需要从 Consul 获取服务的地址和端口信息,然后基于这些信息去发起请求。以下步骤将介绍如何在 NestJS 应用中实现这一点。

一、查询服务

在我们创建的 ConsulService 服务中,实现一个方法来获取所有活跃的服务实例。

// consul.service.ts// ... (其他代码)@Injectable()
export class ConsulService {// ... (其他代码)async discoverService(serviceName: string): Promise<Consul.Agent.Service[]> {return new Promise((resolve, reject) => {this.consul.agent.service.list((err, result) => {if (err) {reject(err);return;}const services = [];for (let id in result) {if (result[id].Service === serviceName) {services.push(result[id]);}}resolve(services);});});}
}

二、实现服务消费逻辑

在您要消费服务的地方(比如某个服务或控制器中),调用刚才实现的 discoverService 方法获取服务实例。

// some.service.tsimport { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { ConsulService } from './consul.service';
import { firstValueFrom } from 'rxjs';@Injectable()
export class SomeService {constructor(private httpService: HttpService,private consulService: ConsulService) {}async consumeService(serviceName: string) {try {const services = await this.consulService.discoverService(serviceName);if (services.length === 0) {throw new Error('服务未发现');}// 假设我们只关注第一个服务实例const serviceInstance = services[0];// 构建服务实例的地址,以便请求const url = `http://${serviceInstance.Address}:${serviceInstance.Port}/path-to-service-resource`;// 发送请求到服务实例const response = await firstValueFrom(this.httpService.get(url));return response.data;} catch (error) {throw error;}}
}

注意:在实际环境中,您可能希望实现更复杂的逻辑,比如负载均衡(选择多个实例)或者使用失败重试机制等。

三、调用服务

在控制器或者其他需要消费服务的地方调用 SomeService

// some.controller.tsimport { Controller, Get } from '@nestjs/common';
import { SomeService } from './some.service';@Controller()
export class SomeController {constructor(private readonly someService: SomeService) {}@Get()async consume() {const data = await this.someService.consumeService('nestjs-service');return data;}
}

这样,当您的控制器收到 HTTP 请求时,它将通过 SomeService 使用 Consul 服务发现机制来消费远端的服务。

总结

集成 Consul 到 NestJS 应用中是微服务架构中一个关键的步骤。通过这一流程,您的服务可以被动态地发现和管理。在微服务架构中,你可以根据实际业务场景,针对性地实现高可用性和负载均衡等策略。使用 NestJS 框架和 Consul 服务发现,你可以构建一个既灵活又可扩展的微服务系统。

相关文章:

微服务管家:NestJS 如何使用服务发现 Consul 实现高效的微服务节点管理

前言 在微服务架构中&#xff0c;服务发现是一项基础且关键的功能&#xff0c;它允许服务实例在网络中被动态发现。Consul 是一种服务网格解决方案&#xff0c;提供了服务发现、运行状况检查&#xff0c;过去和现代应用程序的连接等功能。 本教程将向您展示如何在 NestJS 框架…...

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里实现相机图像转换为Mat图像格式联合OpenCV实现相机图像转换为Mat图像格式测试演示图 工业相机…...

铁塔基站数字化管理监测解决方案

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…...

如何使用Python3 Boto3删除AWS CloudFormation的栈(Stacks)

文章目录 小结问题及解决有关Json文件的输入和输出使用Python3及正则表达式查找字符串包含某个子字符串使用Python3 Boto3删除AWS CloudFormation的栈&#xff08;Stacks&#xff09; 参考 小结 本文记录了使用Python3的Boto3包删除AWS CloudFormation的栈&#xff08;Stacks&…...

差分约束算法

差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件&#xff0c;这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi​−xj​≤b∈[1,m]​的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…...

彻底解决vue-video-player播放视频有黑边

需求 最近需要接入海康视频摄像头&#xff0c;然后把视频的画面接入到自己的网站系统中。以前对接过rtsp固定IP的显示视频&#xff0c;这次的不一样&#xff0c;没有了固定IP。海康的解决办法是&#xff0c;摄像头通过配置服务器到萤石云平台&#xff0c;然后购买企业版账号和…...

区域负责人常用的ChatGPT通用提示词模板

区域市场分析&#xff1a;如何分析区域市场的特点、竞争态势和客户需求&#xff1f; 区域销售策略制定&#xff1a;如何制定针对区域市场的销售策略&#xff0c;包括产品定位、价格策略、渠道策略等&#xff1f; 区域销售目标设定&#xff1a;如何设定明确的区域销售目标&…...

Java Spring boot 可變參數,以及弊端

function中 不固定的參數 public boolean sendEmail(String manFrom, String manTo,String manCc, String subject, String... msg); 必須是最後一個參數&#xff0c;傳值時可以多個。 sendEmail(“a.gmail”,"b.gmail","c.gmail","subject",…...

机器视觉系统选型-线阵工业相机选型

线阵相机特点&#xff1a; 1.线阵相机使用的线扫描传感器通常只有一行感光单元&#xff08;少数彩色线阵使用三行感光单元的传感器&#xff09; 2.线阵相机每次只采集一行图像&#xff1b; 3.线阵相机每次只输出一行图像&#xff1b; 4.与传统的面阵相机相比&#xff0c;面阵扫…...

单机开机无感全自动进入B\S架构系统

单机开机无感全自动进入B\S架构系统 标题&#xff1a;单机用jar包启动项目bat&#xff08;批处理&#xff09;不弹黑窗口&#xff0c;并设置开机自启&#xff0c;打开浏览器&#xff0c;访问系统。引言&#xff1a;在实际工作中&#xff0c;遇到单机部署的情况&#xff0c;如今…...

大一,如何成为一名fpga工程师?

​ 1、数电&#xff08;必须掌握的基础&#xff09;&#xff0c;然后进阶学模电&#xff08;选学&#xff09;&#xff0c; 2、掌握HDL&#xff08;HDLverilogVHDL&#xff09;可以选择verilog或者VHDL&#xff0c;建议verilog就行。 3、掌握FPGA设计流程/原理&#xff08;推…...

MyBatisPlus学习三:Service接口、代码生成器

学习教程 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中&#xff0c;Service接口的作用是为实体类提供一系列的通用CRUD&#xff08;增删改查&#xff09;操作方法。通常情况下&#xff0c;Servi…...

产品经理如何选择城市?

年底&#xff0c;全国性的人口大迁徙即将开始。选择城市&#xff0c;堪称年轻人的“二次投胎”&#xff0c;族望留原籍&#xff0c;家贫走他乡。 古人在选择城市时&#xff0c;主要的考量因素是家族势力&#xff0c;这一点放在当代&#xff0c;大致也成立&#xff0c;如果在老…...

再谈“敏捷”与“瀑布”在产品开发过程中的反思

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…...

设计模式② :交给子类

文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书&qu…...

Hive 源码

hive 编译 issue Failed to execute goal com.github.os72:protoc-jar-maven-plugin:3.5.1.1:run (default) on project hive-standalone-metastore: Error resolving artifact: com.google.protobuf:protoc:2.5.0: The following artifacts could not be resolved: com.goog…...

调整几行代码,接口吞吐提升 10 倍,性能调优妙啊!

景 分析过程 总结 背景 公司的一个ToB系统,因为客户使用的也不多,没啥并发要求,就一直没有经过压测。这两天来了一个“大客户”,对并发量提出了要求:核心接口与几个重点使用场景单节点吞吐量要满足最低500/s的要求。 当时一想,500/s吞吐量还不简单。Tomcat按照100个线程…...

MACOS Atrust服务异常

MAC版Atrust服务异常 点击进入办公后出现提示其一&#xff1a; 核心服务未启动&#xff0c;部分功能存在异常&#xff0c;确定重新启动吗&#xff1f; 可能的原因&#xff1a; 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后&#xff0c;出现提示&#x…...

LLM大语言模型(四):在ChatGLM3-6B中使用langchain

目录 背景准备工作工具添加LangChain 已实现工具Calculator、Weather Tool配置 自定义工具自定义kuakuawo Agent 多工具使用参考 背景 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够: 具有上下文意识&#xff1a;将语言模型与上下文源(提示指令&…...

Dubbo入门介绍和实战

1. 引言 Dubbo是一款开源的高性能、轻量级的Java RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;旨在解决分布式服务之间的通信问题。本文将介绍Dubbo的基础概念、核心特性以及使用场景&#xff0c;包括实际示例演示。 2. 什么是Dubbo&#xff1f; Dubbo是阿里巴…...

如何实现无人机识别功能

无人机识别算法可以基于不同的传感器和技术&#xff0c;结合多种方法进行实现。以下是一些常见的无人机识别算法和技术&#xff1a; 视觉识别&#xff1a; 图像处理&#xff1a; 使用计算机视觉技术对无人机图像进行处理&#xff0c;包括特征提取、目标检测和跟踪等。深度学习&…...

Python学习笔记(四)流程控制方法

流程控制有三种方法&#xff1a;分支、循环、跳出 流程的控制通过布尔值来实现&#xff0c;分支和循环都需要对一定的条件进行判断&#xff0c;根据判断结果&#xff08;布尔值&#xff09;决定下一步要做什么 布尔值通过比较运算符、逻辑运算符来进行判断是True还是False 不…...

【Qt- C++ Qml 交互】

Qt编程指南 VX&#xff1a;hao541022348 ■ 将C对象注册到 QML中&#xff0c;在QML使用C对象■ C对象注册到元对象系统■ Q_INVOKABLE 宏定义是将C 的 函数&#xff08;方法&#xff09;声明为元对象系统可调用的函数■ 演示步骤 ■ 将 C类注册到 QML&#xff0c;并在QML声明一…...

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本&#xff0c;执行 python 时&#xff0c;默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…...

程序性能优化全能手册

本文聊一个程序员都会关注的问题&#xff1a;性能。 当大家谈到“性能”时&#xff0c;你首先想到的会是什么&#xff1f; 是每次请求需要多长时间才能返回&#xff1f; 是每秒钟能够处理多少次请求&#xff1f; 还是程序的CPU和内存使用率高不高&#xff1f; 这些问题基本上…...

LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明

LiveSIPB 国网B接口服务安装使用说明 1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS) 2、服务运行2.1、Windows2.2、Linux 3、配置设备接入3.1、海康STATE_GRID接入示例 4、平台使用4.1、管…...

利用小红书笔记详情API:为内容运营提供强大的支持

利用小红书笔记详情API&#xff0c;内容运营者可以获得对小红书平台上的笔记内容的深入洞察&#xff0c;从而为其运营工作提供强大的支持。以下是该API如何支持内容运营的几个关键方面&#xff1a; 获取笔记内容与数据&#xff1a; API允许内容运营者直接获取小红书平台上的笔记…...

地理空间分析1——入门Python地理空间分析

写在开头 地理空间分析是一门涉及地球表面数据处理和解释的科学&#xff0c;通过对地理现象的研究&#xff0c;我们可以更深入地了解地球各个角落的关系。Python作为一种功能强大的编程语言&#xff0c;在地理空间分析领域展现了强大的潜力。本文将带您深入了解入门级别的Pyth…...

哈尔滨爆火的背后有什么值得我们学习的,2024普通人如何创业/2024风口行业

这个冬天&#xff0c;“南方小土豆”带火东北冰雪游。“冰城”黑龙江哈尔滨的文旅市场异常火爆&#xff0c;元旦假期3天&#xff0c;哈尔滨市累计接待游客304.79万人次&#xff0c;实现旅游总收入59.14亿元。旅游总收入达到历史峰值。哈尔滨旅游怎么就爆火了&#xff1f;背后究…...

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…...

企业网站mp4怎么处理/聚名网

1 生命周期&#xff1a;从客户视图看待&#xff0c;Bean实例开始于客户获得其引用时&#xff0c;而终止于客户会话的中介。通常&#xff0c;客户会话&#xff08;Client Session&#xff09;的持续期决定了使用中的会话Bean的存活期。会话Bean仅仅是内存对象&#xff0c;一旦其…...

政府门户网站等保建设方案/2021小学生新闻摘抄

题解思路&#xff1a; 将所有条件存起来 枚举每个点是否为裁判&#xff0c;枚举时对涉及到此人的回合不进行操作&#xff0c;看是否出现矛盾&#xff0c;记录出现矛盾的回合。 如果仅有一点未出现矛盾&#xff0c;则此点为裁判&#xff0c;判断回合为max(出现矛盾的回合) 如果都…...

做名片最好的网站是哪个/百度网站入口链接

惠普电脑如何设置光驱启动呢惠普hp pavilion g4 购买之后一直使用很好&#xff0c;最近重新安装系统想设置光盘启动。发现按照常规的F2 F12 del 等都不能进入Bios。最后才发现原来HP进入BIOS的.键是F10&#xff0c;下面是小编为大家收集的资料&#xff0c;一起来看看吧。惠普…...

社保网站做员工用工备案/企业网站推广注意事项

选择好的变量名 前注&#xff1a;希望我的读书笔记能带你快速翻过30页的《代码大全》&#xff0c;若有不妥之处&#xff0c;恳请指正。这部分很基础&#xff0c;但也是最常用的&#xff0c;不要小看哦~ http://www.cnblogs.com/jerry19880126/ 对于码农来说&#xff0c;给变量取…...

邯郸做网站推广费用/怎么联系百度人工服务

Android(3)点击事件的处理和应用 1.在学习点击事件之前呢.我们学习安卓控件中的Textview,Button,redioButton,checkBox,等相关控件是使用,在安卓中呢,TextView是许多的App开发的必备控件,无论是大的项目还是小的项目都会有TextView的出现.接下来我们就从它开始讲起,来简单介绍这…...

wordpress是软件不/媒体资源网官网

所谓变量初始化&#xff0c;就是在定义变量的时候&#xff0c;给其赋值一个初始值。那么&#xff0c;数组初始化&#xff0c;就是在定义数组的时候&#xff0c;给其赋值初始值。 数组初始化的格式如下&#xff1a; 数据类型 数组名 [常量值] {值1, 值2, ..., 值N}; 此时&a…...