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
相关推荐
天空属于哈夫克32 天前
企业微信二次开发:精准实现关键词自动回复
架构·企业微信
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
晨米酱2 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
codeejun2 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
moMo2 天前
从固定流程到问题路由:让 LangGraph RAG 按需检索
架构
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
白远山2 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
LorryJovens2 天前
【LAAP科研】双系统具身AGI范式研究——基于LAAP认知架构与Jev概率决策模型的系统性技术调研与范式验证
人工智能·gpt·安全·架构