2023-03-17 11:20:09 +03:00
|
|
|
package nats_connect
|
|
|
|
|
|
|
|
|
|
import (
|
2023-06-01 18:02:36 +03:00
|
|
|
"context"
|
2025-04-03 15:43:33 +03:00
|
|
|
"github.com/ManyakRus/starter/log"
|
2023-06-01 18:02:36 +03:00
|
|
|
"github.com/ManyakRus/starter/micro"
|
2023-12-26 16:42:53 +03:00
|
|
|
"github.com/ManyakRus/starter/port_checker"
|
2023-11-14 13:39:20 +03:00
|
|
|
"github.com/nats-io/nats.go"
|
2023-03-17 11:20:09 +03:00
|
|
|
"os"
|
2024-09-27 15:04:30 +03:00
|
|
|
"sync"
|
|
|
|
|
|
2023-05-02 09:51:50 +03:00
|
|
|
//"github.com/ManyakRus/starter/common/v0/micro"
|
|
|
|
|
"github.com/ManyakRus/starter/contextmain"
|
|
|
|
|
"github.com/ManyakRus/starter/stopapp"
|
2023-03-17 11:20:09 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Conn - соединение к серверу nats
|
|
|
|
|
var Conn *nats.Conn
|
|
|
|
|
|
|
|
|
|
// log - глобальный логгер
|
2025-04-03 15:43:33 +03:00
|
|
|
//var log = logger.GetLog()
|
2023-03-17 11:20:09 +03:00
|
|
|
|
|
|
|
|
// Settings хранит все нужные переменные окружения
|
|
|
|
|
var Settings SettingsINI
|
|
|
|
|
|
|
|
|
|
// SettingsINI - структура для хранения всех нужных переменных окружения
|
|
|
|
|
type SettingsINI struct {
|
|
|
|
|
NATS_HOST string
|
|
|
|
|
NATS_PORT string
|
|
|
|
|
NATS_LOGIN string
|
|
|
|
|
NATS_PASSWORD string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Connect - подключается к серверу Nats
|
2025-02-17 16:49:15 +03:00
|
|
|
func Connect(ServiceName string) {
|
2023-03-17 11:20:09 +03:00
|
|
|
var err error
|
|
|
|
|
|
2025-02-17 16:49:15 +03:00
|
|
|
err = Connect_err(ServiceName)
|
2024-09-27 16:32:56 +03:00
|
|
|
LogInfo_Connected(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// LogInfo_Connected - выводит сообщение в Лог, или паника при ошибке
|
|
|
|
|
func LogInfo_Connected(err error) {
|
2023-03-17 11:20:09 +03:00
|
|
|
if err != nil {
|
|
|
|
|
log.Panicln("NATS Connect() error: ", err)
|
|
|
|
|
} else {
|
|
|
|
|
log.Info("NATS Connect() ok ")
|
|
|
|
|
}
|
2024-09-27 16:32:56 +03:00
|
|
|
|
2023-03-17 11:20:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Connect_err - подключается к серверу Nats и возвращает ошибку
|
2025-02-17 16:49:15 +03:00
|
|
|
func Connect_err(ServiceName string) error {
|
2023-03-17 11:20:09 +03:00
|
|
|
var err error
|
|
|
|
|
|
|
|
|
|
if Settings.NATS_HOST == "" {
|
|
|
|
|
FillSettings()
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-26 16:42:53 +03:00
|
|
|
port_checker.CheckPort(Settings.NATS_HOST, Settings.NATS_PORT)
|
2023-03-17 11:20:09 +03:00
|
|
|
|
|
|
|
|
sNATS_PORT := Settings.NATS_PORT
|
|
|
|
|
URL := "nats://" + Settings.NATS_HOST + ":" + sNATS_PORT
|
|
|
|
|
UserInfo := nats.UserInfo(Settings.NATS_LOGIN, Settings.NATS_PASSWORD)
|
2025-02-17 16:49:15 +03:00
|
|
|
Options := nats.GetDefaultOptions()
|
|
|
|
|
Options.Name = ServiceName
|
2023-03-17 11:20:09 +03:00
|
|
|
Conn, err = nats.Connect(URL, UserInfo)
|
|
|
|
|
|
|
|
|
|
//nats.ManualAck()
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// StartNats - необходимые процедуры для подключения к серверу Nats
|
2025-02-17 16:49:15 +03:00
|
|
|
func StartNats(ServiceName string) {
|
2024-09-27 16:32:56 +03:00
|
|
|
var err error
|
2023-03-17 11:20:09 +03:00
|
|
|
|
2024-09-27 16:32:56 +03:00
|
|
|
ctx := contextmain.GetContext()
|
|
|
|
|
WaitGroup := stopapp.GetWaitGroup_Main()
|
2025-02-17 16:49:15 +03:00
|
|
|
err = Start_ctx(&ctx, WaitGroup, ServiceName)
|
2024-09-27 16:32:56 +03:00
|
|
|
LogInfo_Connected(err)
|
2023-03-17 11:20:09 +03:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-27 15:04:30 +03:00
|
|
|
// Start_ctx - необходимые процедуры для подключения к серверу NATS
|
|
|
|
|
// Свой контекст и WaitGroup нужны для остановки работы сервиса Graceful shutdown
|
|
|
|
|
// Для тех кто пользуется этим репозиторием для старта и останова сервиса можно просто StartNats()
|
2025-02-17 16:49:15 +03:00
|
|
|
func Start_ctx(ctx *context.Context, WaitGroup *sync.WaitGroup, ServiceName string) error {
|
2024-09-27 15:04:30 +03:00
|
|
|
var err error
|
|
|
|
|
|
2024-09-30 12:05:31 +03:00
|
|
|
//запомним к себе контекст
|
2024-09-27 15:04:30 +03:00
|
|
|
contextmain.Ctx = ctx
|
2024-09-30 12:05:31 +03:00
|
|
|
if ctx == nil {
|
|
|
|
|
contextmain.GetContext()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//запомним к себе WaitGroup
|
2024-09-27 15:04:30 +03:00
|
|
|
stopapp.SetWaitGroup_Main(WaitGroup)
|
2024-09-30 12:05:31 +03:00
|
|
|
if WaitGroup == nil {
|
|
|
|
|
stopapp.StartWaitStop()
|
|
|
|
|
}
|
2024-09-27 15:04:30 +03:00
|
|
|
|
|
|
|
|
//
|
2025-02-17 16:49:15 +03:00
|
|
|
err = Connect_err(ServiceName)
|
2024-09-27 15:36:29 +03:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stopapp.GetWaitGroup_Main().Add(1)
|
|
|
|
|
go WaitStop()
|
2024-09-27 15:04:30 +03:00
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-17 11:20:09 +03:00
|
|
|
// CloseConnection - закрывает соединение с сервером Nats
|
|
|
|
|
func CloseConnection() {
|
|
|
|
|
//var err error
|
|
|
|
|
|
|
|
|
|
if Conn == nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Conn.Close()
|
|
|
|
|
|
|
|
|
|
log.Info("NATS stopped")
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-06 18:05:30 +03:00
|
|
|
// WaitStop - ожидает отмену глобального контекста
|
2023-03-17 11:20:09 +03:00
|
|
|
func WaitStop() {
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
case <-contextmain.GetContext().Done():
|
|
|
|
|
log.Warn("Context app is canceled. NATS_Connect.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CloseConnection()
|
|
|
|
|
|
|
|
|
|
stopapp.GetWaitGroup_Main().Done()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FillSettings загружает переменные окружения в структуру из файла или из переменных окружения
|
|
|
|
|
func FillSettings() {
|
|
|
|
|
Settings = SettingsINI{}
|
|
|
|
|
Settings.NATS_HOST = os.Getenv("NATS_HOST")
|
|
|
|
|
Settings.NATS_PORT = os.Getenv("NATS_PORT")
|
|
|
|
|
Settings.NATS_LOGIN = os.Getenv("NATS_LOGIN")
|
|
|
|
|
Settings.NATS_PASSWORD = os.Getenv("NATS_PASSWORD")
|
|
|
|
|
|
2023-11-10 13:01:08 +03:00
|
|
|
// как у всех
|
2023-03-17 11:20:09 +03:00
|
|
|
if Settings.NATS_HOST == "" {
|
2023-11-10 13:01:08 +03:00
|
|
|
Settings.NATS_HOST = os.Getenv("BUS_LOCAL_HOST")
|
2023-03-17 11:20:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if Settings.NATS_PORT == "" {
|
2023-11-10 13:01:08 +03:00
|
|
|
Settings.NATS_PORT = os.Getenv("BUS_LOCAL_PORT")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if Settings.NATS_HOST == "" {
|
|
|
|
|
log.Error("Need fill NATS_HOST ! in os.ENV ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
if Settings.NATS_PORT == "" {
|
|
|
|
|
log.Error("Need fill NATS_PORT ! in os.ENV ")
|
2023-03-17 11:20:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//if Settings.NATS_LOGIN == "" {
|
|
|
|
|
// log.Panicln("Need fill NATS_LOGIN ! in os.ENV ")
|
|
|
|
|
//}
|
|
|
|
|
//
|
|
|
|
|
//if Settings.NATS_PASSWORD == "" {
|
|
|
|
|
// log.Panicln("Need fill NATS_PASSWORD ! in os.ENV ")
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
}
|
2023-06-01 18:02:36 +03:00
|
|
|
|
|
|
|
|
// SendMessageCtx - Отправляет сообщение, учитывает таймаут контекста
|
|
|
|
|
func SendMessageCtx(ctx context.Context, subject string, data []byte) error {
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
|
|
fn := func() error {
|
|
|
|
|
err = SendMessage(subject, data)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
err = micro.GoGo(ctx, fn)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SendMessage - Отправляет сообщение
|
|
|
|
|
func SendMessage(subject string, data []byte) error {
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
|
|
err = Conn.Publish(subject, data)
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
}
|