介绍
NATS是一个开源的高性能消息传输系统,通常被描述为云的中央神经系统
。它能够每秒路由数百万条消息,这使得它非常适合连接微服务和物联网(物联网)设备。
NATS 是一个 _PubSub 消息系统。在这种类型的系统中,一个或多个 publishers 向 _message 经纪人发送具有特定主题的消息,而消息经纪人将这些消息发送给任何客户端,或给定主题的 subscribers 出版商不知道,甚至不关心订阅者,反之亦然。这个架构使系统易于扩展并添加新功能,因为我们可以添加出版商和订阅者而不会影响系统的其他部分。
在本教程中,我们将安装gnatsd
,官方的NATS服务器,作为一个服务,并以安全的方式使其可访问,我们还将创建一个基本的服务器过度负荷警报系统,当服务器负荷过高时发送电子邮件,使用gnatsd
作为其消息经纪人。
前提条件
要完成本教程,您将需要:
- 一个新的 Ubuntu 16.04 服务器.
- 一个具有
sudo
特权的标准用户帐户. 您可以按照 Ubuntu 16.04 初始服务器设置设置一个标准帐户。
步骤 1 – 下载 NATS 服务器
让我们开始下载gnatsd
服务器,并确保它在我们的系统上运行,没有任何问题。
在本教程撰写时,最新的稳定gnatsd
版本是版本 0.9.4 您可以检查 NATS 下载页面以获取更晚的版本,并根据需要调整下面的命令,如果你想使用更新的版本。
首先,使用您的非根帐户登录您的服务器:
1ssh sammy@your_server_ip
然后,请确保您在用户的家庭目录中:
1cd
接下来,使用wget
将gnatsd
下载到您的服务器:
1wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip
你刚刚下载的档案是一个压缩的档案,所以你需要安装unzip
来提取文件。
1sudo apt-get install -y unzip
然后使用unzip
来提取gnatsd
:
1unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd
然后使gnatsd
可执行,以便您可以运行它:
1chmod +x gnatsd
让我们测试一下我们可以从当前目录中运行gnatsd
,使用以下命令开始gnatsd
:
1./gnatsd --addr 127.0.0.1 --port 4222
您看到的输出将类似于这个示例:
1[secondary_label Output]
2[1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4
3[1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on 127.0.0.1:4222
4[1851] 2016/09/23 05:20:02.248626 [INF] Server is ready
默认情况下,gnatsd
在端口4222
上听到0.0.0.0
地址,这对应于所有接口。 使用--port
参数,你可以更改端口,并且通过--addr
你可以更改它在端口上听到的地址。 我们用--addr 127.0.0.1
运行了gnatsd
,所以它只能在我们的服务器中使用,并且无法被外部客户端访问。 在教程中,我们将保护gnatsd
并向世界开放。
按CTRL+C
关闭gnatsd
。
现在你知道事情工作了,让我们以更正式的方式来安排事情。
步骤 2 — 创建目录结构和配置文件
在第三方Linux上,服务相关的软件经常被保存在/srv
目录下,我们会遵循这一惯例,并将NATS相关的文件保存在/srv/nats
下,我们会将gnatsd
可执行文件放置在/srv/nats/bin
。
首先,创建 /srv/nats/bin
文件夹:
1sudo mkdir -p /srv/nats/bin
然后将gnatsd
移动到/srv/nats/bin
文件夹:
1sudo mv ~/gnatsd /srv/nats/bin
服务器可以从一个文件中加载其配置,当我们需要在教程中更改服务器设置时,它将非常有用。
1sudo nano /srv/nats/gnatsd.config
并将以下内容添加到文件中:
1[label /srv/nats/gnatsd.config]
2port: 4222
3net: '127.0.0.1'
此配置文件告诉gnatsd
服务器在地址127.0.0.1
上的端口4222
上倾听,就像以前一样,但这次我们不必在命令行中指定这些选项。
让我们再次运行服务器,以确保我们已经正确配置了东西. 执行以下命令以使用新配置文件启动gnatsd
:
1/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
结果类似于你以前看到的:
1[secondary_label Output]
2[1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4
3[1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on 127.0.0.1:4222
4[1869] 2016/06/18 05:30:55.989562 [INF] Server is ready
再次点击CTRL+C
关闭gnatsd
并返回您的提示.现在让我们创建一个将运行该服务的用户。
步骤三:创建服务用户
运行每个服务以自己的用户帐户是良好的安全实践,以限制如果服务受到破坏的损害。
首先,让我们创建一个名为nats
的系统用户和组:
1sudo adduser --system --group --no-create-home --shell /bin/false nats
1[secondary_label Output]
2Adding system user `nats' (UID 106) ...
3Adding new group `nats' (GID 114) ...
4Adding new user `nats' (UID 106) with group `nats' ...
5Not creating home directory `/home/nats'.
我们将/bin/false
壳分配给nats
系统用户,以禁用该用户的登录,并抑制了家庭目录创建。
让我们将/srv
目录的所有者更改为nats
用户和组:
1sudo chown -R nats:nats /srv
现在我们已经创建了nats
用户和组,让我们继续创建NATS服务。
步骤 4 — 运行 gnatsd 作为服务
我们希望gnatsd
在系统启动时启动,如果它崩溃时重新启动,我们将使用 _systemd_来处理此问题。
systemd是Linux系统的服务管理器,负责在启动时启动服务,必要时重新启动服务,并在系统关机时以控制的方式停止服务。
我们需要创建 service configuration 以定义如何和何时启动 NATS 服务. 用户创建的服务文件生活在 /etc/systemd/system
中,因此创建文件 /etc/systemd/system/nats.service
:
1sudo nano /etc/systemd/system/nats.service
在文件中,放置此脚本来定义gnatsd
应该如何开始:
1[label /etc/systemd/system/nats.service]
2[Unit]
3Description=NATS messaging server
4
5[Service]
6ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
7User=nats
8Restart=on-failure
9
10[Install]
11WantedBy=multi-user.target
*[单位]
部分包含有关服务的通用信息,例如描述
描述服务。
*[服务]
部分包含与服务相关的配置。ExecStart
是运行服务器的命令。我们在这里使用可执行的gnatsd
绝对路径。Restart=on-failure
意味着如果服务出现故障或故障,则必须重新启动服务。如果系统d 阻止了,则不会重新启动。
一旦服务描述到位,我们可以用以下命令开始:
1sudo systemctl start nats
让我们通过发送一个PING
消息来确认gnatsd
正在运行:
1printf "PING\r\n" | nc 127.0.0.1 4222
我们刚刚使用nc
来与gnatsd
进行通信。nc
是一种命令行工具,用于与TCP或UDP服务器进行通信。
1[secondary_label Output]
2INFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576}
3PONG
响应PONG
让我们知道服务器正在收听并按预期工作,我们需要执行最后一个命令来使我们的NATS服务器启动:
1sudo systemctl enable nats
您将看到以下输出,确认该服务已安装:
1[secondary_label Output]
2Created symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.
我们成功配置了gnatsd
作为一个服务,现在让我们保护它,让它可以访问外部客户端。
步骤 5 – 确保与 NATS 服务的连接
如果我们希望使用的所有出版商和订阅者在同一台服务器上运行gnatsd
,我们可以称之为完成并继续运行,但今天这种情况很少发生。
gnatsd
支持 TLS 传输,因此我们将使用它来确保 gnatsd
和 NATS 客户之间的通信。
首先,我们需要一个证书. 您可以购买一个商业证书,从 Let's Encrypt获取一个证书,或者生成一个自签名的证书。
创建一个目录,暂时保留证书:
1mkdir ~/priv
然后使用以下命令创建自签证书:
1openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
2 -keyout priv/gnatsd.key -out priv/gnatsd.crt \
3 -subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"
此命令创建了一个 RSA 证书,具有 2048 位和 10 年的有效期. 请注意,我们已经使用任意域名,因为我们不会在本文中启用gnatsd
服务器的 TLS 验证。
你现在应该在~/priv
目录中有gnatsd.key
和gnatsd.crt
的文件,让我们在我们的/srv/nats/
目录结构下移动这些文件,这样一切都在一个地方。
1sudo mv ~/priv /srv/nats
现在,让/srv/nats/priv
仅适用于nats
用户和组:
1sudo chmod 440 /srv/nats/priv/*
2sudo chmod 550 /srv/nats/priv
3sudo chown -R nats:nats /srv/nats/priv
现在我们更新 /srv/nats/gnatsd.config
以包含我们刚刚创建的证书和密钥。
1sudo nano /srv/nats/gnatsd.config
并添加以下部分,告诉gnatsd
使用您的证书和密钥:
1[label /srv/nats/gnatsd.config]
2. . .
3
4tls {
5 cert_file: "/srv/nats/priv/gnatsd.crt"
6 key_file: "/srv/nats/priv/gnatsd.key"
7 timeout: 1
8}
保存文件并离开编辑器,然后重新启动服务,以便它可以收集更改。
1sudo systemctl restart nats
让我们测试我们的证书是否有效。运行此命令:
1printf "PING\r\n" | nc localhost 4222
这一次,命令输出此消息:
1[secondary_label Output]
2INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3
4-ERR 'Secure Connection - TLS Required'
服务器返回了-ERR``安全连接 - TLS 要求
消息,确认新配置已被接收并需要安全连接,而nc
不知道如何做。
为了能够在没有安装完整的NATS客户端的情况下与我们的NATS服务进行通信,我们将使用一个名为 catnats 的工具。
1wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py
使之可行:
1chmod +x catnats.py
最后,将catnats.py
移动到/srv/nats/bin
文件夹,并将其更名为catnats
:
1sudo mv catnats.py /srv/nats/bin/catnats
让我们检查我们是否可以使用catnats
与我们的NATS服务进行通信,通过发送我们之前发送的相同的PING
消息:
1printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
您将看到此输出,表示我们的连接是安全的:
1[secondary_label Output]
2INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3PONG
现在我们已经确保了通信,让我们启用身份验证,以便需要用户名和密码连接到NATS。
步骤 6 – 要求身份验证
我们的NATS服务不需要默认身份验证,这在服务只能在私人网络上访问时是好的,但我们希望我们的NATS服务能够在互联网上访问,所以我们应该启用身份验证。
打开 /srv/nats/gnatsd.config
文件:
1sudo nano /srv/nats/gnatsd.config
我们将使用user1
作为用户名和pass1
作为本教程的密码。
1[label /srv/nats/gnatsd.config]
2. . .
3
4authorization {
5 user: user1
6 password: pass1
7}
保存文件,然后将/srv/nats/gnatsd.config
的所有者更改为nats
,并使该用户能够阅读,以保护用户名和密码免受系统上的其他用户的影响:
1sudo chown nats /srv/nats/gnatsd.config
2sudo chmod 400 /srv/nats/gnatsd.config
然后重新启动服务,以便更改生效:
1sudo systemctl restart nats
让我们将一个PING
消息发送到gnatsd
来检查一切是否正常. 再次使用catnats
发送消息:
1printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
您将看到以下输出:
1[secondary_label Output]
2NFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3-ERR 'Authorization Violation'
这告诉我们,这些更改已成功应用,我们现在需要发送正确的用户名和密码才能连接到服务. 让我们再试一次,这次提供用户名用户1
和密码pass1
:
1printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1
这次它工作了,正如你可以从以下输出中看到的:
1[secondary_label Output]
2INFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3+OK
4PONG
现在我们已经将此服务限制在知道用户名和密码的客户端,我们可以重新配置该服务,以便外部客户端可以连接。
第7步:向世界开放服务
我們已設定我們的 NATS 伺服器來聆聽「127.0.0.1」,這是本地接口. 如果我們讓它聆聽「0.0.0.0.0」,那麼它將可供全世界使用。
1sudo nano /srv/nats/gnatsd.config
然后更改与net
设置相关的IP地址:
1[label /srv/nats/gnatsd.config]
2. . .
3net: '0.0.0.0'
4. . .
保存文件并重新启动服务:
1sudo systemctl restart nats
现在我们的NATS服务已经为外部客户端连接做好了准备. 要了解如何使用它,让我们创建一个简单的监控服务,使用我们的NATS服务器作为消息经纪人。
步骤 8 — (可选) 配置服务器过载通知
在本节中,您将创建一个简单的过载监控系统,使用您的NATS服务,系统将收到服务器的负载平均值,并在任何服务器过载时向管理员发送电子邮件。
样本项目将由以下组成部分组成:
- 您刚刚配置的NATS服务.
- A monitor,它每60秒将服务器的主机名称、负载平均值和处理器数发布给
stats.loadaverage
主体. 您需要在任何想要监控负载的服务器上运行此组件。 - A notifier,它会订阅
stats.loadaverage
主体并接收服务器的主机名称、负载平均值和处理器数。
我们将在同一台服务器上运行所有这些组件,但您可以在完成本教程后尝试在不同的服务器上运行每个组件。
设置监视器
您可以从/proc/loadavg
读取Linux系统的平均负载,对于这个项目,我们只对最后一分钟的平均负载感兴趣,这是输出的第一个字段。
1cat /proc/loadavg | cut -f1 -d" "
您将看到以下输出:
1[secondary_label Output]
20.11
您通过读取 /proc/loadavg
获得的负载平均值取决于处理器的数量,因此您必须通过将负载平均值与处理器的数量进行正常化。
1getconf _NPROCESSORS_ONLN
您将看到您的终端中显示的结果:
1[secondary_label Output]
21
由于我们的服务器的默认壳无法处理浮动数字算法,我们将发送负载平均值和处理器的数量,以及主机名称作为我们的消息的负载,并在稍后通知器中进行划分。
1echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`
该命令分别显示主机名、负载平均值和处理器数量:
1[secondary_label Output]
2your_hostname 0.28 1
让我们创建一个壳脚本,将主机名称,负载平均值和处理器计数发布给我们的NATS服务器,以主题为stats.loadaverage
。
1nano ~/publish_load_average.sh
在文件中,添加这个脚本:
1[label ~/publish_load_average.sh]
2NATS_ADDR=127.0.0.1:4222
3LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ")
4NPROC=$(getconf _NPROCESSORS_ONLN)
5SUBJECT="stats.loadaverage"
6PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC)
7MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n"
8printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1
此脚本创建了消息,然后将其导向catnats
,将消息发布到NATS服务中。我们使用-q
交换机运行catnats
,以抑制任何输出,我们使用-- raw
交换机,以便catnats
不试图解释输入内容。
让我们测试脚本是否向NATS发送负载平均值。
下列命令每 5 秒运行 ~/publish_load_average.sh. 请注意,我们在行末尾使用
&` 字符在背景中运行命令:
1while true; do sh ~/publish_load_average.sh; sleep 5; done &
您将看到输出显示该命令正在以进程 ID 在背景中运行:
1[secondary_label Output]
2[1] 14123
<$>[注意] 注意 :把进程ID放到某个地方,因为你需要使用该ID来稍后停止命令。
现在连接到NATS并订阅主题 stats.loadaverage
以获取负载平均值:
1printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
我们使用--no-exit
标志来禁用自动退出,并使用--pong
标志来保持我们与NATS的连接。
1[secondary_label Output]
2INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3+OK
4+OK
5MSG stats.loadaverage 0 27
6your_hostname 0.08 1
让我们停止称为publish_load_average.sh
的循环,因为我们将有一个更好的运行方式,即publish_load_average.sh
:
1kill 14123
我们刚刚采取的方法非常适合测试,但它不是我们想要永久使用的东西。我们希望系统运行publish_load_average.sh
以运行每分钟。为了实现这一点,我们可以添加一个 crontab 条目。Linux系统使用cron
,一个可以运行命令或工作
的系统,根据我们指定的时间表。crontab
命令使我们能够管理这些工作。您可以在教程中了解有关 Cron 的所有信息。
要创建一个新的条目,执行命令:
1crontab -e
如果您从未运行过上述命令,您可能会看到以下提示,该提示会要求您选择一个文本编辑器来管理条目:
1[secondary_label Output]
2no crontab for demo - using an empty one
3
4Select an editor. To change later, run 'select-editor'.
5 1. /bin/ed
6 2. /bin/nano <---- easiest
7 3. /usr/bin/vim.basic
8 4. /usr/bin/vim.tiny
9
10Choose 1-4 [2]:
输入与您最舒适的编辑器相匹配的号码,然后按ENTER
。
在打开的文件末尾,添加以下行,但如果您使用了sammy
以外的任何东西,则更换您的用户名:
1*/1 * * * * bash /home/sammy/publish_load_average.sh
上面的条目告诉cron
每分钟运行我们的publish_load_average.sh
脚本. 保存文件并关闭编辑器。
现在让我们测试负载平均值的定期发布是否有效:
1printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
等待几分钟,你看到的输出将类似于以下:
1[secondary_label Output]
2INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
3+OK
4+OK
5MSG stats.loadaverage 0 27
6your_hostname 0.01 1
7MSG stats.loadaverage 0 27
8your_hostname 0.00 1
按CTRL+C
来退出catnats
。
我们已经成功设置了监视器,它正在向我们的NATS服务器发送消息,接下来,我们将设置使用这些数据的通知器。
创建通知器
让我们创建一个连接到我们的NATS服务并听取stats.loadaverage
消息的通知器。 每当我们的程序收到消息时,它会计算每个处理器的平均负载量。 如果每个处理器的CPU使用率高于0.6或60%,它会为发布消息的主机设置警告旗,并将电子邮件发送到预定义的地址。 如果每个处理器的平均负载量小于0.4,则将清除主机的警告旗。
我们将使用 Node.JS 来创建通知器,因为 Node.js 有一个很好的 NATS 客户端,所以先安装 Node.js:
1sudo apt-get install -y npm
接下来,创建通知器的目录并切换到它:
1mkdir ~/overload_notifier && cd ~/overload_notifier
Node.js 项目使用名为「package.json」的文件,该文件包含有关该项目及其依赖的信息。
1npm init -y
然后安装了 Node.js 的 NATS 客户端,以及我们将在本项目中使用的nodemailer
模块来发送警告电子邮件:
1npm install [email protected] [email protected] --save-exact
现在我们可以创建通知器. 创建文件 notifier.js
:
1nano notifier.js
然后将以下代码添加到文件中:
1[label notifier.js]
2var NATS_URL = 'nats://127.0.0.1:4222';
3var NATS_USER = 'user1';
4var NATS_PASS = 'pass1';
5var EMAIL_TO = '[email protected]';
请确保您更改这些选项以匹配您的NATS服务的用户名和密码,以及您的电子邮件地址。
接下来,添加此代码来导入 Node.js NATS 客户端并连接到gnatsd
服务:
1[label notifier.js]
2var tlsOptions = {
3 rejectUnauthorized: false,
4};
5var nats = require('nats').connect({url: NATS_URL,
6 tls: tlsOptions,
7 user: NATS_USER,
8 pass: NATS_PASS});
然后添加此代码来设置邮件发送器并连接到将发送电子邮件的SMTP服务器。
1[label notifier.js]
2var nodemailer = require('nodemailer');
3var transport = nodemailer.createTransport('smtp://localhost:2525');
然后添加剩余的代码来计算负载平均值,并确定是否需要发送通知电子邮件:
1[label notifier.js]
2// keep the state of warnings for each host
3var warnings = {};
4
5function sendEmail(subject, text) {
6 transport.sendMail({
7 to: EMAIL_TO,
8 subject: subject,
9 text: text
10 });
11}
12
13function processMessage(message) {
14 // message fields: host load processor_count
15 var fields = message.split(" ");
16 var host = fields[0];
17 var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]);
18 if (loadAverage > 0.6) {
19 if (!warnings[host]) {
20 // send warning email if one wasn't already sent
21 var res = sendEmail('Warning! Server is Overloaded: ' + host,
22 'Load average: ' + loadAverage);
23 // set warning for the host
24 warnings[host] = true;
25 }
26 }
27 else if (loadAverage < 0.4) {
28 if (warnings[host]) {
29 // clear the warning
30 warnings[host] = false;
31 }
32 }
33}
34
35nats.subscribe('stats.loadaverage', processMessage);
我们订阅消息,每当我们收到消息时,我们都会执行processMessage
函数,该函数分析我们发送的负载量并确定负载平均值。如果负载量太高,我们会发送消息,并通过设置基于主机名称的旗帜来跟踪我们之前发送的消息。
有了监视器和通知器,是时候测试我们的样本项目了。
测试项目
我们将生成一些人工负载,并检查通知器是否会在负载过高时发送警告电子邮件。
让我们在我们的服务器上安装压力
工具来生成CPU负载:
1sudo apt-get install -y stress
接下来,我们需要设置一个SMTP服务器来发送我们的通知器的消息。安装和配置一个完整的SMTP服务器对于这个测试将是过剩,所以我们将使用一个简单的SMTP服务器,该服务器只显示给它发送的电子邮件,而不是实际发送它们。Python编程语言有一个DebuggingServer
模块,我们可以加载,它丢弃了它接收的电子邮件,但将它们显示到屏幕上,以便我们可以确保事情工作。
让我们在后台开始调试 SMTP 服务器,我们会让它听到localhost
端口2525
,这与我们在我们的notifier.js
代码中配置的 SMTP 地址相匹配。
1python -m smtpd -n -c DebuggingServer localhost:2525 &
然后用这个命令在背景中启动通知器:
1nodejs ~/overload_notifier/notifier.js &
最后,让我们在我们服务器的所有处理器上生成一些负载,使用以下选项执行压力
命令:
1stress --cpu $(getconf _NPROCESSORS_ONLN)
几分钟后,您将看到类似于以下的输出,因为SMTP服务器开始显示通知器发送的消息:
1[secondary_label Output]
2---------- MESSAGE FOLLOWS ----------
3Content-Type: text/plain
4To: admin@example.com
5Subject: Warning! Server is Overloaded: your_hostname
6Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost>
7X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/;
8 SMTP/2.5.0[client:2.5.0])
9Content-Transfer-Encoding: 7bit
10Date: Sun, 19 Jun 2016 16:47:02 +0000
11MIME-Version: 1.0
12X-Peer: 127.0.0.1
13
14Load average: 0.88
15------------ END MESSAGE ------------
这可以让你知道当服务器上的负载过高时,你已经成功发送了电子邮件。
您已经完成了样本项目,现在应该有一个很好的想法,如何在自己的环境中为您工作。
结论
在本文中,您了解了 NATS PubSub 消息系统,以安全的方式将其安装为服务,并在样本项目中测试了它. 该样本项目使用了 Node.JS 客户端,但 NATS 拥有更多语言和框架的客户端,您可以在 NATS 下载页面列出。