NodeJS全栈开发面试题讲解——P10微服务架构(Node.js + 多服务协作)
✅ 10.1 单体架构和微服务的主要区别是什么?
维度 | 单体架构 | 微服务架构 |
---|---|---|
模块组织 | 所有功能打包在一个代码仓库中 | 拆分为多个独立服务 |
部署方式 | 部署一次包含全部逻辑 | 各服务独立部署、独立扩缩容 |
开发协作 | 多人协作易冲突 | 团队按服务划分,职责清晰 |
可维护性 | 功能多时变得复杂,修改风险大 | 单个服务小巧,便于维护和迭代 |
技术选型 | 通常限制于单一技术栈 | 各服务可用不同技术栈(polyglot) |
缺点 | 不易扩展、部署慢、耦合严重 | 运维复杂、服务治理成本高 |
✅ 10.2 微服务之间如何通信?同步与异步方式分别是什么?
🔹 同步通信(常用):
-
HTTP / REST API(最常见)
-
gRPC(高性能、结构化)
🔹 异步通信:
-
消息队列:如 RabbitMQ、Kafka、Redis Pub/Sub
-
事件驱动架构(EDA):服务发布事件,其他服务监听处理
✅ 选择建议:
-
实时请求场景 → 同步(如:下单、查询用户)
-
解耦+高并发处理 → 异步(如:发短信、订单通知、日志写入)
✅ 10.3 如何做服务注册与发现?你用过哪些方案?
在大型微服务系统中,服务数量多、地址动态变化,需注册中心协调。
✅ 常见方案:
工具 | 说明 |
---|---|
Consul | HashiCorp 出品,支持健康检查 |
Eureka | Netflix 出品,SpringCloud 默认使用 |
etcd / Zookeeper | CAP 选 P,K8s 内部注册服务 |
Nacos | 阿里开源,适配 SpringCloud |
🛠 使用方式:
-
服务启动时向注册中心注册(服务名 + IP + 端口)
-
消费者根据服务名获取地址列表,实现负载均衡调用
✅ 10.4 如何处理分布式事务问题?常见解决方案有哪些?
在多个微服务协同处理一个业务请求时,数据一致性成为挑战。
✅ 解决方案:
名称 | 描述 | 代表库/框架 |
---|---|---|
2PC | 两阶段提交(强一致) | XA、Atomikos |
TCC | Try-Confirm-Cancel,需实现三个接口 | Seata TCC 模式 |
SAGA | 长事务拆分为本地事务 + 补偿机制(最终一致) | Seata Saga、自实现 |
事务消息 | 操作数据库 + 发送消息(半消息 +确认) | RocketMQ 事务消息 |
🚨 Node.js 中可用策略:
-
事务消息 + 重试机制
-
自定义 SAGA 模式(数据库操作 + 补偿接口)
-
使用可靠消息服务(如 RabbitMQ + 补偿处理)
✅ 10.5 如何实现服务间的认证授权?使用了 JWT、API Key 还是其他方案?
✅ 主要方案:
方式 | 描述 | 使用场景 |
---|---|---|
JWT | 携带用户身份和权限信息,可被多个服务校验 | 用户登录态在多个服务间透传 |
API Key | 为每个服务/第三方分配独立访问凭证 | 内部服务调用、开放平台 API |
OAuth2 | 适用于用户授权第三方系统访问 | 开放授权(微信/Google 登录) |
mTLS | 双向证书验证,确保服务身份 | 高安全场景,如银行、支付系统 |
多数微服务系统使用 JWT + 内部签名校验,搭配 API 网关统一验证
✅ 10.6 你怎么处理服务之间的依赖关系?如何避免耦合?
✅ 降低耦合的策略:
-
使用接口约定(API schema):如 OpenAPI / Swagger
-
服务编排层(如 BFF)负责协调多个服务调用
-
通过事件驱动解耦:一个服务完成后发布事件,其他服务订阅处理
-
定义领域边界(DDD):每个服务聚焦自己的业务领域
✅ 10.7 如何做服务熔断、限流、降级?你用过哪些中间件?
🔒 熔断(Circuit Breaker):
-
防止调用故障服务造成连锁反应
-
工具:
opossum
(Node.js 熔断器)
🚦 限流(Rate Limiting):
-
限制请求频率
-
工具:
express-rate-limit
、Nginx 限速、Redis 计数器
📉 降级(Fallback):
-
某服务不可用时返回默认数据或提示稍后重试
-
可配合熔断器一起实现 fallback 回调
✅ 10.8 如何监控整个微服务系统的健康状态?用什么工具?
✅ 监控指标:
-
每个服务的 CPU / 内存 / QPS / 响应时间
-
接口错误率、失败请求报警
-
服务是否存活(健康检查)
✅ 工具推荐:
工具 | 说明 |
---|---|
Prometheus | 拉取指标数据,配合 Grafana 展示 |
Grafana | 可视化界面、设置报警规则 |
OpenTelemetry | 全链路追踪、服务调用链分析 |
Jaeger | 服务链路追踪 |
PM2 + Keymetrics | Node.js 特化监控 |
✅ 10.9 微服务部署中你是如何组织目录结构和配置的?
✅ 一般组织方式:
/services/auth-service/user-service/order-service/shared
/dockerdocker-compose.yml
.env
-
每个服务单独 repo 或 mono-repo 中一个文件夹
-
配置统一放
.env
/ config 模块中,使用 dotenv 管理 -
使用
docker-compose
启动多服务
✅ 10.10 NestJS 如何支持微服务?你用过它的 @Microservice() 装饰器吗?
NestJS 内置微服务支持,通过以下方式实现不同协议的服务。
✅ 微服务通信协议支持:
-
TCP(默认)
-
Redis
-
NATS
-
MQTT
-
Kafka
-
gRPC
✅ 使用方式:
const app = await NestFactory.createMicroservice(AppModule, {transport: Transport.TCP,options: { host: '127.0.0.1', port: 3001 },
});
app.listen();
✅ 消息处理:
@MessagePattern('get_user')
handleUser(@Payload() data: any) {return this.userService.findUser(data.id);
}
@MessagePattern()
是微服务专用装饰器,用于监听消息主题,替代 HTTP 的@Get()
、@Post()
✅ 总结表格
编号 | 关键知识点 | 核心工具/关键词 |
---|---|---|
10.1 | 单体 vs 微服务 | 模块拆分、独立部署 |
10.2 | 通信方式 | REST / gRPC / MQ |
10.3 | 注册与发现 | Consul / Eureka / Nacos |
10.4 | 分布式事务 | TCC / SAGA / 事务消息 |
10.5 | 鉴权方案 | JWT / API Key / OAuth2 |
10.6 | 解耦策略 | OpenAPI / 事件驱动 / BFF |
10.7 | 熔断限流降级 | opossum / express-rate-limit / Redis |
10.8 | 服务监控 | Prometheus / Grafana / Jaeger |
10.9 | 项目结构与配置管理 | Mono-repo / Docker / dotenv |
10.10 | NestJS 微服务 | @Microservice() / @MessagePattern() |
相关文章:
NodeJS全栈开发面试题讲解——P10微服务架构(Node.js + 多服务协作)
✅ 10.1 单体架构和微服务的主要区别是什么? 维度单体架构微服务架构模块组织所有功能打包在一个代码仓库中拆分为多个独立服务部署方式部署一次包含全部逻辑各服务独立部署、独立扩缩容开发协作多人协作易冲突团队按服务划分,职责清晰可维护性功能多时…...

