moleculer简单例子

下面是一个使用 Moleculer 框架的简单微服务示例,包含两个服务(greetermath)以及 API 网关:

步骤 1: 创建项目并安装依赖

1
2
3
4
mkdir moleculer-demo
cd moleculer-demo
npm init -y
npm install moleculer moleculer-web

步骤 2: 创建服务文件

1. math.service.js - 数学服务

1
2
3
4
5
6
7
8
9
10
11
module.exports = {
name: "math",
actions: {
add(ctx) {
return Number(ctx.params.a) + Number(ctx.params.b);
},
multiply(ctx) {
return Number(ctx.params.a) * Number(ctx.params.b);
}
}
};

2. greeter.service.js - 问候服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module.exports = {
name: "greeter",
actions: {
hello(ctx) {
return `Hello, ${ctx.params.name || "World"}!`;
},
welcome: {
params: { name: "string" }, // 参数验证
handler(ctx) {
return `Welcome, ${ctx.params.name}!`;
}
}
}
};

3. gateway.service.js - API 网关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const ApiGateway = require("moleculer-web");

module.exports = {
name: "api",
mixins: [ApiGateway],
settings: {
port: 3000,
routes: [
{
path: "/api",
aliases: {
// 自动将 HTTP 请求映射到服务动作
"GET /math/add": "math.add",
"GET /math/multiply": "math.multiply",
"POST /greet": "greeter.hello",
"GET /welcome/:name": "greeter.welcome"
}
}
]
}
};

4. index.js - 入口文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const { ServiceBroker } = require("moleculer");

// 创建 Broker
const broker = new ServiceBroker({
logger: console, // 使用控制台日志
metrics: true // 启用指标
});

// 加载服务
broker.loadService("./math.service.js");
broker.loadService("./greeter.service.js");
broker.loadService("./gateway.service.js");

// 启动服务
broker.start();

步骤 3: 运行服务

1
node index.js

测试服务

使用 curl 或浏览器测试 API:

1. 数学服务

1
2
3
4
5
curl "http://localhost:3000/api/math/add?a=5&b=3"
# 输出: 8

curl "http://localhost:3000/api/math/multiply?a=4&b=5"
# 输出: 20

2. 问候服务

1
2
3
4
5
curl -X POST "http://localhost:3000/api/greet" -d '{"name": "Alice"}'
# 输出: "Hello, Alice!"

curl "http://localhost:3000/api/welcome/Bob"
# 输出: "Welcome, Bob!"

服务间直接调用(内部通信)

在服务中可以通过 broker.call 调用其他服务:

1
2
3
4
5
6
7
// 在 greeter.service.js 中添加新动作
actions: {
async complexGreeting(ctx) {
const math = await ctx.call("math.add", { a: 10, b: 20 });
return `Math result: ${math}, Hello ${ctx.params.name}!`;
}
}

关键概念说明:

  1. 服务 (Services)

    • 独立的功能单元(如 mathgreeter
    • 通过 actions 暴露功能
  2. 动作 (Actions)

    • 服务的公共方法
    • 支持同步/异步操作
    • 自动生成 REST API(通过网关)
  3. API 网关 (moleculer-web)

    • 将 HTTP 请求路由到服务动作
    • 支持参数映射和验证
  4. 服务间通信

    • 使用 ctx.call("service.action") 调用其他服务
    • 支持同步调用和 Promise
  5. 服务发现

    • 自动发现集群中的服务
    • 无需手动配置服务位置

这个示例展示了 Moleculer 的核心功能:

  • 微服务拆分
  • 自动 REST API 暴露
  • 服务间通信
  • 参数验证
  • 负载均衡(多实例时自动生效)

你可以通过添加更多服务或使用数据库连接(如 MongoDB)、消息队列(如 NATS)等中间件来扩展这个基础结构。