1 год назад История
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 с ошибкой