【前端】javascript和Vue面试八股
面试暂时没有遇到过考这么深的,一般还是问一些生命周期和性能相关。 Q:什么情况下“ a 1 && a 2 && a 3 ”同时成立 A:对象的valueOf与toString方法:当一个对象与一个原始值(如数字)进…...

WEB3——区块链留言板(留言上链),查看web3日志-入门项目推荐
区块链留言板(留言上链) 目标:构建一个用户可以“写入留言、读取历史留言”的 DApp。 内容: Solidity 编写留言合约,存储留言内容和发送者地址。 提供 API: GET /messages:获取留言列表 POST…...
开源库免费API服务平台 ALLBEAPI
开源库API化平台 ALLBEAPI 🌊 GitHub仓库地址:https://github.com/TingjiaInFuture/allbeapi 为优秀开源库提供免费 API 服务,让开发者无需安装和部署即可直接调用。 🌐 API 接入地址 基础 URL: https://res.allbeapi.top 所…...

【配置vscode默认终端为git bash】
配置vscode默认终端为git bash 点击左下角小齿轮,点击设置,搜索terminal.integrated.profiles.windows,点击在setting.json中编辑 第一部分是当前的所有的终端,第二部分是配置默认的终端"terminal.integrated.defaultProfi…...
Cloudflare
Cloudflare 是一个网络基础设施和网站安全服务提供商,它的主要作用是让网站 更快、更安全、更可靠。简单来说,它是一个“护盾 加速器”。 🧩 Cloudflare 的主要功能: 1. 🚀 加速网站访问(CDN)…...

