前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上安装和配置NATS

如何在Ubuntu 16.04上安装和配置NATS

原创
作者头像
圣人惠好可爱
修改2018-09-30 10:38:31
3.8K0
修改2018-09-30 10:38:31
举报
文章被收录于专栏:云计算教程系列

介绍

NATS是一种开源高性能消息系统,通常被称为“云的中枢神经系统”。它能够每秒路由数百万条消息,这使其成为连接微服务和物联网IoT)设备的理想选择。

NATS是一个PubSub消息传递系统。在这种系统中,一个或多个发布者将具有特定主题的消息发送给消息代理,并且消息代理将这些消息传递给给定主题的任何客户端或订户。出版商不了解甚至不关心订阅者,反之亦然。这种架构可以轻松扩展系统并添加新功能,因为我们可以添加发布者和订阅者,而不会影响系统的其余部分。这种类型的系统非常适合监控服务器和设备; 设备可以发送消息,我们可以订阅这些消息,通过电子邮件或其他方式发送通知。

在本教程中,我们将安装gnatsd官方NATS服务器作为服务,并以安全的方式访问它。我们还将创建一个基本的服务器过载警告系统,该系统在服务器负载过高时发送电子邮件,并将gnatsd其用作其消息代理。

准备

要完成本教程,您需要:

  • 一个新的Ubuntu 16.04服务器。(你需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)
  • 具有sudo权限的标准用户帐户。

步骤1 - 下载NATS服务器

让我们首先下载gnatsd服务器并确保它在我们的系统上运行没有任何问题。

最新的稳定gnatsd版本是本教程编写时的0.9.4版本。您可以查看NATS下载页面以获取更高版本,如果您想使用更新版本,可以根据需要调整以下命令。

首先,使用非root帐户登录您的服务器:

代码语言:javascript
复制
ssh sammy@your_server_ip

然后,确保您在用户的主目录中:

代码语言:javascript
复制
cd

接下来,用wget下载gnatsd到您的服务器:

代码语言:javascript
复制
wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip

您刚刚下载的存档是压缩存档,因此您需要安装unzip以解压缩文件。你可以用apt安装它:

代码语言:javascript
复制
sudo apt-get install -y unzip

然后unzip用来提取gnatsd

代码语言:javascript
复制
unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd

然后创建gnatsd可执行文件,以便运行它:

代码语言:javascript
复制
chmod +x gnatsd

让我们测试一下,我们可以gnatsd通过从当前目录运行它来运行它。使用以下命令启动gnatsd

代码语言:javascript
复制
./gnatsd --addr 127.0.0.1 --port 4222

您看到的输出与此示例类似:

