NodeJS全栈开发面试题讲解——P10微服务架构(Node.js + 多服务协作)

news2025/6/4 9:41:27

✅ 10.1 单体架构和微服务的主要区别是什么?

维度单体架构微服务架构
模块组织所有功能打包在一个代码仓库中拆分为多个独立服务
部署方式部署一次包含全部逻辑各服务独立部署、独立扩缩容
开发协作多人协作易冲突团队按服务划分,职责清晰
可维护性功能多时变得复杂,修改风险大单个服务小巧,便于维护和迭代
技术选型通常限制于单一技术栈各服务可用不同技术栈(polyglot)
缺点不易扩展、部署慢、耦合严重运维复杂、服务治理成本高


✅ 10.2 微服务之间如何通信?同步与异步方式分别是什么?

🔹 同步通信(常用):

  • HTTP / REST API(最常见)

  • gRPC(高性能、结构化)

🔹 异步通信:

  • 消息队列:如 RabbitMQ、Kafka、Redis Pub/Sub

  • 事件驱动架构(EDA):服务发布事件,其他服务监听处理

✅ 选择建议:

  • 实时请求场景 → 同步(如:下单、查询用户)

  • 解耦+高并发处理 → 异步(如:发短信、订单通知、日志写入)


✅ 10.3 如何做服务注册与发现?你用过哪些方案?

在大型微服务系统中,服务数量多、地址动态变化,需注册中心协调。

✅ 常见方案:

工具说明
ConsulHashiCorp 出品,支持健康检查
EurekaNetflix 出品,SpringCloud 默认使用
etcd / ZookeeperCAP 选 P,K8s 内部注册服务
Nacos阿里开源,适配 SpringCloud

🛠 使用方式:

  1. 服务启动时向注册中心注册(服务名 + IP + 端口)

  2. 消费者根据服务名获取地址列表,实现负载均衡调用


✅ 10.4 如何处理分布式事务问题?常见解决方案有哪些?

在多个微服务协同处理一个业务请求时,数据一致性成为挑战。

✅ 解决方案:

名称描述代表库/框架
2PC两阶段提交(强一致)XA、Atomikos
TCCTry-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 + KeymetricsNode.js 特化监控


✅ 10.9 微服务部署中你是如何组织目录结构和配置的?

✅ 一般组织方式:

/services
  /auth-service
  /user-service
  /order-service
  /shared
/docker
  docker-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.10NestJS 微服务@Microservice() / @MessagePattern()


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】javascript和Vue面试八股

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

WEB3——区块链留言板(留言上链),查看web3日志-入门项目推荐

区块链留言板(留言上链) 目标:构建一个用户可以“写入留言、读取历史留言”的 DApp。 内容: Solidity 编写留言合约,存储留言内容和发送者地址。 提供 API: GET /messages:获取留言列表 POST…

【配置vscode默认终端为git bash】

配置vscode默认终端为git bash 点击左下角小齿轮,点击设置,搜索terminal.integrated.profiles.windows,点击在setting.json中编辑 第一部分是当前的所有的终端,第二部分是配置默认的终端"terminal.integrated.defaultProfi…

Cypress + TypeScript + Vue3

🚀 从零构建 Cypress + TypeScript + Vue3 组件测试环境【详细实战教程】 组件测试是前端开发中不可忽视的一环,它能够帮助我们在开发阶段就发现 UI 与交互逻辑问题。本文将带你手把手搭建基于 Cypress + TypeScript + Vue3 的组件测试环境,包含完整目录结构、配置文件、组…

深入解析 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级别。如果广域网,经过多级交换机,路由器,由于传输路径和延时的…

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL: 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集,失败为false; 成功返回结果:SQL指令没有错误,但是查询结果…

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%,根本原因是标注不规范!本文…

Linux 基础IO(上)

目录 前言 重谈文件 文件操作 1.打开和关闭 2.对文件打开之后操作 理解文件fd 1.文件fd的分配规则与重定向 2.理解shell中的重定向 3.关于Linux下一切皆文件 关于缓冲区 1.为什么要有缓冲区 2.缓冲区刷新策略的问题 3.缓冲区的位置 前言 本篇到了我们linux中的文件…

el-tree拖拽事件,限制同级拖拽,获取拖拽后节点的前后节点,同级拖拽合并父节点name且子节点加入目标节点里

node-drag-start:开始拖拽节点时触发​​(按下鼠标按钮),无论是否允许放置,此事件都会触发。 allow-drop 返回 true 才能触发@node-drag-end="handleDragend"、@node-drop="handleDrop"; (1)allow-drop:动态控制​​是否允许放置; (2)node-dr…

day62—DFS—太平洋大西洋水流问题(LeetCode-417)

题目描述 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , hei…

《Python基础》第2期:环境搭建

在开始编写 Python 代码前,还需要搭建 Python 的开发环境。 电脑是没办法直接读懂 Python 代码的,而是需要一个解释器,实时把代码翻译成字节码,字节码再转换成 0 和 1,电脑就能读懂了。 Python 的运行过程就是翻译一行…

WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?

在 WSL 的 Debian 12 系统中安装 curl 非常简单,你可以直接使用 APT 包管理器从官方仓库安装。以下是详细步骤: 1. 更新软件包索引 首先确保系统的包索引是最新的: sudo apt update2. 安装 curl 执行以下命令安装 curl: sudo…

[CSS3]vw/vh移动适配

vw/vh 目标: 能够使用vw单位设置网页元素的尺寸 相对单位相对视口的尺寸计算结果.vw全称viewport width; 1vw1/100视口宽度 vh全称viewport height; 1vh1/100视口高度 体验vw和vh单位 <!DOCTYPE html> <html lang"en"> <head><meta charset…

YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29

YOLOX 的动态标签分类&#xff08;如 SimOTA&#xff09;与 Anchor-free 机制是其核心改进中的两个关键部分&#xff0c;它们在目标检测中的作用和实现方式存在显著差异。以下从原理、实现细节及效果三个方面进行详细对比&#xff1a; 一、核心原理与目标 1. Anchor-free 机制…