Данный документ описывает создание минимально доступной рабочей структуры модуля расширения без реализации функционала RPC.
В будущем его можно использовать для обогащения операций необходимой логикой работы.
Подключение модуля расширения к системе осуществляется с помощью следующих ключевых технологий:
Для создания проекта на golang необходимо установить sdk по следующей инструкции.
Далее в директории проекта необходимо инициализировать файл go.mod для загрузки внешних зависимостей с помощью команды go mod init <название_корневого_модуля_по_усмотрению>.
Для работы сервиса необходимы прото-файлы. Полный набор прото-файлов можно найти в корне проекта sdk, в директории .proto.
Копия набора прото-файлов для RPC DebugAccess расположены в директории proto проекта.
Из данных прото-файлов необходимо сгенерировать код для корректной работы сервера, для этого рекомендуется использовать следующий набор утилит:
Для установки в Ubuntu 22.04:
apt-get update && \
apt install -y protobuf-compiler && \
apt clean
go env -w GOSUMDB=off
go env -w GO111MODULE=on
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.32.0 && \
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0Рекомендуется использовать Makefile и утилиту make для работы с проектом, создадим его и распишем набор команд:
MODULE_NAME=<название_корневого_модуля_по_усмотрению>
gen:
cd proto && \
protoc --go_out=./.. \
--go_opt=Mservice_service_manager.proto=${MODULE_NAME}/gen/cluster-contract \
--go_opt=Mshared_service_instance.proto=${MODULE_NAME}/gen/cluster-contract \
--go_opt=module=${MODULE_NAME} \
--go-grpc_out=./.. \
--go-grpc_opt=Mservice_service_manager.proto=${MODULE_NAME}/gen/cluster-contract \
--go-grpc_opt=Mshared_service_instance.proto=${MODULE_NAME}/gen/cluster-contract \
--go-grpc_opt=module=${MODULE_NAME} \
service_service_manager.proto shared_service_instance.proto
tidy:
go mod tidy
build: gen tidy
CGO_ENABLED=0 go build -o binСгенерировать код из прото-файлов можно с помощью команды make gen.
С помощью команды make build можно сбилдить проект.
Для создания сервера gRPC в go нам необходимо:
- Создать структуру, которая будет реализовывать интерфейс сервиса, описанного в прото-файле.
// Инстанс сервиса с реализацией RPC.
type microservice struct {
pb.UnimplementedServiceManagerServer
}
// RPC для проверки доступности сервиса при заведении.
func (r *microservice) DebugAccess(context.Context, *pb.DebugServiceAccessRequest) (*pb.DebugServiceAccessResponse, error) {
//реализация rpc
//...
return nil, errors.New("not implemented")
}- Создать сущность структуры сервиса, создать сущность сервера gRPC, связать их и запустить сервер.
func run() error {
// Создаем инстанс сервиса.
m := microservice{}
// Создаем инстанс сервера.
server := grpc.NewServer()
// Регистрируем сервис.
pb.RegisterServiceManagerServer(server, &m)
// Создаем листененра.
lis, err := net.Listen("tcp", listenPort)
if err != nil {
return fmt.Errorf("create listener: %s", err)
}
// Запускаем gRPC сервер.
return server.Serve(lis)
}На данном этапе пустой шаблон модуля расширения готов для локального запуска.
Для подключения модуля к системе необходимо настроить Dockerfile и docker-compose.yaml, подробную информацию об этом можно найти в директории deploy.
Пример готового шаблона модуля расширения находится в директории project.