1
0
mirror of https://github.com/ManyakRus/starter.git synced 2025-11-23 22:45:11 +02:00
Files
starter/nats_connect/nats_connect.go

199 lines
4.9 KiB
Go
Raw Normal View History

2023-03-17 11:20:09 +03:00
package nats_connect
import (
2023-06-01 18:02:36 +03:00
"context"
"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 - глобальный логгер
//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
}