文章目录
- [一、Moleculer 的核心架构](#一、Moleculer 的核心架构)
- 二、最基础实践(服务设计)
-
- [1 创建 Broker](#1 创建 Broker)
- [2 定义 Service](#2 定义 Service)
- [三、实践一:API Gateway](#三、实践一:API Gateway)
- 四、实践二:服务拆分(真实微服务)
- 五、实践三:服务之间调用
- 六、实践四:事件驱动
- 七、实践五:数据库集成
- 八、实践六:服务发现
- 九、实践七:容错机制
- 十、生产环境常见架构
- [十一、Moleculer 最大优势](#十一、Moleculer 最大优势)
- [十二、Moleculer 的缺点](#十二、Moleculer 的缺点)
- 十三、一个真实企业实践(简化版)
Moleculer 是一个 Node.js 微服务框架 ,专门用于构建 分布式服务系统。
它的设计目标类似于 Java 里的 Spring Cloud 或 Apache 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