代码语言:javascript
复制
[1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4
[1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on 127.0.0.1:4222
[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目录下。我们将遵循该约定并在/srv/nats下保留与NATS相关的文件。我们将gnatsd可执行文件放入/srv/nats/bin

首先,创建/srv/nats/bin文件夹:

代码语言:javascript
复制
sudo mkdir -p /srv/nats/bin

然后移动gnatsd/srv/nats/bin文件夹:

代码语言:javascript
复制
sudo mv ~/gnatsd /srv/nats/bin

服务器可以从文件加载其配置,当我们需要在本教程后面修改服务器设置时,该文件会派上用场。创建文件/srv/nats/gnatsd.config

代码语言:javascript
复制
sudo nano /srv/nats/gnatsd.config

并将以下内容添加到该文件:

代码语言:javascript
复制
port: 4222
net: '127.0.0.1'

此配置文件告诉gnatsd服务器侦听地址127.0.0.1的端口4222,就像之前一样,但这次我们不必在命令行上指定这些选项。

让我们再次运行服务器以确保我们已正确配置。执行以下命令以使用新配置文件启动gnatsd

代码语言:javascript
复制
/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config

输出类似于您之前看到的内容:

代码语言:javascript
复制
[1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4
[1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on 127.0.0.1:4222
[1869] 2016/06/18 05:30:55.989562 [INF] Server is ready

再次按CTRL+C,关闭gnatsd并返回到您的提示。现在让我们创建一个将运行此服务的用户。

第3步 - 创建服务用户

使用自己的用户帐户运行每项服务以限制服务受损时的损害是一种很好的安全措施。让我们创建一个拥有NATS服务和NATS相关文件的用户和组。

首先,让我们创建一个名为nats的系统用户和组:

代码语言:javascript
复制
sudo adduser --system --group --no-create-home --shell /bin/false nats
OutputAdding system user `nats' (UID 106) ...
Adding new group `nats' (GID 114) ...
Adding new user `nats' (UID 106) with group `nats' ...
Not creating home directory `/home/nats'.

我们将/bin/falseshell 分配给nats系统用户以禁用此用户的登录并禁止创建主目录。我们还创建了一个nats小组。

让我们将/srv目录的所有者更改为 nats用户和组:

代码语言:javascript
复制
sudo chown -R nats:nats /srv

现在我们已经创建了nats用户和组,让我们继续创建NATS服务。

第4步 - 将gnatsd作为服务运行

我们想gnatsd在系统启动时启动,如果崩溃则重新启动。我们将使用systemd来处理这个问题。

systemd是Linux系统的服务管理器。它负责在启动时启动服务,根据需要重新启动它们,并在系统关闭时以受控方式停止它们。

我们需要创建一个 服务配置,以定义应该如何以及何时启动NATS服务。用户创建的服务文件存在/etc/systemd/system,因此创建文件/etc/systemd/system/nats.service

代码语言:javascript
复制
sudo nano /etc/systemd/system/nats.service

在文件中,放置此脚本以定义gnatsd应如何启动:

代码语言:javascript
复制
[Unit]
Description=NATS messaging server
​
[Service]
ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
User=nats
Restart=on-failure
​
[Install]
WantedBy=multi-user.target
  • [Unit]部分包含有关服务的一般信息,例如Description描述服务的信息。
  • [Service]部分包含与服务相关的配置。ExecStart是运行服务器的命令。我们在gnatsd这里使用可执行文件的绝对路径。 Restart=on-failure表示如果服务崩溃或因故障终止,则必须重新启动该服务。如果它被systemd停止,它将不会重新启动。
  • [Install]部分包含有关服务的安装信息。WantedBy=multi-user.target告诉systemd在启动时启动服务multi-user.target。这是在系统引导时启动服务的通用方法。

一旦服务描述到位,我们就可以使用以下命令启动它:

代码语言:javascript
复制
sudo systemctl start nats

让我们通过发送PING消息来确认gnatsd正在运行:

代码语言:javascript
复制
printf "PING\r\n" | nc 127.0.0.1 4222

我们刚刚用来nc与之沟通gnatsdnc是一个与TCP或UDP服务器通信的命令行实用程序。我们使用的命令打印类似于以下内容的输出:

代码语言:javascript
复制
INFO {"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}
PONG

响应PONG让我们知道服务器正在按预期监听和工作。我们需要运行最后一个命令以使我们的NATS服务器在启动时启动:

代码语言:javascript
复制
sudo systemctl enable nats

您将看到以下输出,确认已安装该服务:

代码语言:javascript
复制
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.

我们已成功配置gnatsd为作为服务运行。现在让我们保护它并使外部客户端可以访问它。

步骤5 - 保护与NATS服务的连接

如果我们想要使用的所有发布者和订阅者gnatsd都在同一台服务器上运行,我们可以将其称为完成并继续前进,但现在这种情况很少发生。我们需要让外部客户端gnatsd以安全的方式连接和发布消息。

gnatsd支持TLS传输,因此我们将使用它来保护gnatsdNATS客户端之间的通信。

首先,我们需要证书。您可以购买商业证书,从Let's Encrypt中检索商业证书或生成自签名证书。我们将使用后一种方法,因为获取证书超出了本文的范围。

创建一个暂时保存证书的目录:

代码语言:javascript
复制
mkdir ~/priv

然后使用以下命令创建自签名证书:

代码语言:javascript
复制
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout priv/gnatsd.key -out priv/gnatsd.crt \
    -subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"

此命令创建一个2048位且有效期为10年的RSA证书。请注意,我们使用了任意域名,因为我们不会在本文中为gnatsd服务器启用TLS验证。

您现在应该在~/priv目录中拥有这些文件gnatsd.keygnatsd.crt。让我们将这些文件移到我们的/srv/nats/目录结构下,这样一切都在一个地方。执行以下命令:

代码语言:javascript
复制
sudo mv ~/priv /srv/nats

现在,只允许nats用户和组访问/srv/nats/priv

代码语言:javascript
复制
sudo chmod 440 /srv/nats/priv/*
sudo chmod 550 /srv/nats/priv
sudo chown -R nats:nats /srv/nats/priv

现在我们更新/srv/nats/gnatsd.config以包含我们刚刚创建的证书和密钥。再次打开配置文件:

代码语言:javascript
复制
sudo nano /srv/nats/gnatsd.config

并添加以下部分告诉gnatsd使用您的证书和密钥:

代码语言:javascript
复制
. . .
​
tls {
  cert_file: "/srv/nats/priv/gnatsd.crt"
  key_file: "/srv/nats/priv/gnatsd.key"
  timeout: 1
}

保存文件并退出编辑器。然后重新启动服务,以便它可以获取更改。

代码语言:javascript
复制
sudo systemctl restart nats

让我们测试我们的证书是否有效。运行此命令:

代码语言:javascript
复制
printf "PING\r\n" | nc localhost 4222

这次,该命令输出以下消息:

代码语言:javascript
复制
INFO {"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}

-ERR 'Secure Connection - TLS Required'

服务器返回消息 -ERR 'Secure Connection - TLS Required',确认已接收新配置并且需要安全连接,但nc不知道如何操作。

为了能够在不安装完整的NATS客户端的情况下与我们的NATS服务进行通信,我们将使用名为catnats的工具。我们先下载它:

代码语言:javascript
复制
wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py

并使其可执行:

代码语言:javascript
复制
chmod +x catnats.py

最后,移动catnats.py到该/srv/nats/bin文件夹并将其重命名为catnats

代码语言:javascript
复制
sudo mv catnats.py /srv/nats/bin/catnats

让我们catnats通过发送PING之前发送的相同消息来检查我们是否可以使用我们的NATS服务进行通信:

代码语言:javascript
复制
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

你会看到这个输出表明我们的连接是安全的:

代码语言:javascript
复制
INFO {"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}
PONG

现在我们已经保护了通信,让我们启用身份验证,以便连接到NATS需要用户名和密码。

第6步 - 要求身份验证

我们的NATS服务默认不需要身份验证。当服务只能在专用网络上访问时,这很好,但我们希望我们的NATS服务可以在因特网上访问,因此我们应该启用身份验证。gnatsd支持用户名和密码验证,并且易于启用。

打开 /srv/nats/gnatsd.config文件:

代码语言:javascript
复制
sudo nano /srv/nats/gnatsd.config

添加指定凭据的新authorization部分。我们将使用本教程的用户名user1和密码pass1。您应该在生产环境中使用更长,更复杂的密码:

代码语言:javascript
复制
. . .

authorization {
  user: user1
  password: pass1
}

保存文件,然后更改/srv/nats/gnatsd.configto 的所有者nats并使其可供该用户读取,以保护系统上其他用户的用户名和密码:

代码语言:javascript
复制
sudo chown nats /srv/nats/gnatsd.config
sudo chmod 400 /srv/nats/gnatsd.config

然后重新启动服务以使更改生效:

代码语言:javascript
复制
sudo systemctl restart nats

让我们发一条PING消息到gnatsd检查一切是否正常。再一次,用catnats来发送消息:

代码语言:javascript
复制
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

您将看到以下输出:

代码语言:javascript
复制
NFO {"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}
-ERR 'Authorization Violation'

这告诉我们已成功应用更改,现在我们需要发送正确的用户名和密码才能连接到服务。我们再试一次,这次提供用户名user1和密码pass1

代码语言:javascript
复制
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1

从下面的输出可以看出,这次它起作用了:

代码语言:javascript
复制
INFO {"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}
+OK
PONG

现在我们已经将此服务限制在知道用户名和密码的客户端,我们可以重新配置服务,以便外部客户端可以连接。

第7步 - 向世界开放服务

我们已经配置了我们的NATS服务器来监听127.0.0.1,这是本地接口。如果我们让它听0.0.0.0,那么世界将可以使用它。我们最后一次更新/srv/nats/gnatsd.config

代码语言:javascript
复制
sudo nano /srv/nats/gnatsd.config

然后更改与net设置关联的IP地址:

代码语言:javascript
复制
. . .
net: '0.0.0.0'
. . .

保存文件并重新启动服务:

代码语言:javascript
复制
sudo systemctl restart nats

现在我们的NATS服务已准备好进行外部客户端连接。为了学习如何使用它,让我们创建一个简单的监视服务,它使用我们的NATS服务器作为消息代理。

步骤8 - (可选)配置服务器过载通知

在本节中,您将创建一个使用NATS服务的简单过载监视系统。系统将接收服务器的负载平均值,并在任何服务器过载时向管理员发送电子邮件。

示例项目将包含以下组件:

  • 您刚刚配置的NATS服务。
  • 显示器,其出版服务器的主机名,平均负载和处理器计数到stats.loadaverage每60秒的主题。您需要在要监视负载的任何服务器上运行此组件。
  • 通知,该订阅的stats.loadaverage主题,并接收服务器的主机名,平均负载和处理器计数。如果主机的负载平均值高于某个阈值,则通知程序通过SMTP服务器向预定义的地址发送电子邮件。

为简单起见,我们将在同一服务器上运行所有这些组件,但您可以在完成本教程后尝试在不同的服务器上运行每个组件。

设置监视器

您可以从中读取Linux系统的平均负载/proc/loadavg。对于这个项目,我们只对最后一分钟的负载平均值感兴趣,这是输出的第一个字段。使用此命令获取该值:

代码语言:javascript
复制
cat /proc/loadavg | cut -f1 -d" "

您将看到以下输出:

代码语言:javascript
复制
0.11

通过读取/proc/loadavg获得的平均负载取决于处理器的数量,因此您必须通过将负载平均值除以处理器数量来对其进行标准化。您可以使用以下命令获取服务器的处理器数量:

代码语言:javascript
复制
getconf _NPROCESSORS_ONLN

您将看到终端中显示的结果:

代码语言:javascript
复制
1

由于我们服务器的默认shell无法处理浮点数运算,因此我们将发送加载平均值和处理器数量以及主机名作为消息的有效负载,并在稍后的通知程序中进行除法。这是我们用来构造有效负载的命令:

代码语言:javascript
复制
echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`

该命令分别显示主机名,负载平均值和处理器数:

代码语言:javascript
复制
your_hostname 0.28 1

让我们创建一个shell脚本,它用主机名stats.loadaverage将负载平均值和处理器数发布到我们的NATS服务器上。我们将配置我们的系统以定期运行此脚本。创建一个名为的新文件~/publish_load_average.sh

代码语言:javascript
复制
nano ~/publish_load_average.sh

在该文件中,添加以下脚本:

代码语言:javascript
复制
NATS_ADDR=127.0.0.1:4222
LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ")
NPROC=$(getconf _NPROCESSORS_ONLN)
SUBJECT="stats.loadaverage"
PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC)
MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n"
printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1

此脚本创建消息,然后将该消息传送到catnats,该消息将消息发布到NATS服务。我们catnats使用 -q开关运行来抑制任何输出,我们使用 --raw开关,因此catnats不会尝试解释输入的内容。$NATS_ADDR如果NATS服务位于不同的服务器上,您可以更改 变量的值。

让我们测试脚本将负载平均值发送到NATS。

以下命令每5秒运行一次~/publish_load_average.sh。请注意,我们使用&行尾的字符在后台运行命令:

代码语言:javascript
复制
while true; do sh ~/publish_load_average.sh; sleep 5; done &

您将看到输出显示该命令在后台运行,并带有进程ID:

代码语言:javascript
复制
[1] 14123

注意:在某处记下进程ID,因为您需要使用该ID以便稍后停止该命令。

现在连接到NATS并订阅主题stats.loadaverage以检索平均负载:

代码语言:javascript
复制
printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1

我们使用该 --no-exit标志来禁用自动退出,和--pong使我们与NATS的连接保持活动状态。如果一切正确,您应该得到类似于以下的输出,每5秒更新一次:

代码语言:javascript
复制
INFO {"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}
+OK
+OK
MSG stats.loadaverage 0 27
your_hostname 0.08 1

CTRL+C退出catnats。让我们停止调用的publish_load_average.sh循环,因为我们将有更好的运行方式来运行publish_load_average.sh

代码语言:javascript
复制
kill 14123

我们刚刚采用的方法非常适合测试,但这不是我们想永久使用的方法。我们希望系统能够publish_load_average.sh每分钟运行一次。为了实现这一点,我们可以添加一个crontab条目。Linux系统使用cron一个可以按照我们指定的计划运行命令或“作业”的系统。该crontab命令允许我们管理这些作业。

要创建新条目,请执行以下命令:

代码语言:javascript
复制
crontab -e

如果您从未运行上述命令,您可能会看到以下提示,要求您选择文本编辑器来管理条目:

代码语言:javascript
复制
no crontab for demo - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny

Choose 1-4 [2]:

输入与您最熟悉的编辑器对应的数字,然后按ENTER。文件将显示在您选择的编辑器中。

在打开的文件的末尾,添加以下行,但如果您使用了以下内容,请替换您的用户名sammy

代码语言:javascript
复制
*/1 * * * * bash /home/sammy/publish_load_average.sh

上面的条目告诉cron我们每分钟运行一次publish_load_average.sh脚本。保存文件并关闭编辑器。

现在让我们测试负载平均值的定期发布是否有效:

代码语言:javascript
复制
printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1

等待几分钟,您看到的输出将类似于以下内容:

代码语言:javascript
复制
INFO {"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}
+OK
+OK
MSG stats.loadaverage 0 27
your_hostname 0.01 1
MSG stats.loadaverage 0 27
your_hostname 0.00 1

CTRL+C退出catnats

我们已经成功设置了监视器,它正在向我们的NATS服务器发送消息。接下来,我们将设置使用此数据的通知程序。

创建通知程序

让我们创建连接到我们的NATS服务并监听stats.loadaverage消息的通知程序。每当我们的程序收到消息时,它会计算每个处理器的平均负载。如果它高于0.6或每个处理器60%的CPU利用率,它会为发布消息的主机设置警告标志,并将电子邮件发送到预定义的地址。如果每个处理器的平均负载小于0.4,则清除主机的警告标志。为防止充斥收件箱,我们会在设置警告标志时发送一封电子邮件。

我们将使用Node.JS来创建通知程序,因为Node.js有一个很棒的NATS客户端。所以,首先安装Node.js:

代码语言:javascript
复制
sudo apt-get install -y npm

接下来,为通知程序创建目录并切换到该目录:

代码语言:javascript
复制
mkdir ~/overload_notifier && cd ~/overload_notifier

Node.js项目使用一个名为package.json的文件,其中包含有关项目及其依赖项的信息。执行以下命令以创建该文件:

代码语言:javascript
复制
npm init -y

然后为Node.js安装NATS客户端,以及我们将在此项目中使用的nodemailer模块发送警告电子邮件:

代码语言:javascript
复制
npm install nodemailer@2.4.2 nats@0.6.4 --save-exact

现在我们可以创建通知程序。创建文件notifier.js

代码语言:javascript
复制
nano notifier.js

然后将以下代码添加到文件中:

代码语言:javascript
复制
var NATS_URL = 'nats://127.0.0.1:4222';
var NATS_USER = 'user1';
var NATS_PASS = 'pass1';
var EMAIL_TO = 'admin@example.com';

请务必更改这些选项以匹配NATS服务的用户名和密码,以及您的电子邮件地址。

接下来,添加此代码以导入Node.js NATS客户端并连接到gnatsd服务:

代码语言:javascript
复制
var tlsOptions = {
  rejectUnauthorized: false,
};
var nats = require('nats').connect({url: NATS_URL,
                                    tls: tlsOptions,
                                    user: NATS_USER,
                                    pass: NATS_PASS});

然后添加此代码以设置邮件程序并连接到将发送电子邮件的SMTP服务器。我们很快会设置这个服务器:

代码语言:javascript
复制
var nodemailer = require('nodemailer');
var transport = nodemailer.createTransport('smtp://localhost:2525');

然后添加其余代码以计算平均负载并确定是否需要发送通知电子邮件:

代码语言:javascript
复制
// keep the state of warnings for each host
var warnings = {};
​
function sendEmail(subject, text) {
    transport.sendMail({
        to: EMAIL_TO,
        subject: subject,
        text: text
    });
}
​
function processMessage(message) {
    // message fields: host load processor_count
    var fields = message.split(" ");
    var host = fields[0];
    var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]);
    if (loadAverage > 0.6) {
        if (!warnings[host]) {
            // send warning email if one wasn't already sent
            var res = sendEmail('Warning! Server is Overloaded: ' + host,
                                'Load average: ' + loadAverage);
            // set warning for the host
            warnings[host] = true;
        }
    }
    else if (loadAverage < 0.4) {
        if (warnings[host]) {
            // clear the warning
            warnings[host] = false;
        }
    }
}
​
nats.subscribe('stats.loadaverage', processMessage);

我们订阅了消息,每次收到消息时我们都会执行该processMessage函数,该函数解析我们发送的有效负载并确定负载平均值。如果它太高,我们发送消息,并且我们通过根据主机名设置标志来跟踪我们之前是否已发送过消息。这样我们就可以按主机跟踪通知。如果平均负载低于我们的阈值,我们清除该标志。

有了监视器和通知程序,就可以测试我们的示例项目了。

测试项目

让我们来试试吧。我们将生成一些人工负载并检查通知程序是否会在负载过高时发送警告电子邮件。

让我们安装该stress工具以在我们的服务器上生成CPU负载:

代码语言:javascript
复制
sudo apt-get install -y stress

接下来,我们需要设置一个SMTP服务器来邮寄来自通知程序的消息。安装和配置完整的SMTP服务器对于此测试来说是过度的,所以我们将使用一个简单的SMTP服务器,它只显示传递给它的电子邮件,而不是实际发送它们。Python编程语言有一个我们可以加载的DebuggingServer模块,它丢弃它收到的电子邮件,但是将它们显示在屏幕上,这样我们就可以确保工作正常。Python已经安装在我们的Ubuntu服务器上,所以这是一个完美的解决方案。

我们在后台启动调试SMTP服务器。我们将它侦听localhost端口2525,它匹配我们在notifier.js代码中配置的SMTP地址。执行此命令以启动SMTP服务器:

代码语言:javascript
复制
python -m smtpd -n -c DebuggingServer localhost:2525 &

然后使用以下命令在后台启动通知程序:

代码语言:javascript
复制
nodejs ~/overload_notifier/notifier.js &

最后,让我们在服务器的所有处理器上产生一些负载。使用以下选项执行stress命令:

代码语言:javascript
复制
stress --cpu $(getconf _NPROCESSORS_ONLN)

几分钟后,您将看到类似于以下内容的输出,因为SMTP服务器开始显示通知程序发送的消息:

代码语言:javascript
复制
---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain
To: admin@example.com
Subject: Warning! Server is Overloaded: your_hostname
Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost>
X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/;
 SMTP/2.5.0[client:2.5.0])
Content-Transfer-Encoding: 7bit
Date: Sun, 19 Jun 2016 16:47:02 +0000
MIME-Version: 1.0
X-Peer: 127.0.0.1

Load average: 0.88
------------ END MESSAGE ------------

这可以让您知道在服务器负载过高时您已成功发送电子邮件。

CTRL+C停止生成负载。您已经完成了示例项目,现在应该知道如何在您自己的环境中为您工作。

结论

在本文中,您了解了NATS PubSub消息传递系统,以安全的方式将其作为服务安装,并在示例项目中对其进行了测试。示例项目使用Node.JS客户端,但NATS具有更多语言和框架的客户端,您可以在NATS下载页面上找到它们 。您可以在其官方文档中了解有关NATS的更多信息。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Install and Configure NATS on Ubuntu 16.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 步骤1 - 下载NATS服务器
  • 第2步 - 创建目录结构和配置文件
  • 第3步 - 创建服务用户
  • 第4步 - 将gnatsd作为服务运行
  • 步骤5 - 保护与NATS服务的连接
  • 第6步 - 要求身份验证
  • 第7步 - 向世界开放服务
  • 步骤8 - (可选)配置服务器过载通知
    • 设置监视器
      • 创建通知程序
        • 测试项目
        • 结论
        相关产品与服务
        多因子身份认证
        多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档