Создание и запуск сервера gRPC с помощью Go (часть 1/3)

Приветствую вас, коллеги-разработчики и поклонники технологий! Вы когда-нибудь чувствовали, что выбор протокола связи чем-то похож на выбор блюда из меню фуд-корта? Не волнуйтесь, мы собираемся разгадать тайны gRPC с помощью замечательного языка Go. Приготовьтесь к сериалу, который заставит вас общаться уверенно!

Но прежде чем мы начнем, давайте кратко поговорим о коммуникационной сфере. Представьте себе REST как непринужденного друга, который всегда готов поболтать, но иногда говорит загадками. 🤷‍♂️

Теперь на сцену выходит GraphQL, харизматичный коммуникатор, профессионал в персонализированных беседах. Это похоже на вежливого дворецкого, который приносит именно то, что вы просите. Впечатляет, правда? Но помните, даже у самых обаятельных компаньонов есть свои пределы.

И затем, барабанная дробь, пожалуйста… введите gRPC! 🌟 Это быстрый и высокопроизводительный мессенджер, который мы собираемся изучить. Это похоже на сверхэффективного коллегу, который всегда делает работу правильно. Кроме того, он свободно говорит на строго типизированных языках, поэтому ошибок при декодировании больше не будет!

В этом вступительном выпуске мы закладываем основу для нашего приключения. Мы поможем вам настроить собственный сервер Go gRPC с нуля. Не волнуйтесь, если вы не гроссмейстер по го — просто проявите свой энтузиазм и немного любопытства. Да, и ожидайте немного смеха и много нового по пути!🎢

Прежде чем двигаться дальше, запустите проект GO и установите все зависимости:

go mod init example
go get google.golang.org/grpc google.golang.org/protobuf github.com/golang/protobuf

Итак, наша отправная точка — файл proto. Файл «.proto» — это образец определения служб и структур данных gRPC. В нем описываются сообщения и методы, которые может использовать сервер, обеспечивая бесперебойную связь между службами на разных языках и платформах. В моем случае я назвал его example.proto и поместил в проект GO в папку proto: `‹root`/proto/example.proto`

syntax = "proto3";

package example;
option go_package = "git<lab/hub>.com/<your own path>/proto/example";

service Example {
  rpc GetSecretPhrase(GetSecretPhraseRequest) returns (GetSecretPhraseResponse);
}

message GetSecretPhraseRequest {
  string email = 1;
}

message GetSecretPhraseResponse {
  string secret_phrase = 1;
}

Теперь нам нужно сгенерировать модули go на основе нашего файла .proto. Поэтому убедитесь, что на вашем компьютере установлена ​​системная библиотека протокол. Оформить заказ Как это можно установить.

После запуска выполните команду:

protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    proto/example.proto

созданы новые файлы пакета go: <root>/proto/example.pb.go и <root>/proto/example_grpc.pb.go .

Создайте простой текстовый генератор в <root>/utils/text-generator.go:

package utils

import (
 "fmt"
 "math/rand"
 "time"
)

const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func GenerateSecretPhrase(length int) string {
 rand.Seed(time.Now().UnixNano())

 word := make([]byte, length)
 for i := range word {
  word[i] = charset[rand.Intn(len(charset))]
 }
 
 return string(word)
}

Создайте пакет «реализация секретной фразы»: <root>/api/usecase.go

package api

import (
 "context"

 _grpcService "git<lab/hub>.com/<root path>/proto"
 "gitlab.com/naHDop/nft-id-hub/utils"
)

func (a Application) GetSecretPhrase(ctx context.Context, dto *_grpcService.GetSecretPhraseRequest) (*_grpcService.GetSecretPhraseResponse, error) {
 phrase, err := utils.GenerateSecretPhrase(8)
 if err != nil {
  return nil, err
 }
 return &_grpcService.GetSecretPhraseResponse{
  SecretPhrase: phrase,
 }, nil
}

Создать пакет приложения: <root>/cmd/api/application.go

package api

import (
 "database/sql"

 "git<lab/hub>.com/<root path>/config"
 _grpcService "git<lab/hub>.com/<root path>/proto"
)

// Application is a core engine model
// gRPC server interface implemented
type Application struct {
 // gRPC server interface, checkout "/proto/" package (generated files)
 _grpcService.UnimplementedExampleServer
 // ENV (viper) configuration instance
 config config.Config
}

// NewApplication - Constructor function
func NewApplication(config config.Config) *Application {
 return &Application{
  connect: connect,
  config:  config,
 }
}

И, наконец, сгенерируйте основной файл, в котором будет вызываться весь код, и запустите сервер gRPC <root>/cmd/main.go.

package main

import (
 "fmt"
 "log"
 "net"

 "git<lab/hub>.com/<root path>/cmd/api"
 "git<lab/hub>.com/<root path>/config"
 _grpcService "git<lab/hub>.com/<root path>/proto"
 "google.golang.org/grpc"
)

func main() {
// Viper implementation
 conf, err := config.LoadConfig(".")
 if err != nil {
  fmt.Println("Could not read from config:", err)
  return
 }

 app := api.NewApplication(conf)

 listener, err := net.Listen("tcp", conf.Address())
 if err != nil {
  log.Fatalf("Failed to listen: %v", err)
 }

 var opts []grpc.ServerOption
 server := grpc.NewServer(opts...)
 _grpcService.RegisterExampleServer(server, app)

 log.Println(fmt.Sprintf("gRPC server [%s] listening on %s...", conf.AppVersion, conf.AppPort))
 if err := server.Serve(listener); err != nil {
  log.Fatalf("Failed to serve: %v", err)
 }
}

Ты сделал это, бесстрашный исследователь gRPC и Go! 🚀 Вы успешно настроили базовый сервер gRPC и сделали первые шаги в мир эффективного общения.

Помните, что код, который вы здесь видели, — это всего лишь ступенька. В реальных сценариях мы углубимся в чистую архитектуру, шаблоны проектирования и лучшие практики. Так что сохраняйте это любопытство!

Следите за Частью 2, где мы поднимем ситуацию на ступеньку выше. Мы рассмотрим магию Envoy Proxy и то, как он поднимает связь gRPC на совершенно новый уровень. Будьте готовы получить больше информации, фрагментов кода и захватывающих открытий.

А пока не стесняйтесь просмотреть первую часть, поэкспериментировать с концепциями и связаться с нами, если у вас возникнут вопросы. До новых встреч в Части 2, удачного кодирования! 🖥️📦🌐

Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.