首页 > 编程语言 >什么是微服务架构,Node.js如何支持微服务?

什么是微服务架构,Node.js如何支持微服务?

时间:2024-06-18 16:03:58浏览次数:10  
标签:Node const err 服务 js 架构 port

现代软件开发中,微服务架构成为一种非常流行的设计模式。微服务架构将一个大型的、复杂的应用程序拆分成多个独立的小,每个小服务负责一个特定的业务功能。这种架构设计使得应用程序更加灵活、可扩展,并且易于维护。本文将详细解释微服务架构的概念并探讨Node.js如何支持微服务。

一、什么是微服务架构?

微服务架构(Microservices Architecture)是一种架构风格,它将单一应用程序分解为一组小的服务。每个服务运行在其自身的进程中,并通过轻量级的机制(通常是HTTP资源API)进行通信。这些服务围业务功能构建,并通过自动化部署机制独立部署。这种架构风格强调的是每个模块的独立性,以及这些独立模块之间合理的通信方式。

1.1 微服务架构的特点
  1. 分布式部署每个微服务可以独立部署,这意味着应用的每个部分可以独立构建、测试和部署。
  2. 独立可扩展:每个微服务可以根据需求独立扩展,更加灵活。
  3. 独立开发:不同团队可以同时开发不同的微服务,这加快了开发速度。
  4. 技术多样性:每个微服务可以使用不同的技术栈,只要它们能通过API通信。
  5. 容错性强:如果一个微服务挂了,不会影响到其他微服务的运行。
二、Node.js如何支持微服务架构?

Node.js是一种使用JavaScript编写的服务器端运行环境,因其非阻塞I/O模型,非常适合构建高并发、低延迟的网络应用。Node.js在构建微服务架构方面有其独特的优势。

2.1 使用Express.js进行微服务开发

Express.js一个快速、简洁的Node.js web框架,使用Express可以轻松地创建微服务。下面是一个非常简单的示例,展示了如何使用Express构建一个微服务。

服务1:用户服务
const express = require('expressconst app = express();
const port = 3000;

app.get('/users', (req, res) => {
    res.json([{ id: 1, name: 'John Doe' }]);
});

app.listen(port, () => {
  console.log(`User service listening at http://localhost:${port}`);
});
服务2:订单服务
const express = require('express');
const app = express();
const port = 3001;

app.get('/orders', (req, res) => {
    res.json([{ id: 101, item: 'Laptop', quantity: 1 }]);
});

app.listen(port () => {
  console.log(`Order service listening at http://localhost:${port}`);
});

以上代码展示了如何创建两个独立的微服务,每个服务都有自己独立的,一个是用户服务,另一个是订单服务。

2.2 API Gateway

在微服务架构中,引入API Gateway是一种常见的。API Gateway作为所有客户端请求的入口,负责将请求路由到相应的微服务,并且可以实现负载均衡、认证、缓存等功能。

简单的API Gateway示例:

const express = require('express');
const request = require('request');
const app = express();
const port = 3002;

app.use('/api/users', (req, res) => {
    const url = 'http://localhost:3000/users';
    req.pipe(request(url)).pipe(res);
});

app.use('/api/orders', (req, res) => {
    const url = 'http://localhost:3001/orders';
    req.pipe(request(url)).pipe(res);
});

app.listen(port, () => {
 console.log(`API Gateway running at http://localhost:${port}`);
});
2.3 Service Discovery(服务发现)

在微服务架构中,每个服务可能会有多个实例,因此需要一种机制来发现这些服务。可以使用Consul或Eureka等服务发现工具。下面是使用Node.js和Consul进行服务发现的简单示例:

注册服务
const Consul = require('consul');
const consul = new Consul();

consul.agent.service.register({
  name: 'user-service',
  address: 'localhost',
  port: 3000
}, (err) => {
  if(err) throw err;
  console.log('User service registered with Consul');
});
查找服务
consul.agent.service.list((, services) => {
  if(err) throw err;
  console.log('Registered services:', services);
});
2.4 使用Message Queue(消息队列)

在微服务架构中,消息队列可以用于服务之间的异步通信。比较流行的消息队列有RabbitMQ和Kafka。下面是一个使用RabbitMQ进行消息传递的简单示例:

安装依赖
在开始之前,确保你已经安装RabbitMQ,并安装amqplib:

npm install amqplib
发送消息
const amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', (err, conn) => {
  if(err) throw err;
  conn.createChannel((err, ch) => {
    if(err) throw err;
    const q = 'task_queue';
    const msg = 'Hello World!';
    
    ch.assertQueue(q, { durable: true });
    ch.sendToQueue(q, Buffer.from(msg), { persistent: true });
    console.log(" [x] Sent '%s'", msg);
  });
  
  setTimeout(() => {
    conn.close();
    process.exit(0);
  }, 500);
});
接收消息
const amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', (err, conn) => {
  if(err) throw err;
  conn.createChannel((err, ch) => {
    if(err) throw err;
    const q = 'task_queue';

    ch.assertQueue(q, { durable: true });
    ch.prefetch(1);
    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q);

    ch.consume(q, (msg) =>      const secs = msg.content.toString().split('.').length - 1;
      
      console.log(" [x] Received %s", msg.content.toString());
      
      setTimeout(() => {
        console.log(" [x] Done");
       .ack(msg);
      }, secs * 1000);
    }, { noAck: false });
  });
});
三、总结

