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
相关推荐
KKKlucifer2 小时前
零信任架构下的安全服务:动态防御与持续合规双驱动
安全·架构
偷吃的耗子2 小时前
大数据报表系统技术方案与业务方案设计
大数据·架构
merlin-mm2 小时前
GPU 间的通信方式
云原生·容器·kubernetes
Nile3 小时前
解密openclaw底层pi-mono架构系列一:1.从架构到实战
架构
霖霖总总3 小时前
[Redis小技巧5]Redis Sorted Set 深度解析:从跳表原理到亿级排行榜架构
redis·架构
编码如写诗3 小时前
【k8s】arm架构从零开始在线/离线部署k8s1.34.5+KubeSphere3.4.1
arm开发·架构·kubernetes
天涯明月19933 小时前
微服务架构实战指南:从理论到实践
微服务·云原生·架构
电子科技圈4 小时前
从工具到平台:如何化解跨架构时代的工程开发和管理难题
人工智能·设计模式·架构·编辑器·软件工程·软件构建·设计规范
min1811234564 小时前
PC流程图模板大全 中文定制化满足不同行业需求
架构·pdf·流程图