README.md
Mice (MICrosevice Extension)
Простой фреймворк для работы с микросервисами.
Процесс работы: 1. Создаем бизнес-логику через произвольную структуру, напр.: 2. Создаем методы, преобразующие данные, получаемые из различных транспортов в объекты данных, принимаемых и возвращаемых бизнес-логикой 3. Создаем сам микросервис для реализации описанной бизнес-логики
Пример использования с Http транспортом
Создаем бизнес-логику через произвольную структуру, напр.:
type GreetService struct{}
func (g *GreetService) Greet(request any) (any, error) {
castRequest := request.(*GreetEndpointInput)
return &GreetEndpointOutput{
Greeting: "Hello " + castRequest.Name,
}, nil
}
Создаем методы, преобразующие данные, получаемые из различных транспортов в объекты данных, принимаемых и возвращаемых бизнес-логикой
// Преобразует данные http запроса в структуру данных, которую понимает метод бизнес-логики
var GreetDecoder std.Decoder = func(raw any) (any, error) {
httpRequest := raw.(*http.Request)
var result GreetEndpointInput
err := thttp.DecodeRequest(httpRequest, &result) // thttp.DecodeRequest - часть стандартной библиотеки Mice, преобразующей тело, заголовки и параметры запроса (query часть URL) в структуру заданного типа
if err != nil {
return nil, err
}
return &result, nil
}
// Преобразует результат работы метода бизнес-логики в объект данных, воспринимаемый транспортом http
var GreetEncoder std.Encoder = func(endpointResult any) (io.Reader, error) {
var b bytes.Buffer
encoder := json.NewEncoder(&b)
castResult := endpointResult.(*GreetEndpointOutput)
err := encoder.Encode(&castResult)
if err != nil {
return nil, err
}
return &b, nil
}
Создаем сам микросервис для реализации описанной бизнес-логики
var logic = new(GreetService) // Логика сервиса основана на структуре GreetService
func main() {
transport := &transports.Http{} // СОздаем транспорт для сервиса (по умолчанию будут слушаться все хосты на порте 8080)
service := mice.NewService(context.TODO(), transport) // Создаем непосредственно сам сервис с указанным транспортом (дополнительно далее можно добавить дополнительные транспорты)
// Инициализируем endpoints
transport.AddAdapter("greet", "POST", GreetDecoder, GreetEncoder, logic.Greet, GreetErrorHandler, GreetPostProcess)
transport.Middleware(thttp.MatchHeadersMiddleware(map[string]string{"Content-Type": "application/json"})) // Добавляем требование к типу переданного контента
// Инициализируем сервис на основе ранее указанных параметров
err := service.Init()
if err != nil {
fmt.Println(err)
return
}
service.Start() // Запускаем сервис
var forever chan bool // Блокируем автоматический выход из main
<-forever
}
Конвейеры
0 успешных
0 с ошибкой