随着时间的流逝,每个项目都会增长,并且将新功能实现到现有的整体中对于业务而言变得越来越困难,时间更长且成本更高。
解决此问题的方法之一是使用微服务架构。 对于初学者或对于初次接触该体系结构的人而言,可能很难弄清从哪里开始,需要做什么以及不值得做什么。
本文将在Node.js和RabbitMQ上编写最简单的微服务,并说明将整体迁移到微服务的过程。
微服务架构中有什么?
- 网关 接收请求并将其重定向到所需微服务的主服务器。 通常,网关中没有业务逻辑。
- 微服务。 微服务本身,使用明确定义的业务逻辑处理用户请求。
- 交通运输 这是网关与微服务之间进行通信的部分。 传输方式可以是HTTP,gRPC,RabbitMQ等。
为什么选择RabbitMQ?
当然,您不能使用RabbitMQ,微服务之间还有其他通信选项。 最简单的是HTTP,Google提供了gRPC。
我使用RabbitMQ的原因是,我发现它足够简单,可以开始编写微服务,可靠且方便,因为您可以确保通过将消息发送到队列中,消息将到达微服务(即使此刻已关闭然后再打开) ) 由于这些优点,您可以编写可靠的微服务并使用无缝部署。
开始
首先,我们实现了一个简单的网关,该网关将在侦听特定端口时接收HTTP请求。
我们部署RabbitMQ(通过它,我们的微服务和网关将进行通信):
$ docker run -d -p 5672:5672 rabbitmq
我们初始化项目并安装micromq NPM软件包:
$ npm init -y $ npm i micromq -S
编写网关
运作方式:
- 服务器启动,开始监听端口并接收请求
- 用户向https://mysite.com/friends发送请求
- 根据我们描述的逻辑,网关将请求委托:
3.1正在将一条消息(请求参数,标头,连接信息等)发送到RabbitMQ队列
3.2。 微服务侦听此队列,处理新请求
3.3。 微服务将响应发送到队列
3.4。 网关侦听响应队列,从微服务接收响应
3.5。 网关向客户端发送响应 - 用户收到响应。
我们写了一个微服务
运作方式:
- 微服务启动,开始侦听网关将写入的请求队列。
- 微服务通过所有可用的中间件运行来接收,处理请求
- 微服务向网关发送响应
3.1。 消息正在发送(标头,HTTP代码响应主体)到RabbitMQ队列
3.2。 网关侦听此队列,接收消息,找到需要向其发送响应的客户端
3.3网关向客户端发送响应
整体迁移到微服务架构
假设我们已经有一个快速应用程序,并且我们想开始将其移植到微服务中。
看起来像这样:
const express = require('express'); const app = express(); app.get('/balance', (req, res) => { res.json({ amount: 500, }); }); app.get('/friends', (req, res) => { res.json([ { id: 1, name: 'Mikhail Semin', }, { id: 2, name: 'Ivan Ivanov', }, ]); }); app.get('/status', (req, res) => { res.json({ text: 'Thinking...', }); }); app.listen(process.env.PORT);
我们想从中获得2个端点:/朋友和/状态。 为此我们需要做什么?
- 将业务逻辑引入微服务
- 实现对这两个端点的请求委托给微服务
- 获得微服务的回应
- 发送回复给客户
在上面的示例中,当我们创建用户微服务时,我们实现了两个方法/ friend和/ status,它们的功能与我们的独有功能相同。
为了将请求从网关代理到微服务,我们将通过将中间件连接到我们的快速应用程序来使用相同的包:
const express = require('express');
这与上面的示例中编写干净的Gateway的方式相同。 在此示例中,唯一的区别在于,不是网关接受请求,而是用express编写的整体。
接下来是什么
- 从微服务到整体/网关的RPC(远程操作调用)(例如,用于授权)
- 通过RabbitMQ队列在微服务之间进行通信以获取更多信息,因为每个微服务都有自己的数据库
我已经在“学习通过RabbitMQ在Node.js上的微服务之间进行通信”一文中说过这一点。