Встраивание NATS в Go

Встраивание 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)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE