Cách cài đặt và cấu hình NATS trên Ubuntu 16.04
NATS là một hệ thống nhắn tin hiệu suất cao open-souce , thường được mô tả là "một hệ thống thần kinh trung ương cho cloud ". Nó có khả năng định tuyến hàng triệu tin nhắn mỗi giây, lý tưởng cho việc kết nối các thiết bị microservices và IoT (Internet of Things).NATS là một hệ thống nhắn tin PubSub . Trong loại hệ thống này, một hoặc nhiều nhà xuất bản gửi tin nhắn với một chủ đề nhất định đến người message broker và người message broker sẽ gửi những tin nhắn này cho bất kỳ khách hàng hoặc người đăng ký nào của chủ đề nhất định. Các nhà xuất bản không biết hoặc thậm chí không quan tâm đến người đăng ký và ngược lại. Kiến trúc này giúp dễ dàng mở rộng quy mô hệ thống và thêm các khả năng mới vì ta có thể thêm nhà xuất bản và người đăng ký mà không ảnh hưởng đến phần còn lại của hệ thống. Loại hệ thống này hoàn hảo để giám sát server và thiết bị; thiết bị có thể gửi tin nhắn và ta có thể đăng ký các tin nhắn đó để gửi thông báo qua email hoặc các phương tiện khác.
 Trong hướng dẫn này,  ta  sẽ cài đặt gnatsd ,  server  NATS chính thức, như một dịch vụ và làm cho nó có thể truy cập một cách an toàn.  Ta  cũng sẽ tạo một hệ thống cảnh báo quá tải  server  cơ bản để gửi email khi tải  server  quá cao, sử dụng gnatsd làm nhà  broker  thư của nó.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Server Ubuntu 16.04 mới.
-  Một account   user  tiêu chuẩn với các  quyền  sudo. Bạn có thể cài đặt một account tiêu chuẩn theo Cài đặt Server Ban đầu với Ubuntu 16.04 .
Bước 1 - Download Server NATS
 Hãy bắt đầu bằng cách  download   server  gnatsd và đảm bảo nó chạy trên hệ thống của  ta  mà không gặp  sự cố nào .
 Bản phát hành gnatsd ổn định mới nhất là version  0.9.4 tại thời điểm hướng dẫn này được viết. Bạn có thể kiểm tra trang  download  NATS để biết version  mới hơn và điều chỉnh các lệnh bên dưới nếu cần nếu bạn muốn sử dụng version  mới hơn.
