We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Разработка и отладка микросервисов на Go и gRPC в Termux: генерация protobuf, hot‑reload и мониторинг через Prometheus

Создание, отладка и мониторинг микросервисов на Go и gRPC прямо на вашем Android-устройстве с помощью Termux, protobuf, hot-reload и Prometheus.

Termux – мощная среда эмуляции Linux для Android, позволяющая запускать широкий спектр инструментов разработки прямо на вашем мобильном устройстве. В этой статье мы рассмотрим, как использовать Termux для разработки и отладки микросервисов на Go с использованием gRPC, включая генерацию protobuf, автоматическую перезагрузку (hot-reload) и мониторинг через Prometheus. Это позволяет быстро прототипировать и тестировать сервисы без необходимости использования полноценной рабочей станции.

Необходимые инструменты

Прежде чем начать, убедитесь, что у вас установлено следующее:

  • Termux: https://termux.dev/
  • Go: pkg install go
  • Protobuf compiler (protoc): pkg install protobuf
  • gRPC: go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
  • Prometheus: pkg install prometheus (Обратите внимание, что Prometheus может потребовать значительных ресурсов устройства)

Также потребуется редактор кода. Можно использовать Vim, Nano, или установить более продвинутые редакторы через Termux.

Генерация protobuf

gRPC использует Protocol Buffers для определения структуры сообщений. Начнем с определения файла .proto. Например, создадим файл service.proto со следующим содержанием:

syntax = "proto3";
package example;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Теперь сгенерируем Go код из этого файла:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative service.proto

Эта команда создаст файлы service.pb.go и service_grpc.pb.go, содержащие сгенерированный Go код для взаимодействия с gRPC сервисом.

Реализация gRPC сервиса на Go

Создадим файл server.go, реализующий наш gRPC сервис:

package main

import (
	"context"
	"fmt"
	"log"
	"net"

	"example"
	"google.golang.org/grpc"
)

type server struct { example.UnimplementedGreeterServer }

func (s server) SayHello(ctx context.Context, in example.HelloRequest) (example.HelloReply, error) {
	return &example.HelloReply{Message: "Hello, " + in.Name},
	 nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	s := grpc.NewServer()
	example.RegisterGreeterServer(s, &server{})

	log.Println("Server listening on port 50051")
	s.Serve(lis)
}

Hot-Reload с использованием Air

Для автоматической перезагрузки сервера при изменении кода, можно использовать инструмент Air. Сначала установим Air:

go install github.com/cosmtrek/air@latest

Затем запустим сервер с Air:

air -c . air.toml

Создайте файл air.toml в корне проекта с настройками:

root = "./"
cmd = "go run server.go"
ignore = [".tmp", "tmp/"]

Теперь, при сохранении изменений в файле server.go, Air автоматически перезапустит сервер.

Мониторинг с помощью Prometheus

Для мониторинга gRPC сервиса можно использовать Prometheus. Необходимо добавить метрики в ваш Go код. Например:

package main

import (
	"context"
	"fmt"
	"log"
	"net"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"

	"example"
	"google.golang.org/grpc"
)

var (  // Define metrics
	requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "grpc_requests_total",
		Help: "Total number of gRPC requests.",
	})
)

func init() {
	// Register metrics
	prometheus.MustRegister(requestsTotal)
}

func (s server) SayHello(ctx context.Context, in example.HelloRequest) (example.HelloReply, error) {
	requestsTotal.Inc()
	return &example.HelloReply{Message: "Hello, " + in.Name},
	 nil
}

func main() {
	// Add HTTP endpoint for Prometheus
	go func() {
		http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
			promhttp.Handler().ServeHTTP(w, r)
		})
		log.Println("Prometheus endpoint listening on port 9090")
		log.Fatal(http.ListenAndServe(":9090", nil))
	}()

	...
	// Rest of the server code
}

После этого запустите Prometheus и настройте его для сбора метрик с вашего Termux устройства. Для этого может потребоваться настройка локальной сети с использованием VPN (например, WireGuard) для обеспечения доступа к Prometheus, работающему в Termux, с вашего компьютера. (Использование VPN рассматривается только для создания локальной сети для разработки и тестирования, а не для обхода каких-либо блокировок).

Заключение

В этой статье мы рассмотрели, как разрабатывать и отлаживать микросервисы на Go и gRPC в Termux. Использование protobuf для определения интерфейсов, hot-reload с Air для ускорения разработки и мониторинг с Prometheus для отслеживания производительности делают Termux мощным инструментом для разработки в мобильной среде.

Если вам требуется помощь в разработке, настройке или оптимизации микросервисной архитектуры, команда РыбинскЛАБ готова предложить вам свои услуги. Мы предоставляем полный спектр услуг по разработке, внедрению и поддержке микросервисов, а также консультации по выбору оптимальных технологий и инструментов.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект