Встраивание NATS в Go
2 марта 2022 г.В этой статье мы рассмотрим, как мы можем встроить сервер NATS в наше приложение Go. После этого мы также проведем небольшой тест производительности между встроенным и внешним сервисом.
Примечание: как всегда, весь код будет доступен здесь
Зачем нам это надо?
Во время работы nats server с использованием cli или docker контейнер обычно является предпочтительным способом, но в некоторых случаях он может быть ненужным, например, тестирование. Во время тестирования часто сложно запускать новые экземпляры для внешних служб, этого можно полностью избежать, используя сервер в памяти. К счастью, серверный пакет NATS предоставляет эту функциональность из коробки!
Настраивать
Прежде чем писать какой-либо код, давайте быстро настроим наш проект go.
Перейти к модулю
Пример инициализации $go mod
$ коснитесь main.go
Зависимости
$ получить -d github.com/nats-io/nats-server/v2
$ перейти на github.com/nats-io/nats.go
Код
После настройки мы можем начать с инициализации нового сервера с параметрами.
```иди
опции := &server.Options{}
нс, ошибка := server.NewServer(opts)
если ошибка != ноль {
паника (ошибка)
*Примечание. Вы можете настроить такие вещи, как * «Хост», «Порт», «Авторизация» и многое другое, используя «server.Options».
Далее запустим сервер через горутину и дождемся готовности сервера к соединениям
```иди
перейти ns.Start()
если !ns.ReadyForConnections(4 * time.Second) {
паника("не готов к соединению")
Как только наш сервер будет готов, мы можем подключиться к нему с помощью клиента [nats.go](https://github.com/nats-io/nats.go), используя функцию ClientURL
, предоставленную сервером.
```иди
nc, ошибка := nats.Connect(ns.ClientURL())
если ошибка != ноль {
паника (ошибка)
Давайте подпишемся на тему и напечатаем данные сообщения. При желании мы можем вызвать функцию «Выключение», чтобы остановить сервер NAT.
```иди
тема := "моя тема"
nc.Subscribe(тема, func(msg *nats.Msg) {
данные: = строка (msg.Data)
fmt.Println(данные)
ns.Shutdown()
Наконец, мы опубликуем данные для нашей темы и вызовем WaitForShutdown
, чтобы наш сервер работал до отключения.
```иди
nc.Publish(subject, []byte("Привет, встроенный NATS!"))
ns.WaitForShutdown()
Наш полный пример должен выглядеть так!
```иди
основной пакет
импорт (
"ФМТ"
"время"
"github.com/nats-io/nats-сервер/v2/сервер"
"github.com/nats-io/nats.go"
основная функция () {
опции := &server.Options{}
// Инициализировать новый сервер с параметрами
нс, ошибка := server.NewServer(opts)
если ошибка != ноль {
паника (ошибка)
// Запускаем сервер через горутину
перейти ns.Start()
// Ждем, пока сервер будет готов к соединениям
если !ns.ReadyForConnections(4 * time.Second) {
паника("не готов к соединению")
// Подключаемся к серверу
nc, ошибка := nats.Connect(ns.ClientURL())
если ошибка != ноль {
паника (ошибка)
тема := "моя тема"
// Подписка на тему
nc.Subscribe(тема, func(msg *nats.Msg) {
// Печать данных сообщения
данные: = строка (msg.Data)
fmt.Println(данные)
// Выключить сервер (необязательно)
ns.Shutdown()
// Публикуем данные в тему
nc.Publish(subject, []byte("Привет, встроенный NATS!"))
// Ждем завершения работы сервера
ns.WaitForShutdown()
Стройте и запускайте!
Давайте создадим и запустим двоичный файл нашего примера со встроенным сервером NATS.
$ иди строй
$ ./пример
Привет, встроенный NATS!
Как видим, мы получаем отдачу от наших подписчиков!
Представление
Производительность — важный аспект каждого приложения, поэтому давайте сравним производительность при использовании NATS в качестве встроенной или внешней службы (cli, docker и т. д.). Мы запустим тест на 1 миллион сообщений за 8 интервалов.
Настраивать
Во-первых, нам нужно запустить внешний сервер nats
$ nats-сервер
[5868] 22.02.2022 20:09:21.073386 [INF] Запуск nats-сервера
[5868] 2022/02/22 20:09:21.073657 [INF] Версия: 2.7.0
[5868] 22/02/2022 20:09:21.073660 [INF] Git: [не установлено]
[5868] 22/02/2022 20:09:21.073662 [INF] Имя: NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 2022/02/22 20:09:21.073665 [INF] ID: NCFHZUA6H6YRJHE65OXRW5X5NL2XDTR7Q4NBZG5Q2KEHZTFN6JMUK4HU
[5868] 22/02/2022 20:09:21.076236 [INF] Прослушивание клиентских подключений на 0.0.0.0:4222
[5868] 2022/02/22 20:09:21.076659 [INF] Сервер готов
Результаты
Код эталонного теста можно найти [здесь] (https://github.com/karanpratapsingh/tutorials/tree/master/nats/embedding/benchmark), и его можно запустить, как показано ниже.
$ запустить тест/benchmark.go
Результаты сохранены в results.html.
Похоже, что в производительности нет большой разницы, это действительно впечатляет, учитывая, что мы тестируем миллионы сообщений.
Заключение
В этой статье мы узнали, как мы можем встроить сервер NAT в наши приложения Go. А также сделал небольшой тест производительности. Обязательно ознакомьтесь с [официальными документами] (https://docs.nats.io/).
Также опубликовано [Здесь] (https://dev.to/karanpratapsingh/embedding-nats-in-go-19o)
Оригинал