Cypress + TypeScript + Vue3
🚀 从零构建 Cypress + TypeScript + Vue3 组件测试环境【详细实战教程】 组件测试是前端开发中不可忽视的一环,它能够帮助我们在开发阶段就发现 UI 与交互逻辑问题。本文将带你手把手搭建基于 Cypress + TypeScript + Vue3 的组件测试环境,包含完整目录结构、配置文件、组…...
Oracle DG库控制文件IO错误导致宕机的应急处理
Oracle DG库控制文件IO错误导致宕机的应急处理 事故现场偷天换日棋差一招事故现场 一套Oracle 19c DG环境的备库宕机。 根据告警时间检查实例宕机时间点附近的alert日志有如下重要信息: 2025-05-25T23:34:10.705385+08:00 KCF: read, write or open error, block=0x3377ee …...
技术深度解析:《鸿蒙5.0+:全场景能效的产业革命》
引言:万物智联时代的功耗新范式 产业痛点: 全球IoT设备年耗电量突破200TWh,传统系统架构难以支撑千亿级终端低功耗需求。鸿蒙5.0战略定位: 通过全场景能效架构(端侧极致优化跨端智能…...
Spring Boot启动慢?Redis缓存击穿?Kafka消费堆积?——Java后端常见问题排查实战
Spring Boot启动慢?Redis缓存击穿?Kafka消费堆积?——Java后端常见问题排查实战 引言 Java后端系统因其丰富的技术栈和复杂的业务逻辑,常常面临启动延迟、性能瓶颈、异常错误等多种挑战。从核心语言、Web框架到分布式微服务及缓…...

深入解析 IP 代理:原理、应用场景与优化策略
在当今数字化时代,网络通信的安全性与隐私保护成为人们日益关注的焦点,而 IP 代理作为网络技术领域的一个重要概念,正扮演着愈发关键的角色。本文将深入剖析 IP 代理的原理、广泛的应用场景以及如何对其进行优化,以期为读者提供有…...

58、辣椒种植学习
辣椒(学名:Capsicum annuum)属于茄科辣椒属,是一种重要的蔬菜兼调味作物,具有较高的经济价值和营养价值。其果实富含维生素C、辣椒素等成分,既可鲜食,也可加工成干辣椒、辣椒粉、辣椒酱等产品&a…...

【SpringBoot】零基础全面解析SpringBoot配置文件
本篇博客给大家带来的是SpringBoot配置文件的知识点, 有properties 配置文件 和 yml 配置文件, 目前主流的是yml,所以本文以 重点讲解 yml 配置文件. 🐎文章专栏: JavaEE进阶 👉gitte链接: 薯条不要番茄酱 🚀若有问题 评论区见 ❤ 欢迎大家点…...

python:PyMOL 能处理 *.pdb 文件吗?
PyMOL 完全可以打开并处理 PDB(Protein Data Bank)文件,这是 PyMOL 最主要的功能之一。PDB 格式是结构生物学领域的标准文件格式,专门用于存储生物大分子(如蛋白质、核酸)的三维结构数据。 在 PyMOL 中打开…...

GNSS终端授时之四:高精度的PTP授时
我们在GNSS终端的授时之三:NTP网络授时中介绍了NTP网络授时的基本原理。我们知道了NTP授时的精度跟网络环境相关,即使在局域网中NTP授时的精度也只能到ms级别。如果广域网,经过多级交换机,路由器,由于传输路径和延时的…...
Vim文本编辑器快捷键用法以及简单介绍
目录 vim文本编辑器 简介: 语法: vim模式介绍: 模式切换: 用法: 编辑模式: 一般模式: 命令模式: vim文本编辑器 简介: 在命令行界面下,最常用的文本…...
CppCon 2014 学习:C++ in Huge AAA Games
“Nicolas Fleury, Technical Architect” 这份主题为 “C in Huge AAA Games” 的内容理解,可以从几个方面切入: 1. 背景 AAA大作游戏(Triple-A Games)指的是预算高、规模大、制作精良的顶级游戏项目。这些游戏通常代码库庞大&…...

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术
MYSQL: 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集,失败为false; 成功返回结果:SQL指令没有错误,但是查询结果…...
MapReduce 分布式计算模型
练习题 单词计数 需求:统计每个单词数量 "Hello World Hello Hadoop Hello MapReduce" 实现: map阶段:拆分成单词,执行map函数输出键值对<word, 1> <Hello, 1> <World, 1> <Hello, 1> <…...
Vue3 + Element Plus 防止按钮重复点击的解决方案
在 Vue3 和 Element Plus 项目中,防止按钮重复点击是一个常见的需求,特别是在表单提交、支付等场景下。以下是几种实现方式: 1. 使用 Element Plus 的 loading 状态 Element Plus 的按钮组件本身就支持 loading 状态,这是最简单…...
测试工程师学LangChain之promptTemplate 实战笔记
一、引言:大模型时代的测试自动化革命 2025 年,随着大模型(如 DeepSeek)在自动化测试领域的广泛应用,Prompt 编写已成为测试工程师的核心技能之一。 为什么? 大模型输出的质量 90% 取决于输入的 PromptLangChain 的 PromptTemplate 提供了参数化 Prompt 的标准化方案Ope…...

OpenCV计算机视觉实战(9)——阈值化技术详解
OpenCV计算机视觉实战(9)——阈值化技术详解 0. 前言1. 全局阈值与自适应阈值2. Otsu 算法3. 实战案例:文档扫描中的二值化处理4. 算法对比小结系列链接 0. 前言 在图像处理领域,阈值化 (Binarization) 技术就像一把魔术剪刀&…...

【Tauri2】049——upload
前言 这篇就看看一个简单地插件——upload Upload | Taurihttps://tauri.app/plugin/upload/upload的英文意思是“上传(程序或信息)”。 看来是用来上传文件的。 支持移动端 正文 安装 pnpm tauri add upload 在前后端都会安装,即 .plug…...

4、数据标注的武林秘籍:Label-Studio vs CVAT vs Roboflow
开篇痛点:90%的模型效果取决于数据质量 "标注3小时,训练5分钟"——这是很多AI工程师的真实写照。上周有位读者训练YOLOv12时发现,同样的代码,换批数据mAP直接跌了15%,根本原因是标注不规范!本文…...
MATLAB项目实战:阻尼振动与数据拟合项目
关键技能点说明: 函数定义与匿名函数 使用匿名函数定义微分方程:damped_osc = @(t, Y) [...] 自定义拟合模型函数:model = @(b, t) b(1).*exp(...) 符号计算(可选) 使用符号数学工具箱求解析解:dsolve、diff、simplify 符号表达式数值化:subs + double 数值算法实现 ODE…...
74道Node.js高频题整理(附答案背诵版)
简述 Node. js 基础概念 ? Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它使得JavaScript可以在服务器端运行,从而进行网络编程,如构建Web服务器、处理网络请求等。Node.js采用事件驱动、非阻塞I/O模型,使其轻量且高效…...

Linux 基础IO(上)
目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…...
如何加载私钥为 SecKeyRef
本文介绍如何在 iOS/macOS 下将私钥加载为 SecKeyRef,涵盖 PEM 格式的 ECC 密钥读取、X9.63 数据构建、以及与 Keychain 的集成。 1. 使用 SecKeyCreateWithData 加载私钥 Apple 提供的 SecKeyCreateWithData 方法可以直接将密钥数据加载为 SecKeyRef 对象。 SecK…...
@Pushgateway自定义脚本推送数据
文章目录 Pushgateway 自定义脚本推送数据1. 目的2. 适用范围3. 前提条件4. 操作流程4.1 确定指标类型和格式4.2 编写推送脚本方法一:使用 curl 命令行推送方法二:使用 Python 脚本推送方法三:使用 Python 客户端库推送4.3 设置定时任务4.4 验证数据5. 高级配置5.1 使用基本…...
kubernate解决 “cni0“ already has an IP address different from 10.244.0.1/24问题
问题 NetworkPlugin cni failed to set up pod “coredns-5d4b4db-jkmnl_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 10.244.0.1/24 解决方案 这个问题通常是由于Flannel网络插件残留配置导致的IP地址冲突。以下…...