HOW - Moleculer 微服务构建分布式服务系统

文章目录

Moleculer 是一个 Node.js 微服务框架 ,专门用于构建 分布式服务系统

它的设计目标类似于 Java 里的 Spring CloudApache Dubbo,但更适合 Node.js 生态。

一、Moleculer 的核心架构

Moleculer 的基本单元是 Service

典型架构:

复制代码
API Gateway
      |
      v
+-------------------+
|  Moleculer Broker |
+-------------------+
   |      |      |
   v      v      v
UserSvc OrderSvc ProductSvc

核心组件:

概念 作用
Service 业务模块
Broker 服务运行容器
Action 服务方法(RPC)
Event 事件通信
Transporter 服务发现 & 消息传输

二、最基础实践(服务设计)

1 创建 Broker

js 复制代码
const { ServiceBroker } = require("moleculer");

const broker = new ServiceBroker({
  nodeID: "node-1",
  transporter: "NATS"
});

broker.start();

transporter 用于:

  • 服务发现
  • RPC通信
  • 事件分发

常见:

  • NATS
  • Redis
  • Apache Kafka

2 定义 Service

js 复制代码
broker.createService({
  name: "users",

  actions: {
    get(ctx) {
      return { id: ctx.params.id, name: "Tom" };
    }
  }
});

调用:

js 复制代码
broker.call("users.get", { id: 1 });

返回:

复制代码
{ id: 1, name: "Tom" }

三、实践一:API Gateway

通常用 moleculer-web

安装:

复制代码
npm install moleculer-web

网关:

js 复制代码
const ApiGateway = require("moleculer-web");

broker.createService({
  mixins: [ApiGateway],

  settings: {
    routes: [
      {
        path: "/api",

        aliases: {
          "GET users/:id": "users.get"
        }
      }
    ]
  }
});

访问:

复制代码
GET /api/users/1

自动调用:

复制代码
users.get

四、实践二:服务拆分(真实微服务)

推荐结构:

复制代码
services/
  users.service.js
  orders.service.js
  products.service.js
gateway.service.js

例如:

users.service.js

js 复制代码
module.exports = {
  name: "users",

  actions: {
    get(ctx) {
      return { id: ctx.params.id, name: "Tom" };
    }
  }
};

orders.service.js

js 复制代码
module.exports = {
  name: "orders",

  actions: {
    create(ctx) {
      return {
        orderId: 100,
        user: ctx.params.userId
      };
    }
  }
};

五、实践三:服务之间调用

js 复制代码
actions: {
  async createOrder(ctx) {
    const user = await ctx.call("users.get", { id: ctx.params.userId });

    return {
      order: 1,
      user
    };
  }
}

这就是:

复制代码
RPC service call

六、实践四:事件驱动

发布事件:

js 复制代码
broker.emit("user.created", {
  id: 1,
  name: "Tom"
});

监听事件:

js 复制代码
events: {
  "user.created"(payload) {
    console.log("User created", payload);
  }
}

适用于:

  • 订单创建
  • 用户注册
  • 日志
  • 数据同步

七、实践五:数据库集成

常见搭配:

数据库 用法
MongoDB moleculer-db
PostgreSQL ORM
MySQL ORM

例如:

js 复制代码
const DbService = require("moleculer-db");

module.exports = {
  name: "users",
  mixins: [DbService]
};

八、实践六:服务发现

如果使用:

复制代码
transporter: "NATS"

Moleculer 会自动实现:

  • 服务注册
  • 服务发现
  • 负载均衡

例如:

复制代码
users.get

可能被:

复制代码
node-1
node-2
node-3

轮询处理。

九、实践七:容错机制

Moleculer 内置:

功能 说明
retry 自动重试
timeout RPC超时
circuit breaker 熔断
rate limit 限流

例如:

js 复制代码
actions: {
  get: {
    timeout: 2000,
    retries: 3,

    handler(ctx) {
      return { ok: true };
    }
  }
}

十、生产环境常见架构

真实项目常见结构:

复制代码
                +----------------+
                | API Gateway    |
                +----------------+
                         |
         +---------------+----------------+
         |                                |
   +------------+                   +------------+
   | User Svc   |                   | Order Svc  |
   +------------+                   +------------+
         |                                |
   +------------+                   +------------+
   | MySQL      |                   | MySQL      |
   +------------+                   +------------+

消息总线:

复制代码
NATS / Kafka

十一、Moleculer 最大优势

优势 说明
开箱即用 微服务能力内置
RPC 调用 非常简单
自动服务发现 不需要额外组件
事件系统 内置
性能高 Node生态中非常快

很多 Node 微服务项目会用它替代:

  • Express.js
  • NestJS

十二、Moleculer 的缺点

实践中也有一些问题:

问题 说明
社区不算特别大 相比 NestJS
TypeScript 生态一般
运维复杂度上升 微服务固有问题

十三、一个真实企业实践(简化版)

复制代码
API Gateway
   |
   v
Moleculer Broker Cluster
   |
   +-- user-service
   +-- order-service
   +-- payment-service
   +-- notification-service
   |
   +-- Redis
   +-- MySQL

通信:

复制代码
RPC + Event
相关推荐
张忠琳13 小时前
【k3s】AutoK3s v0.9.3 Part 1 入口与 CLI 命令模块 — 超深度逐行分析之三
云原生·容器·kubernetes·k3s·autok3s
m0_5257247216 小时前
AIOps全链路智能运维架构揭秘
云原生·devops
阿图灵17 小时前
Agentic AI 架构入门(九):Agent 通信协议全景——ACP/A2A/AG-UI/MCP
人工智能·ui·架构·ai agent·智能体·mcp·agentic ai
这个DBA有点耶18 小时前
3000万个应用共享一套数据库:多租户“逻辑表”架构是如何做到的?
数据库·架构·dba
消失的旧时光-194318 小时前
第一篇:Ktor Client 到底是什么?从 Retrofit 迁移理解 Ktor 网络请求架构
网络·架构·retrofit·ktor·dsl
zlinear数据采集卡18 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
香菜TTT18 小时前
主从架构锁丢失问题-----RedLock
架构
Rain的Java大神之路19 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq
这个DBA有点耶19 小时前
DBA进阶之路:从“修数据库”到“管架构债”
数据库·架构·dba
xiaoxiangsiyan20 小时前
企业日常运维高频应用服务全解
运维·网络·云原生·容器·dns