前言
注:本篇文章仅面向微服务小白!!
在构建微服务架构时,选择合适的通信工具至关重要。
比如《Node.js微服务》这本书使用的 Node 微服务框架是seneca
今天主要来介绍一下axon
!
axon
是一个轻量级、高性能的 Node.js 库,专注于实现简单的 RPC(远程过程调用)通信。它基于 ZeroMQ,提供了简单易用的 API,适合快速开发轻量级微服务。
为什么选择 Axon?
- 轻量级 :
axon
的设计目标是简单和高效,没有复杂的依赖和配置。 - 高性能 :基于 ZeroMQ
【ZeroMQ(也称为 ØMQ 或 0MQ)是一个高性能的异步消息库,用于构建分布式和并发应用程序。具体我也不太懂,差不多了解下就可以,今天主角是axon】
,axon
提供了高性能的通信机制。这些东西全看不懂都没事,你只要记住 axon 用来 rpc 就完事了,能看懂代码最重要!!文章后面会安排示例代码的!!
- 易于使用:API 简洁明了,适合快速开发和原型设计。
- 灵活性高:可以轻松扩展和定制,适合各种规模的项目。
安装 Axon
安装 axon
:
bash
npm install axon
基本概念
axon
提供了两种类型的套接字:
req
(request,请求套接字) :用于客户端,发送请求并接收响应。rep
(response,响应套接字) :用于服务端,接收请求并发送响应。
示例代码(重要)
服务端
服务端使用 rep
套接字监听请求,并根据请求内容返回响应。
javascript
// server.js
const axon = require('axon');
const sock = axon.socket('rep'); // 创建一个响应套接字
// 配置服务端监听的地址和端口
// 这些代码部署到服务器上之后 此处的host就是服务器的 ip 地址
const host = '127.0.0.1';
const port = 3000;
// 绑定端口并开始监听
sock.bind(port, host, () => {
console.log(`Axon server is running on ${host}:${port}`);
});
// 处理接收到的请求
sock.on('message', (req, callback) => {
console.log('Received request:', req);
const { route, body } = req;
// 根据路由处理请求
switch (route) {
case 'hello':
callback(null, { code: 2000, data: `Hello, ${body.name}!` });
break;
case 'add':
if (body.a !== undefined && body.b !== undefined) {
callback(null, { code: 2000, data: body.a + body.b });
} else {
callback(null, { code: 2001, data: 'Invalid parameters' });
}
break;
default:
callback(null, { code: 2002, data: 'Route not found' });
}
});
客户端
客户端使用 req
套接字连接到服务端,发送请求并接收响应。
javascript
// client.js
const axon = require('axon');
const sock = axon.socket('req'); // 创建一个请求套接字
// 配置服务端地址和端口
const host = '127.0.0.1';
const port = 3000;
// 连接到服务端
sock.connect(port, host, () => {
console.log(`Connected to axon server at ${host}:${port}`);
});
// 发送请求
function sendRequest(route, body) {
return new Promise((resolve) => {
// 设置超时检测
let timedCheckRes = setTimeout(() => {
console.error('Request timed out');
clearTimeout(timedCheckRes);
timedCheckRes = null;
resolve({ code: 2001, data: 'Request timed out' });
}, 15000);
// 发送请求
sock.send({ route, body }, (err, res) => {
clearTimeout(timedCheckRes);
timedCheckRes = null;
if (err) {
console.error('Error:', err);
resolve({ code: 2001, data: 'Request error' });
} else {
console.log('Received response:', res);
resolve(res);
}
});
});
}
// 测试发送请求
(async () => {
try {
const response1 = await sendRequest('hello', { name: 'JJQ' });
console.log('Response 1:', response1);
const response2 = await sendRequest('add', { a: 5, b: 3 });
console.log('Response 2:', response2);
const response3 = await sendRequest('unknown', {});
console.log('Response 3:', response3);
} catch (error) {
console.error('Error:', error);
}
})();
运行示例
-
启动服务端:
bashnode server.js
-
启动客户端:
bashnode client.js
输出示例
服务端输出
css
Axon server is running on 127.0.0.1:3000
Received request: { route: 'hello', body: { name: 'JJQ' } }
Received request: { route: 'add', body: { a: 5, b: 3 } }
Received request: { route: 'unknown', body: {} }
客户端输出
yaml
Connected to axon server at 127.0.0.1:3000
Received response: { code: 2000, data: 'Hello, JJQ!' }
Response 1: { code: 2000, data: 'Hello, JJQ!' }
Received response: { code: 2000, data: 8 }
Response 2: { code: 2000, data: 8 }
Received response: { code: 2002, data: 'Route not found' }
Response 3: { code: 2002, data: 'Route not found' }
高级用法
先将前方的内容看熟 进阶后续再看
超时处理
在客户端代码中,我们使用了超时机制来处理请求超时的情况。如果服务端在指定时间内没有响应,客户端将返回超时错误。
错误处理
在服务端和客户端代码中,我们都对错误进行了处理。服务端在处理请求时可能会遇到错误,客户端在发送请求时也可能会遇到网络问题等。通过合理的错误处理,可以提高系统的健壮性。
扩展功能
axon
本身是一个轻量级的库,但它可以与其他工具和库结合使用,以实现更复杂的功能。例如,你可以使用 axon
与 express
结合,实现 HTTP 和 TCP(注意:axon这个库是基于TCP的!!) 的混合通信。
总结
axon
是一个轻量级、高性能的 Node.js 微服务通信库,适合快速开发和原型设计。通过简单的 API,你可以轻松实现客户端和服务端之间的 RPC 通信。
希望这篇文章可以帮助你更快拥抱 Node.js 微服务
下次见!🫏....🫏..🫏........🫏..🫏..🫏....