- PVSM.RU - https://www.pvsm.ru -
В этой статье хочу поделится нашими c SergeyMaslov [1] наработками решения типовых задач с использованием микросервисной архитектуры на примере задачи «создание блога» (в надежде, что читатель представляет как устроен блог и это не должно вызывать вопросов по функциональности:)
Итак, наш блог будет состоять из 5 микросервисов, написанных на golang:
Клиентское приложение (web/frontend) будет реализован на vue.js и будет взаимодействовать с микросервисами через REST API, а сами микросервисы будут взаимодействовать друг с другом по gRPC.
В качестве хранилища мы будем использовать MongoDB.
Отдельной вишенкой на торте покажем, как с минимальными трудозатратами поддерживать документацию API (в формате swagger) в актуальном состоянии в активно развивающемся проекте.
Каждый микросервис будет реализован в отдельном Docker контейнере, а запуск проекта будет осуществляться с помощью docker-compose.
Сразу оговорюсь в примере, для упрощения процесса разработки, буду использовать два допущения, которые не следует использовать в продакшене.
Демо проекта можно посмотреть здесь [2], а исходный код здесь [3].
Как я уже ранее говорил, взаимодействие между микросервисами будет построено на основе gRPC. В двух словах gRPC это высокопроизводительный фреймворк, разработанный компанией Google, для вызова удаленных процедур (RPC) — работает поверх HTTP/2. В основе gRPC лежит так называемый протофайл (см. пример ниже), основная задача которого в компактной форме задекларировать две вещи:
Ниже, в качестве примера, приведен протофайла сервис Category.
syntax = "proto3";
package protobuf;
import "google/api/annotations.proto";
//Описание интерфейсов сервиса Category
service CategoryService {
//Создание записи
rpc Create (CreateCategoryRequest) returns (CreateCategoryResponse) {
option (google.api.http) = {
post: "/api/v1/category"
};
}
//Обновление записи
rpc Update (UpdateCategoryRequest) returns (UpdateCategoryResponse) {
option (google.api.http) = {
post: "/api/v1/category/{Slug}"
};
}
//Удаление записи
rpc Delete (DeleteCategoryRequest) returns (DeleteCategoryResponse) {
option (google.api.http) = {
delete: "/api/v1/category/{Slug}"
};
}
//Возвращает запись по SLUG
rpc Get (GetCategoryRequest) returns (GetCategoryResponse) {
option (google.api.http) = {
get: "/api/v1/category/{Slug}"
};
}
//Писк
rpc Find (FindCategoryRequest) returns (FindCategoryResponse) {
option (google.api.http) = {
get: "/api/v1/category"
};
}
}
//------------------------------------------
// CREATE
//------------------------------------------
message CreateCategoryRequest {
string ParentId = 1;
string Name = 2;
string Path = 3;
}
message CreateCategoryResponse {
Category Category = 1;
}
//------------------------------------------
// UPDATE
//------------------------------------------
message UpdateCategoryRequest {
string Slug = 1;
string ParentId = 2;
string Name = 4;
string Path = 5;
int32 Status = 6;
}
message UpdateCategoryResponse {
int32 Status =1;
}
//------------------------------------------
// DELETE
//------------------------------------------
message DeleteCategoryRequest {
string Slug = 1;
}
message DeleteCategoryResponse {
int32 Status =1;
}
//------------------------------------------
// GET
//------------------------------------------
message GetCategoryRequest {
string Slug = 1;
}
message GetCategoryResponse {
Category Category = 1;
}
//------------------------------------------
// FIND
//------------------------------------------
message FindCategoryRequest {
string Slug = 1;
}
message FindCategoryResponse {
repeated Category Categories = 1;
}
//------------------------------------------
// CATEGORY
//------------------------------------------
message Category {
string Slug = 1;
string ParentId = 2;
string Path = 3;
string Name = 4;
int32 Status = 5;
}
Теперь, когда мы в общих чертах разобрались зачем нужен протофайл, посмотрим как будет выглядеть процесс разработки наших микросервисов:
Далее, если мы захоти внести изменения в один из наших микросервисов, действуем по вышеописанному алгоритму: правим протофайл, запускаем protogen, правим реализацию в functions.go, а в документацию и к клиентам изменения “уедут” автоматически.
Продолжение в статье «Пишем блог на микросервисах часть 2 API Gateway» [4].
Автор: Ptimofeev
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/golang/334786
Ссылки в тексте:
[1] SergeyMaslov: https://habr.com/ru/users/sergeymaslov/
[2] здесь: http://85.143.220.160
[3] здесь: https://github.com/msa-library/blog
[4] «Пишем блог на микросервисах часть 2 API Gateway»: https://habr.com/ru/post/473516/
[5] Источник: https://habr.com/ru/post/473514/?utm_campaign=473514&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.