微服务管家:NestJS 如何使用服务发现 Consul 实现高效的微服务节点管理
前言
在微服务架构中,服务发现是一项基础且关键的功能,它允许服务实例在网络中被动态发现。Consul 是一种服务网格解决方案,提供了服务发现、运行状况检查,过去和现代应用程序的连接等功能。
本教程将向您展示如何在 NestJS 框架中集成 Consul 实现服务发现的能力。
什么是 Consul
Consul 是由 HashiCorp 公司开发的一种服务网格解决方案,它提供完整的服务网格特性,并且可以在任何运行您的应用程序的环境中运行。
它具有以下几个主要功能:
- 服务发现 - Consul 客户端可以注册服务,例如一个web服务器,以便其他客户端可以使用 Consul 来发现服务的位置。
- 运行状况检查 - Consul 客户端可以提供任何数量的运行状况检查服务,以便可以自动移除不健康的服务实例。
- KV 存储 - Consul 提供一个简单的键值对存储,用于存储配置和其他用途。
- 多数据中心 - 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 在应用启动时自动注册服务,并在应用关闭时自动注销服务。
-
在您的主模块(例如
AppModule)中导入刚才创建的ConsulService服务,并在模块中注册:// app.module.ts import { Module } from '@nestjs/common'; import { ConsulService } from './consul.service';@Module({// ...providers: [ConsulService], }) export class AppModule {} -
修改您的主
AppService或自定义一个新服务来实现 NestJS 应用的生命周期的钩子onModuleInit和onApplicationShutdown:// 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);}} } -
将
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 实现高效的微服务节点管理
前言 在微服务架构中,服务发现是一项基础且关键的功能,它允许服务实例在网络中被动态发现。Consul 是一种服务网格解决方案,提供了服务发现、运行状况检查,过去和现代应用程序的连接等功能。 本教程将向您展示如何在 NestJS 框架…...
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连(C) Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里实现相机图像转换为Mat图像格式联合OpenCV实现相机图像转换为Mat图像格式测试演示图 工业相机…...
铁塔基站数字化管理监测解决方案
截至2023年10月,我国5G基站总数达321.5万个,占全国通信基站总数的28.1%。然而,随着5G基站数量的快速增长,基站的能耗问题也逐渐日益凸显,基站的用电给运营商带来了巨大的电费开支压力,降低5G基站的能耗成为…...
如何使用Python3 Boto3删除AWS CloudFormation的栈(Stacks)
文章目录 小结问题及解决有关Json文件的输入和输出使用Python3及正则表达式查找字符串包含某个子字符串使用Python3 Boto3删除AWS CloudFormation的栈(Stacks) 参考 小结 本文记录了使用Python3的Boto3包删除AWS CloudFormation的栈(Stacks&…...
差分约束算法
差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件,这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi−xj≤b∈[1,m]的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…...
彻底解决vue-video-player播放视频有黑边
需求 最近需要接入海康视频摄像头,然后把视频的画面接入到自己的网站系统中。以前对接过rtsp固定IP的显示视频,这次的不一样,没有了固定IP。海康的解决办法是,摄像头通过配置服务器到萤石云平台,然后购买企业版账号和…...
区域负责人常用的ChatGPT通用提示词模板
区域市场分析:如何分析区域市场的特点、竞争态势和客户需求? 区域销售策略制定:如何制定针对区域市场的销售策略,包括产品定位、价格策略、渠道策略等? 区域销售目标设定:如何设定明确的区域销售目标&…...
Java Spring boot 可變參數,以及弊端
function中 不固定的參數 public boolean sendEmail(String manFrom, String manTo,String manCc, String subject, String... msg); 必須是最後一個參數,傳值時可以多個。 sendEmail(“a.gmail”,"b.gmail","c.gmail","subject",…...
机器视觉系统选型-线阵工业相机选型
线阵相机特点: 1.线阵相机使用的线扫描传感器通常只有一行感光单元(少数彩色线阵使用三行感光单元的传感器) 2.线阵相机每次只采集一行图像; 3.线阵相机每次只输出一行图像; 4.与传统的面阵相机相比,面阵扫…...
单机开机无感全自动进入B\S架构系统
单机开机无感全自动进入B\S架构系统 标题:单机用jar包启动项目bat(批处理)不弹黑窗口,并设置开机自启,打开浏览器,访问系统。引言:在实际工作中,遇到单机部署的情况,如今…...
大一,如何成为一名fpga工程师?
1、数电(必须掌握的基础),然后进阶学模电(选学), 2、掌握HDL(HDLverilogVHDL)可以选择verilog或者VHDL,建议verilog就行。 3、掌握FPGA设计流程/原理(推…...
MyBatisPlus学习三:Service接口、代码生成器
学习教程 黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中,Service接口的作用是为实体类提供一系列的通用CRUD(增删改查)操作方法。通常情况下,Servi…...
产品经理如何选择城市?
年底,全国性的人口大迁徙即将开始。选择城市,堪称年轻人的“二次投胎”,族望留原籍,家贫走他乡。 古人在选择城市时,主要的考量因素是家族势力,这一点放在当代,大致也成立,如果在老…...
再谈“敏捷”与“瀑布”在产品开发过程中的反思
作为一家专注于软件开发的公司《智创有术》,我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识,我们已经在行业内建立了良好的声誉,并赢得了客户的信任和支持。 支持各种源码,网站搭建,APP&a…...
设计模式② :交给子类
文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书&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服务异常 点击进入办公后出现提示其一: 核心服务未启动,部分功能存在异常,确定重新启动吗? 可能的原因: 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后,出现提示&#x…...
LLM大语言模型(四):在ChatGLM3-6B中使用langchain
目录 背景准备工作工具添加LangChain 已实现工具Calculator、Weather Tool配置 自定义工具自定义kuakuawo Agent 多工具使用参考 背景 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够: 具有上下文意识:将语言模型与上下文源(提示指令&…...
Dubbo入门介绍和实战
1. 引言 Dubbo是一款开源的高性能、轻量级的Java RPC(远程过程调用)框架,旨在解决分布式服务之间的通信问题。本文将介绍Dubbo的基础概念、核心特性以及使用场景,包括实际示例演示。 2. 什么是Dubbo? Dubbo是阿里巴…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