Đầu tiên, đăng nhập vào server của bạn bằng account không phải root của bạn:
- ssh sammy@your_server_ip 
Sau đó, hãy đảm bảo bạn đang ở trong folder chính của user :
- cd 
Tiếp theo, sử dụng wget để tải gnatsd xuống  server  của bạn:
- wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip 
Tệp lưu trữ bạn vừa  download  là file  nén, vì vậy bạn  cần  cài đặt unzip để  extract  các file . Bạn có thể cài đặt nó bằng apt :
- sudo apt-get install -y unzip 
Sau đó sử dụng unzip để  extract  gnatsd :
- unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd 
Sau đó làm cho gnatsd có thể thực thi để bạn có thể chạy nó:
- chmod +x gnatsd 
Hãy kiểm tra xem  ta  có thể chạy gnatsd bằng cách chạy nó từ folder  hiện tại. Sử dụng lệnh sau để bắt đầu gnatsd :
- ./gnatsd --addr 127.0.0.1 --port 4222 
Đầu ra bạn thấy sẽ tương tự như ví dụ này:
Output[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 Theo mặc định, gnatsd lắng nghe trên cổng 4222 trên địa chỉ 0.0.0.0 tương ứng với tất cả các giao diện. Sử dụng đối số --port , bạn có thể thay đổi cổng và với --addr bạn có thể thay đổi địa chỉ mà nó lắng nghe.  Ta  đã chạy gnatsd với --addr 127.0.0.1 , để nó chỉ khả dụng trong  server  của  ta  và không thể truy cập bởi các client  bên ngoài. Ở phần sau của hướng dẫn,  ta  sẽ bảo mật gnatsd và mở nó ra với thế giới.
 Nhấn CTRL+C để tắt gnatsd .
Đến đây bạn đã biết mọi thứ hoạt động, hãy sắp xếp mọi thứ theo cách chính thức hơn.
Bước 2 - Tạo cấu trúc folder và file cấu hình
 Trên Linux, bên thứ ba, phần mềm liên quan đến dịch vụ thường được lưu trong folder  /srv .  Ta  sẽ tuân theo quy ước đó và giữ các file  liên quan đến NATS dưới /srv/nats .  Ta  sẽ đặt file  thực thi gnatsd trong /srv/nats/bin .
 Đầu tiên, tạo folder  /srv/nats/bin :
- sudo mkdir -p /srv/nats/bin 
Sau đó di chuyển gnatsd vào folder  /srv/nats/bin :
- sudo mv ~/gnatsd /srv/nats/bin 
 Server  có thể tải cấu hình của nó từ một file , điều này sẽ rất hữu ích khi  ta  cần sửa đổi cài đặt  server  trong phần sau của hướng dẫn. Tạo file  /srv/nats/gnatsd.config :
- sudo nano /srv/nats/gnatsd.config 
Và thêm các nội dung sau vào file :
port: 4222 net: '127.0.0.1' Tệp cấu hình này yêu cầu  server  gnatsd lắng nghe trên cổng 4222 trên địa chỉ 127.0.0.1 , giống như trước đây, nhưng lần này  ta  sẽ không phải chỉ định các tùy chọn đó trên dòng lệnh.
 Hãy chạy lại  server   đảm bảo  rằng  ta  đã cấu hình mọi thứ một cách chính xác. Thực thi lệnh sau để  chạy  gnatsd bằng file  cấu hình mới:
- /srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config 
Đầu ra tương tự như những gì bạn đã thấy trước đây:
Output[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   , nhấn CTRL+C để tắt gnatsd và quay lại  dấu nhắc  của bạn. Bây giờ hãy tạo một  user  sẽ chạy dịch vụ này.
Bước 3 - Tạo User Dịch vụ
Thực hành bảo mật tốt là chạy mỗi dịch vụ bằng account user của chính nó để hạn chế thiệt hại trong trường hợp dịch vụ bị xâm phạm. Hãy tạo một user và group sở hữu dịch vụ NATS và các file liên quan đến NATS.
 Đầu tiên, hãy tạo một  user  hệ thống và  group  có tên nats :
- 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'.  Ta  đã gán /bin/false shell cho  user  hệ thống nats để tắt thông tin đăng nhập cho  user  này và ngăn chặn việc tạo folder  chính.  Ta  cũng đã tạo một  group  nats .
 Hãy thay đổi chủ sở hữu của folder  /srv thành  user  và  group  nats :
- sudo chown -R nats:nats /srv 
Bây giờ  ta  đã tạo  user  và  group  nats , hãy tiếp tục tạo dịch vụ NATS.
Bước 4 - Chạy gnatsd như một Dịch vụ
  Ta  muốn gnatsd bắt đầu khi hệ thống khởi động và khởi động lại nếu nó bị lỗi.  Ta  sẽ sử dụng systemd để xử lý việc này.
systemd là một trình quản lý dịch vụ cho các hệ thống Linux. Nó chịu trách nhiệm khởi động các dịch vụ khi khởi động, khởi động lại chúng khi cần thiết và dừng chúng theo cách có kiểm soát khi tắt hệ thống.
  Ta  cần tạo cấu hình dịch vụ để xác định cách thức và thời điểm khởi động dịch vụ NATS. Tệp dịch vụ do  user  tạo nằm trong /etc/systemd/system , vì vậy hãy tạo file  /etc/systemd/system/nats.service :
- sudo nano /etc/systemd/system/nats.service 
Và trong file , hãy đặt tập lệnh này để xác định cách gnatsd sẽ khởi động:
[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 - Phần [Unit]chứa thông tin chung về dịch vụ, chẳng hạn nhưDescriptiontả mô tả dịch vụ.
-  Phần [Service]chứa cấu hình liên quan đến dịch vụ.ExecStartlà lệnh để chạy server . Ta sử dụng đường dẫn tuyệt đối của file thực thignatsdở đây.Restart=on-failurenghĩa là dịch vụ phải được khởi động lại nếu nó bị treo hoặc kết thúc do lỗi. Nó sẽ không được khởi động lại nếu nó bị dừng bởi systemd.
-  Phần [Install]chứa thông tin cài đặt về dịch vụ.WantedBy=multi-user.targetyêu cầu systemd khởi động dịch vụ khi khởi độngmulti-user.target. Đây là một cách chung để khởi động các dịch vụ khi khởi động hệ thống.
Khi mô tả dịch vụ đã có, ta có thể bắt đầu nó bằng lệnh sau:
- sudo systemctl start nats 
Hãy  xác nhận  gnatsd đang chạy bằng cách gửi tin nhắn PING :
- printf "PING\r\n" | nc 127.0.0.1 4222 
 Ta  vừa sử dụng nc để giao tiếp với gnatsd . nc là một tiện ích dòng lệnh để giao tiếp với các  server  TCP hoặc UDP. Lệnh  ta  đã sử dụng in ra kết quả tương tự như sau:
OutputINFO {"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 Phản hồi PONG cho  ta  biết  server  đang lắng nghe và hoạt động như mong đợi.  Ta  cần chạy một lệnh cuối cùng để làm cho  server  NATS của  ta   bắt đầu khi server khởi động :
- sudo systemctl enable nats 
Bạn sẽ thấy kết quả sau xác nhận dịch vụ đã được cài đặt:
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.  Ta  đã cấu hình thành công gnatsd để chạy như một dịch vụ. Bây giờ hãy bảo mật nó và làm cho nó có thể truy cập được đối với các client  bên ngoài.
Bước 5 - Bảo mật kết nối với Dịch vụ NATS
 Nếu tất cả các nhà xuất bản và người đăng ký mà  ta  muốn sử dụng với gnatsd chạy trên cùng một  server ,  ta  có thể gọi là xong và tiếp tục nhưng điều đó hiếm khi xảy ra hiện nay.  Ta   cần  cho phép khách hàng bên ngoài kết nối và xuất bản tin nhắn lên gnatsd một cách an toàn.
 gnatsd hỗ trợ truyền tải TLS, vì vậy  ta  sẽ sử dụng điều đó  đảm bảo  giao tiếp giữa gnatsd và client  NATS.
Đầu tiên, ta cần một certificate . Bạn có thể mua certificate thương mại, lấy một certificate từ Let's Encrypt hoặc tạo certificate tự ký. Ta sẽ sử dụng cách tiếp cận thứ hai, vì việc có được certificate nằm ngoài phạm vi của bài viết này.
Tạo một folder để lưu giữ certificate tạm thời:
- mkdir ~/priv 
Sau đó, tạo certificate tự ký bằng lệnh sau:
- 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" 
Lệnh này tạo certificate  RSA với 2048 bit và hiệu lực 10 năm.  Lưu ý   ta  đã sử dụng một domain  tùy ý vì  ta  sẽ không bật xác minh TLS cho  server  gnatsd trong bài viết này.
  Đến đây bạn  sẽ có các file  gnatsd.key và gnatsd.crt trong folder  ~/priv . Hãy di chuyển các file  đó theo cấu trúc folder  /srv/nats/ của  ta  để mọi thứ đều ở một nơi. Thực hiện lệnh sau:
- sudo mv ~/priv /srv/nats 
Bây giờ, làm cho /srv/nats/priv có thể truy cập cho  user  và  group  nats :
- sudo chmod 440 /srv/nats/priv/* 
- sudo chmod 550 /srv/nats/priv 
- sudo chown -R nats:nats /srv/nats/priv 
Bây giờ  ta  cập nhật /srv/nats/gnatsd.config để chứa certificate  và khóa  ta  vừa tạo. Mở lại file  cấu hình:
- sudo nano /srv/nats/gnatsd.config 
Và thêm phần sau để gnatsd sử dụng certificate  và khóa của bạn:
. . .  tls {   cert_file: "/srv/nats/priv/gnatsd.crt"   key_file: "/srv/nats/priv/gnatsd.key"   timeout: 1 } Lưu file và thoát khỏi editor . Sau đó, khởi động lại dịch vụ để nó có thể nhận các thay đổi.
- sudo systemctl restart nats 
Hãy kiểm tra xem các certificate của ta có hoạt động không. Chạy lệnh này:
- printf "PING\r\n" | nc localhost 4222 
Lần này, lệnh xuất ra thông báo sau:
OutputINFO {"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'  Server  trả về thông báo -ERR 'Secure Connection - TLS Required'  xác nhận  cấu hình mới đã được chọn và yêu cầu kết nối an toàn, mà nc không biết phải làm thế nào.
Để có thể giao tiếp với dịch vụ NATS của ta mà không cần cài đặt ứng dụng client NATS hoàn chỉnh, ta sẽ sử dụng một công cụ có tên là catnats . Hãy download trước:
- wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py 
Và làm cho nó có thể thực thi được:
- chmod +x catnats.py 
Cuối cùng, di chuyển catnats.py vào folder  /srv/nats/bin và đổi tên nó thành catnats :
- sudo mv catnats.py /srv/nats/bin/catnats 
Hãy kiểm tra xem  ta  có thể giao tiếp với dịch vụ NATS  của bạn  bằng catnats , bằng cách gửi cùng một tin nhắn PING mà  ta  đã gửi trước đây:
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 
Bạn sẽ thấy kết quả này cho biết kết nối của ta là an toàn:
OutputINFO {"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 Bây giờ ta đã bảo mật thông tin liên lạc, hãy cài đặt xác thực để tên user và password được yêu cầu để kết nối với NATS.
Bước 6 - Yêu cầu xác thực
 Dịch vụ NATS của  ta  không yêu cầu xác thực theo mặc định. Điều này là tốt khi dịch vụ chỉ có thể truy cập được trên mạng riêng, nhưng  ta  muốn dịch vụ NATS  của bạn  có thể truy cập được trên internet, vì vậy  ta  nên   cài đặt  xác thực . gnatsd hỗ trợ xác thực tên  user  và password  và rất dễ kích hoạt.
 Mở file  /srv/nats/gnatsd.config :
- sudo nano /srv/nats/gnatsd.config 
Thêm phần authorization mới chỉ định thông tin đăng nhập.  Ta  sẽ sử dụng user1 làm tên  user  và pass1 làm password  cho hướng dẫn này. Bạn nên sử dụng password  dài hơn, phức tạp hơn trong  môi trường production :
. . .  authorization {   user: user1   password: pass1 } Lưu file , sau đó thay đổi chủ sở hữu của /srv/nats/gnatsd.config thành nats và làm cho  user  đó có thể đọc được để bảo vệ tên  user  và password  khỏi những  user  khác trên hệ thống:
- sudo chown nats /srv/nats/gnatsd.config 
- sudo chmod 400 /srv/nats/gnatsd.config 
Sau đó, khởi động lại dịch vụ để các thay đổi có hiệu lực:
- sudo systemctl restart nats 
Hãy gửi tin nhắn PING đến gnatsd để kiểm tra xem mọi thứ có ổn không.   , hãy sử dụng catnats để gửi tin nhắn:
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 
Bạn sẽ thấy kết quả sau:
OutputNFO {"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' Điều này cho  ta  biết rằng các thay đổi đã được áp dụng thành công và bây giờ  ta  cần gửi tên  user  và password  chính xác để kết nối với dịch vụ. Hãy thử lại, lần này cung cấp tên  user  user1 và password  pass1 :
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1 
Lần này nó hoạt động, như bạn thấy từ kết quả sau:
OutputINFO {"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 Bây giờ ta đã giới hạn dịch vụ này cho các khách hàng biết tên user và password , ta có thể cấu hình lại dịch vụ để các khách hàng bên ngoài có thể kết nối.
Bước 7 - Mở dịch vụ ra thế giới
  Ta  đã  cấu hình   server  NATS  của bạn  để lắng nghe trên 127.0.0.1 , đây là giao diện local . Nếu  ta  làm cho nó lắng nghe trên 0.0.0.0 , thì nó sẽ có sẵn trên toàn thế giới. Hãy cập nhật /srv/nats/gnatsd.config lần cuối:
- sudo nano /srv/nats/gnatsd.config 
Sau đó, thay đổi địa chỉ IP được liên kết với cài đặt net :
. . . net: '0.0.0.0' . . . Lưu file và khởi động lại dịch vụ:
- sudo systemctl restart nats 
Và bây giờ dịch vụ NATS của ta đã sẵn sàng cho các kết nối client bên ngoài. Để tìm hiểu cách sử dụng nó, hãy tạo một dịch vụ giám sát đơn giản sử dụng server NATS của ta làm message broker .
Bước 8 - (Tùy chọn) Cấu hình thông báo khi server quá tải
Trong phần này, bạn sẽ tạo một hệ thống giám sát quá tải đơn giản để sử dụng dịch vụ NATS của bạn. Hệ thống sẽ nhận mức trung bình tải của các server và gửi email đến administrator nếu bất kỳ server nào bị quá tải.
Dự án mẫu sẽ bao gồm các thành phần sau:
- Dịch vụ NATS bạn vừa cấu hình .
-  Một màn hình , công bố tên  server , tải trung bình và số bộ xử lý của  server  cho chủ đề stats.loadaveragesau mỗi 60 giây. Bạn cần chạy thành phần này trên bất kỳ server nào bạn muốn theo dõi tải.
-  Trình thông báo , đăng ký chủ đề stats.loadaveragevà nhận tên server lưu trữ, tải trung bình và số bộ xử lý của server . Nếu trung bình tải của server lưu trữ trên một ngưỡng nhất định, trình thông báo sẽ gửi email đến địa chỉ được định nghĩa thông qua server SMTP.
Ta sẽ chạy tất cả các thành phần này trên cùng một server để đơn giản hơn, nhưng bạn có thể thử chạy từng thành phần trong một server khác khi bạn đã hoàn thành hướng dẫn này.
Cài đặt màn hình
 Bạn có thể đọc tải trung bình trên hệ thống Linux từ /proc/loadavg . Đối với dự án này,  ta  chỉ quan tâm đến mức trung bình tải của phút cuối cùng, là trường đầu tiên của  kết quả . Sử dụng lệnh này để nhận giá trị đó:
- cat /proc/loadavg | cut -f1 -d" " 
Bạn sẽ thấy kết quả sau:
Output0.11 Mức trung bình tải bạn nhận được bằng cách đọc /proc/loadavg phụ thuộc vào số lượng bộ xử lý, vì vậy bạn phải chuẩn hóa nó bằng cách chia mức trung bình tải cho số bộ xử lý. Bạn có thể sử dụng lệnh sau để lấy số lượng bộ xử lý của  server  của bạn:
- getconf _NPROCESSORS_ONLN 
Bạn sẽ thấy kết quả được hiển thị trong terminal của bạn :
Output1 Vì shell mặc định của server của ta không thể xử lý số học số động, ta sẽ gửi cả trung bình tải và số bộ xử lý cùng với tên server lưu trữ dưới dạng trọng tải của thông báo của ta và thực hiện phân chia trong trình thông báo sau đó. Đây là lệnh ta sẽ sử dụng để tạo tải trọng:
- echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN` 
Lệnh hiển thị tên server , trung bình tải và số bộ xử lý, tương ứng:
Outputyour_hostname 0.28 1 Hãy tạo một tập lệnh shell xuất bản tên  server , tải trung bình và số lượng bộ xử lý cho  server  NATS của  ta  với chủ đề stats.loadaverage .  Ta  sẽ  cấu hình  hệ thống  của bạn  để chạy tập lệnh này theo định kỳ. Tạo một file  mới có tên ~/publish_load_average.sh :
- nano ~/publish_load_average.sh 
Trong file , hãy thêm tập lệnh này:
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 Tập lệnh này tạo ra thông báo và sau đó chuyển nó đến các catnats , nơi xuất bản thông báo tới dịch vụ NATS.  Ta  chạy catnats với -q switch để ngăn chặn bất kỳ  kết quả , và  ta  sử dụng --raw switch để catnats không cố gắng để giải thích nội dung của các đầu vào. Bạn có thể thay đổi giá trị của biến $NATS_ADDR nếu dịch vụ NATS nằm trên các  server  khác nhau.
Hãy kiểm tra xem kịch bản có gửi trung bình tải tới NATS không.
 Lệnh sau chạy ~/publish_load_average.sh cứ sau 5 giây.  Lưu ý   ta  sử dụng ký tự & ở cuối dòng để chạy lệnh trong nền:
- while true; do sh ~/publish_load_average.sh; sleep 5; done & 
Bạn sẽ thấy kết quả hiển thị rằng lệnh đang chạy trong nền với một ID tiến trình:
Output[1] 14123 Lưu ý : Ghi lại ID tiến trình ở đâu đó, vì bạn  cần  sử dụng ID để dừng lệnh sau này.
 Bây giờ hãy kết nối với NATS và đăng ký chủ đề stats.loadaverage để truy xuất mức trung bình tải:
- printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1 
 Ta  sử dụng cờ --no-exit để tắt tính năng tự động thoát và --pong để duy trì kết nối của  ta  với NATS. Nếu mọi thứ đều chính xác, bạn sẽ nhận được kết quả tương tự như sau sẽ cập nhật sau mỗi 5 giây:
OutputINFO {"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 Nhấn CTRL+C để thoát khỏi catnats .  Ta  hãy dừng vòng lặp có tên là publish_load_average.sh vì  ta  sẽ có một cách tốt hơn để chạy publish_load_average.sh :
- kill 14123 
Phương pháp  ta  vừa thực hiện rất hiệu quả để thử nghiệm, nhưng nó không phải là thứ  ta  muốn sử dụng vĩnh viễn.  Ta  muốn hệ thống chạy publish_load_average.sh chạy mỗi phút. Để thực hiện điều đó,  ta  có thể thêm một mục crontab . Hệ thống Linux sử dụng cron , một hệ thống có thể chạy các lệnh, hay còn gọi là “công việc”, theo lịch trình mà  ta  chỉ định. Lệnh crontab cho phép  ta  quản lý các công việc này. Bạn có thể tìm hiểu tất cả về Cron trong hướng dẫn Cách sử dụng Cron để tự động hóa công việc trên VPS .
Để tạo một mục nhập mới, hãy thực hiện lệnh:
- crontab -e 
Nếu bạn chưa bao giờ chạy lệnh trên, bạn có thể thấy dấu nhắc sau sẽ yêu cầu bạn chọn một editor để quản lý các mục nhập:
Outputno 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]: Nhập số tương ứng với  editor  mà  bạn thấy phù hợp  nhất và nhấn ENTER . Một file  sẽ được hiển thị trong  editor  bạn đã chọn.
 Ở cuối file  đã mở, hãy thêm dòng sau, nhưng hãy thay thế tên  user  của bạn nếu bạn đã sử dụng thứ gì đó không phải sammy :
*/1 * * * * bash /home/sammy/publish_load_average.sh Mục ở trên yêu cầu cron chạy tập lệnh publish_load_average.sh của  ta  mỗi phút. Lưu file  và đóng  editor .
Bây giờ, hãy kiểm tra xem xuất bản định kỳ của mức trung bình tải có hoạt động không:
- printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1 
Chờ trong vài phút và kết quả bạn thấy sẽ tương tự như sau:
OutputINFO {"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 Nhấn CTRL+C để thoát catnats .
Ta đã cài đặt thành công màn hình và nó đang gửi thông báo đến server NATS của ta . Tiếp theo, ta sẽ cài đặt trình thông báo sử dụng dữ liệu này.
Tạo trình thông báo
 Hãy tạo trình thông báo kết nối với dịch vụ NATS của  ta  và lắng nghe các thông báo stats.loadaverage .  Khi  nào chương trình của  ta  nhận được một thông báo, nó sẽ tính toán mức tải trung bình trên mỗi bộ xử lý. Nếu nó cao hơn 0,6 hoặc 60% sử dụng CPU trên mỗi bộ xử lý, nó sẽ đặt cờ cảnh báo cho  server  lưu trữ đã xuất bản thông báo và gửi email đến một địa chỉ  được định nghĩa . Nếu mức trung bình tải trên mỗi bộ xử lý nhỏ hơn 0,4, cờ cảnh báo cho  server  sẽ bị xóa. Để tránh làm tràn hộp thư đến,  ta  sẽ gửi một email khi cờ cảnh báo được đặt.
Ta sẽ sử dụng Node.JS để tạo trình thông báo, vì có một ứng dụng client NATS tuyệt vời cho Node.js. Vì vậy, hãy cài đặt Node.js trước:
- sudo apt-get install -y npm 
Tiếp theo, tạo folder cho trình thông báo và chuyển sang nó:
- mkdir ~/overload_notifier && cd ~/overload_notifier 
Các dự án Node.js sử dụng một file  có tên là package.json chứa thông tin về dự án và các phụ thuộc của nó. Thực thi lệnh sau để tạo file  đó:
- npm init -y 
Sau đó, cài đặt  ứng dụng client  NATS cho Node.js, cũng như module  nodemailer mà  ta  sẽ sử dụng trong dự án này để gửi email cảnh báo:
- npm install nodemailer@2.4.2 nats@0.6.4 --save-exact 
Bây giờ  ta  có thể tạo trình thông báo. Tạo file  notifier.js :
- nano notifier.js 
Sau đó, thêm mã sau vào file :
var NATS_URL = 'nats://127.0.0.1:4222'; var NATS_USER = 'user1'; var NATS_PASS = 'pass1'; var EMAIL_TO = 'admin@example.com'; Đảm bảo bạn thay đổi các tùy chọn này để trùng với tên user và password cho dịch vụ NATS, cũng như địa chỉ email của bạn.
 Tiếp theo, thêm mã này để nhập ứng dụng Node.js NATS và kết nối với dịch vụ gnatsd :
var tlsOptions = {   rejectUnauthorized: false, }; var nats = require('nats').connect({url: NATS_URL,                                     tls: tlsOptions,                                     user: NATS_USER,                                     pass: NATS_PASS}); Sau đó, thêm mã này để cài đặt phong bì và kết nối với server SMTP sẽ gửi email. Ta sẽ sớm cài đặt server này:
var nodemailer = require('nodemailer'); var transport = nodemailer.createTransport('smtp://localhost:2525'); Sau đó, thêm phần còn lại của mã để tính toán mức trung bình tải và xác định xem ta có cần gửi email thông báo hay không:
// 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);  Ta  đăng ký nhận tin nhắn và mỗi khi  ta  nhận được tin nhắn,  ta  thực hiện hàm processMessage , hàm này sẽ phân tích trọng lượng mà  ta  đã gửi và xác định mức trung bình tải. Nếu nó quá cao,  ta  sẽ gửi tin nhắn và theo dõi xem trước đây  ta  đã gửi tin nhắn hay chưa bằng cách đặt cờ dựa trên tên  server . Bằng cách này,  ta  có thể theo dõi thông báo trên cơ sở từng  server . Nếu mức trung bình tải dưới ngưỡng của  ta ,  ta  xóa cờ đó.
Với màn hình và trình thông báo tại chỗ, đã đến lúc kiểm tra dự án mẫu của ta .
Kiểm tra dự án
Hãy lấy cái này để lái thử. Ta sẽ tạo một số tải nhân tạo và kiểm tra xem trình thông báo có gửi email cảnh báo khi tải quá cao hay không.
 Hãy cài đặt công cụ stress để tạo tải CPU trên  server  của  ta :
- sudo apt-get install -y stress 
Tiếp theo,  ta  cần  cài đặt  một  server  SMTP để gửi thư từ trình thông báo của  ta . Việc cài đặt và  cấu hình  một  server  SMTP toàn diện sẽ là quá mức cần thiết cho thử nghiệm này, vì vậy  ta  sẽ sử dụng một  server  SMTP đơn giản chỉ hiển thị các email được gửi đến nó thay vì thực sự gửi chúng. Ngôn ngữ lập trình Python có một module  DebuggingServer mà  ta  có thể tải để loại bỏ các email mà nó nhận được, nhưng hiển thị chúng ra màn hình để  ta  có thể đảm bảo mọi thứ hoạt động. Python đã được cài đặt trên  server  Ubuntu của  ta , vì vậy đây là một giải pháp hoàn hảo.
 Hãy bắt đầu gỡ lỗi  server  SMTP trong nền.  Ta  sẽ làm cho nó lắng nghe trên cổng localhost 2525 ,  trùng với  địa chỉ SMTP mà  ta  đã  cấu hình  trong mã notifier.js của  ta . Thực thi lệnh này để khởi động  server  SMTP:
- python -m smtpd -n -c DebuggingServer localhost:2525 & 
Sau đó, khởi động trình thông báo trong nền bằng lệnh này:
- nodejs ~/overload_notifier/notifier.js & 
Và cuối cùng, hãy tạo một số tải trên tất cả các bộ xử lý của  server  của  ta . Thực hiện lệnh stress với các tùy chọn sau:
- stress --cpu $(getconf _NPROCESSORS_ONLN) 
Sau một vài phút, bạn sẽ thấy kết quả tương tự như sau, khi server SMTP bắt đầu hiển thị các thông báo được gửi bởi trình thông báo:
Output---------- 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 ------------ Điều này cho bạn biết bạn đã gửi email thành công khi tải quá cao trên server .
 Nhấn CTRL+C để ngừng tạo tải. Bạn đã hoàn thành dự án mẫu và bây giờ nên có một ý tưởng tốt về cách làm cho dự án này hoạt động cho bạn trong môi trường  của bạn .
Kết luận
Trong bài viết này, bạn đã tìm hiểu về hệ thống nhắn tin NATS PubSub, cài đặt nó một cách an toàn như một dịch vụ và thử nghiệm nó trong một dự án mẫu. Dự án mẫu đã sử dụng ứng dụng client Node.JS, nhưng NATS có ứng dụng client cho nhiều ngôn ngữ và khuôn khổ hơn mà bạn có thể tìm thấy được liệt kê trên trang download NATS . Bạn có thể tìm hiểu thêm về NATS trong tài liệu chính thức của nó.
Các tin liên quan
Cách kết nối Internet of Things của bạn với Node-RED trên Ubuntu 16.042016-09-23
Cách cài đặt R trên Ubuntu 16.04
2016-09-19
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách sử dụng LVM để quản lý thiết bị lưu trữ trên Ubuntu 16.04
2016-09-14
Cách cài đặt và cấu hình PostGIS trên Ubuntu 14.04
2016-09-01
Cách thiết lập vsftpd cho Tải xuống ẩn danh trên Ubuntu 16.04
2016-08-25
Cách triển khai ứng dụng Node.js bằng Terraform trên Ubuntu 14.04
2016-08-25
Cách cấu hình Cụm Galera với MariaDB 10.1 trên server Ubuntu 16.04
2016-08-19
Cách quản lý mảng RAID với mdadm trên Ubuntu 16.04
2016-08-16
 

