飞速入门 Axon:Node.js 微服务的轻量级选择

前言

注:本篇文章仅面向微服务小白!!

在构建微服务架构时,选择合适的通信工具至关重要。

比如《Node.js微服务》这本书使用的 Node 微服务框架是seneca

今天主要来介绍一下axon!

axon 是一个轻量级、高性能的 Node.js 库,专注于实现简单的 RPC(远程过程调用)通信。它基于 ZeroMQ,提供了简单易用的 API,适合快速开发轻量级微服务。

为什么选择 Axon?

  1. 轻量级axon 的设计目标是简单和高效,没有复杂的依赖和配置。
  2. 高性能 :基于 ZeroMQ【ZeroMQ(也称为 ØMQ 或 0MQ)是一个高性能的异步消息库,用于构建分布式和并发应用程序。具体我也不太懂,差不多了解下就可以,今天主角是axon】axon 提供了高性能的通信机制。这些东西全看不懂都没事,你只要记住 axon 用来 rpc 就完事了,能看懂代码最重要!!文章后面会安排示例代码的!!
  3. 易于使用:API 简洁明了,适合快速开发和原型设计。
  4. 灵活性高:可以轻松扩展和定制,适合各种规模的项目。

安装 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);
    }
})();

运行示例

  1. 启动服务端

    bash 复制代码
    node server.js
  2. 启动客户端

    bash 复制代码
    node 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 本身是一个轻量级的库,但它可以与其他工具和库结合使用,以实现更复杂的功能。例如,你可以使用 axonexpress 结合,实现 HTTP 和 TCP(注意:axon这个库是基于TCP的!!) 的混合通信。

总结

axon 是一个轻量级、高性能的 Node.js 微服务通信库,适合快速开发和原型设计。通过简单的 API,你可以轻松实现客户端和服务端之间的 RPC 通信。

希望这篇文章可以帮助你更快拥抱 Node.js 微服务

下次见!🫏....🫏..🫏........🫏..🫏..🫏....

相关推荐
慕容静漪9 分钟前
本地部署Code Llama大模型结合Text generation Web UI远程运行LLM
开发语言·后端·golang
bobz96512 分钟前
AI-2-1
后端
Thanks_ks19 分钟前
探秘 Ruby 与 JavaScript:动态语言的多面风采
javascript·ruby·应用场景·动态语言·语法特性·开发体验·任务管理系统
勘察加熊人21 分钟前
vue自定义颜色选择器
javascript·vue.js·ecmascript
zy01010128 分钟前
useEffect
开发语言·前端·javascript·react·useeffect
kovlistudio33 分钟前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
zx13231 小时前
chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
开发语言·javascript·ecmascript
橘右溪1 小时前
Node.js中URL模块详解
node.js
橘右溪1 小时前
Node.js net模块详解
node.js
你们补药再卷啦1 小时前
springboot 项目 jmeter简单测试流程
java·spring boot·后端