通过微服务架构,我们可以将大型应用拆分为多个小型服务,方便维护和扩展。Node.js的阻塞I/O模型和丰富的生态系统使得它非常适合用于构建高性能的微服务架构。通过结合Express.js、API Gateway、服务发现和消息队列等技术,我们能够高效地实现和管理微服务,提升开发效率和系统可维护性。


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

在这里插入图片描述

标签:Node,const,err,服务,js,架构,port
From: https://blog.csdn.net/yuanlong12178/article/details/139776040

相关文章

  • Ceph提供nfs服务
    目录Ceph提供nfs服务1.前期准备1.1检查模块1.2检查是否有nfs-ganesha集群2.创建nfs服务2.1ceph提供的nfs的架构3.nfs导出3.1创建cephfs3.2导出3.3客户端尝试挂载3.4验证4.高可用nfs-ganeshaCeph提供nfs服务ceph除了可以提供cephfs之外,也是可以支持nfs的,因为如果直接......
  • [javascript] JS增强HTML媒体资源的音量
    pre有些页面声音总是太小,又不想调整系统音量,而video标签的volume属性最高只能调到1。于是在网上找到了一个方案:ref:https://atjiu.github.io/2021/05/10/video-above-1.0/ref:https://cwestblog.com/2017/08/17/html5-getting-more-volume-from-the-web-audio-api/codefunc......
  • 3、k8s-服务的部署(nginx)
    说明:pod是kubernetes的最小单元-而容器时运行在pod中的、服务是运行在容器中的、所以:pod>容器>服务  --(这是一个包含的关系) 1、创建部署nginx:kubectlcreatedeploymentnginx--image=nginx:1.14-alpine#kubectlcreatedeployment是一个Kubernetes命令,用于创建一个......
  • 5、k8s-资源管理-yaml语言--使用yaml语言创建nginx服务
    YAML语言是一个类似XML、JSON的标记性语言、他强调以数据为中心、而不是以标识语言为重点、因而YANL本身定义比较简单:对比如下XML语言:<html><age>15</age><address>hainan</address></html>YAML语言:heima:age:15address:hainanyaml语言没有过多的......
  • 服务器硬盘数据怎么恢复?
    在高度信息化的当今,数据的重要性日益凸显。服务器作为企业信息的重要载体,其硬盘中存储的数据更是具有极高的价值。但因为各种意外原因,服务器硬盘数据丢失的情况时有发生,服务器硬盘数据怎么恢复?如何有效地恢复?成为我们必须面对的问题。对于重要数据,我们必然需要想办法找回,不妨一起......
  • 一台20年前的服务器数据恢复案例
    停用十多年的一台老服务器损坏了,最近在查一些档案、记录,需要来调取这台服务器的数据。看看我们能不能提供一些帮助,能让这台服务器呢能恢复机器工作拿到这台机器的时候,我也是一愣,这台机器将近快20年的时间了,谁开会用这么老的机器呢?运行速度也可想而知了,机器是浪潮NP370RG2的,生......
  • 服务器数据恢复成功但无法安装金蝶数据库?
    服务器数据恢复成功但无法安装金蝶数据库?服务器系统安装好了,在安装数据库时需要安装netfromwork3.5,在安装3.5的时候又报错,这个问题应该怎么解决呢?本期告诉你答案,数据恢复完成后,经常帮助他们重装系统,还原数据,还有应用软件配置,这样拿到一台机器,就可以直接使用了。看一个案例,一......
  • 目标检测——室内服务机器人LifelongSLAM数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。OpenLORIS-SceneDataset推动室内服务机器人定位技术的新里程碑随着科技......
  • 14DNS 域名解析服务
    目录14.1BIND域名服务基础14.1.1DNS系统的作用及类型14.1.2BIND的安装和控制1、安装BIND软件2、BIND服务控制14.1.3BIND服务的配置文件1、主配置文件按2、区域数据配置文件14.2使用BIND构建域名服务器14.2.1 构建缓存域名服务器1.建立主配置文件named.conf......
  • pydantic+openai+json: 控制大模型输出的最佳范式
    调用大模型已经是如今做ai项目习以为常的工作的,但是大模型的输出很多时候是不可控的,我们又需要使用大模型去做各种下游任务,实现可控可解析的输出。我们探索了一种和python开发可以紧密合作的开发方法。所有的代码都开源在了GitHub大模型输出是按照token逐个预测然后解码成......