Эта статья в основном посвящена практике серверной части микросервисов.
Перед началом разработки нужно настроить среду разработки Go, можете посмотреть что я написалМикросервисы на основе Golang — начало работы
Создайте нашу фактическую технологию каталога проекта в каталоге src в каталоге GOPATH и переключитесь на этот каталог.
go get github.com/micro/go-micro //用于开发的微服务的RPC框架,是micro架构的基础
go get github.com/micro/protoc-gen-micro // 用于生成Protobuf的代码
go get github.com/micro/micro // 工具集安装,会自动将 micro加入环境变量
Go Micro
Go Micro предоставляет основные библиотеки для разработки распределенных систем, включая RPC и механизмы связи, управляемые событиями. Философия дизайна микро — это концепция подключаемой архитектуры, которая предоставляет компоненты, которые могут быстро создавать системы, а также могут удалять реализацию по умолчанию и настраивать ее в соответствии со своими потребностями.
Go Micro основные функции
Go Micro абстрагируется от деталей распределенных систем
- обнаружение службы(Service Discovery) — автоматическая регистрация службы и разрешение имен. Обнаружение сервисов лежит в основе разработки микросервисов. Когда служба A хочет сотрудничать со службой B, она должна знать, где находится B. Системой обнаружения сервисов по умолчанию является Consul, а в качестве локального решения используется механизм multicast DNS (mdns, multicast), либо протокол SWIM (gossip) в P2P-сети с нулевой зависимостью.
- балансировки нагрузки(Балансировка нагрузки) — механизм балансировки нагрузки, основанный на обнаружении служб. Когда мы получаем любое количество узлов-экземпляров службы, нам нужен механизм, чтобы решить, к какому узлу направить маршрут. Мы используем механизм балансировки рандомизированной хеш-нагрузки, чтобы обеспечить равномерное распределение запросов на обслуживание и повторить попытку в случае возникновения проблем.
- кодировка сообщения(Кодирование сообщений) — поддерживает динамическое кодирование сообщений на основе типа содержимого. Клиент и сервер будут использовать формат типа контента вместе для беспрепятственного кодирования/декодирования Go. Различные сообщения кодируются и отправляются разным клиентам, и клиент-сервер-сервер обрабатывает эти сообщения по умолчанию. content-type по умолчанию включает proto-rpc и json-rpc.
- Request/Response- Связь RPC основана на методе запрос/ответ, который поддерживает двунаправленный поток, и мы предоставляем абстрактный механизм синхронной связи. Когда запрос отправляется сервису, он автоматически анализируется, балансируется, набирается и преобразуется в поток байтов.Протокол передачи по умолчанию — http/1.1, а протокол http2 используется в TLS.
- Асинхронное сообщение(Асинхронный обмен сообщениями) — первоклассная функциональность публикации-подписки (PubSub), встроенная в асинхронную связь и архитектуру, управляемую событиями. Уведомления о событиях лежат в основе разработки микросервисов. Обмен сообщениями по умолчанию использует двухточечный протокол http/1.1, а когда tls включен, он использует http2.
- подключаемый интерфейс(Подключаемые интерфейсы) — Go Micro абстрагирует интерфейсы для каждой распределенной системы. Таким образом, все интерфейсы Go Micro являются подключаемыми, что позволяет поддерживать их без зависимости от времени выполнения. Таким образом, пока интерфейс реализован, любая технология может использоваться внутри.
Перейти микро комплект
- транспорт используется для синхронизации сообщений
- брокер для асинхронных сообщений
- кодек для кодирования сообщений
- реестр для обнаружения служб
- селектор для балансировки нагрузки
- клиент используется для отправки запросов
- сервер используется для обработки запросов
регистр(Реестр) Регистрация предоставляет механизм обнаружения служб для преобразования имен служб в адреса. Его можно поддерживать с помощью Consul, etcd, zookeeper, dns, gossip и других. Служба регистрируется методом запуска-регистрации-отключения-деинсталляции. Службы могут дополнительно предоставлять просроченные TTL и запланированные повторные регистрации, чтобы поддерживать службу в сети и выполнять очистку, когда служба не находится в сети.
Селектор(селектор) Селекторы — это абстракции балансировки нагрузки, построенные на реестрах. Он позволяет отфильтровывать услуги с помощью функций фильтрации, которые не предоставляют услуги, а также может быть выбран для предоставления услуг путем выбора соответствующего алгоритма, который может быть случайным, циклическим (балансировка на стороне клиента), с наименьшим ), и так далее. Селектор вступает в игру, когда грамматика создается клиентом. Клиенты будут использовать селекторы вместо реестров, поскольку они обеспечивают встроенную балансировку нагрузки.
коробка передач(Транспорт) Транспорт — это коммуникационный интерфейс для синхронного запроса/ответа между сервисами. Подобно пакету Golang net, но обеспечивающему более высокий уровень абстракции, разрешите нам переключать механизмы связи, такие как http, rabbitmq, веб-сокеты, NAT. Транспорт также поддерживает двунаправленную потоковую передачу — мощную функцию, позволяющую клиенту передавать данные на сервер.
играет роль(Маклер) Брокер предоставляет интерфейс публикации/подписки на сообщения для асинхронной связи. Для микросервисных систем и архитектур, управляемых событиями, публикация/подписка является основой. Первоначально по умолчанию мы используем одноранговую HTTP-систему в стиле входящих сообщений, чтобы свести к минимуму количество зависимостей. Однако в go-plugins есть реализации брокера сообщений, такие как RabbitMQ, NATS, NSQ, Google Cloud Pub Sub и так далее.
кодирование(кодек) Пакет кодирования используется для кодирования и декодирования, когда сообщение передается на оба конца, что может быть json, protobuf, bson, msgpack и т. д. В отличие от других методов кодирования, мы поддерживаем формат RPC. Итак, у нас есть такие форматы, как JSON-RPC, PROTO-RPC, BSON-RPC и т. д.
Пакеты кодирования изолируют кодирование на стороне клиента от кодирования на стороне сервера и предоставляют эффективные способы интеграции с другими системами, такими как gRPC, Vanadium и другими.
Server(Сервер) Пакет Server — это сборочный пакет для написания сервисов, вы можете называть сервисы, регистрировать обработчики запросов, добавлять промежуточное ПО и многое другое. Службы строятся на основе упомянутых выше пакетов и предоставляют независимые интерфейсы для запросов на обслуживание. В настоящее время служба построена как система RPC, и в будущем могут появиться другие реализации. Сервер позволяет определить несколько разных кодировок для обслуживания разных закодированных сообщений.
Client(клиент) Клиент предоставляет интерфейс для создания запросов к серверу. Подобно серверу, он построен поверх других пакетов.Он предоставляет независимый интерфейс, обнаруживает службы на основе имен через реестр, выполняет балансировку нагрузки на основе селекторов и использует транспорт и брокер для обработки синхронных и асинхронных сообщений.
Все вышеперечисленные компоненты могут быть в микро, что можно рассматривать как услугу с более высокой точки зрения.
Пример официального приветствия
Если вы будете следовать трем командным строкам в начале статьи и использовать агент GOPROXY для загрузки пакета зависимостей, возникнет проблема, а полученные примеры не самые свежие. Будет много ошибок, мое собственное решение - переключить каталог напрямую на
cd $GOPATH/pkg/mod/github/micro
git clone github.com/micro/examples examples
cd examples/greeter
Используйте git clone для прямой загрузки последней версии пакета с официальным веб-сайтом.пример приветствияСледуйте документации для этого примера, чтобы запустить Наконец нашел ошибку при отладке API
{"id":"go.micro.client","code":500,"detail":"error selecting go.micro.srv.greeter node: not found","status":"Internal Server Error"}
Сначала я не мог найти причину, поэтому пошел на гитхаб задавать вопросы на ломаном английском, что было обидно. Ха-ха, но научиться чему-то — это нормально, так я себя успокаиваю. Когда я запускал пример, выполнялись только три скрипта:
go run api/api.go
micro api --handler=api
curl http://localhost:8080/greeter/say/hello?name=John
Первые две командные строки нормальные, а третья сообщает об ошибке. Когда я пошел, чтобы поднять вопрос, мне быстро ответил иностранец, но я все еще был в замешательстве. Наконец, попробуйте сначала выполнить
go run srv/main.go
Это нормально.В данный момент логика в коде не совсем понятна.Давайте вернемся и изучим ее позже.В последней версии реестра не указан консул, запускаемmicro web
, вы можете запустить коллекцию микроинструментов, посетитеlocalhost:8082
Вы можете увидеть зарегистрированное имя микросервиса.
go run main.go --registry=consul
Вы можете найти соответствующую зарегистрированную службу в панели управления пользовательского интерфейса, которая поставляется с консулом (go.micro.srv.greeter).
Отступление: личный опыт, если вы сталкиваетесь с проблемами в ежедневном процессе разработки, которые вы не можете преодолеть, вы можете проверить дополнительную информацию и попросить совета у других.Если вы не можете временно решить проблему, временно отложите ее и оглянитесь на нее время от времени. Много раз будут новые идеи и решения. Решение, не прилипайте к проблеме. Также, если логическая реализация кода слишком сложна, пожалуйста, остановитесь и подумайте, нет ли проблемы с вашими собственными идеями реализации, большинство из которых проблемы с методом реализации, и не будет очень сложного кода. Слезы крови и слезы, когда я столкнулся с проблемой раньше, я был свиреп, и не было никого вокруг, чтобы спросить совета. На самом деле это неправильно, это пустая трата времени.
Напишите свой сервис
Если официальный пример работает нормально, давайте попробуем написать свой собственный сервис. Согласно ранее упомянутому
как пользоваться микро?
- Пишите сервисы с помощью go-micro.
- Используйте набор микроинструментов для доступа к этим службам
Приходите и попробуйте выполнить эти два шага, с какими монстрами и чудовищами вы столкнетесь?
прототип службы
Ключевым требованием к микросервисам является строгое определение интерфейсов. Micro использует protobuf для выполнения этого требования.
Создайте новую папку в папке GOPATHpopular/proto
touch popular.proto
После создания файла прототипа отредактируйте содержимое файла
syntax = "proto3";
service Popular {
rpc Ping(PingRequest) returns (PingResponse) {}
}
message PingRequest {
string name = 1;
}
message PingResponse {
string popularing = 2;
}
Первая строка файла указывает, что вы используете синтаксис proto3. Мы определяем обработчик Popular, который имеет метод Ping. Он имеет объект входного параметра PingRequest и объект выходного параметра PingResponse, оба из которых имеют параметр строкового типа.
Создание прототипов
После определения прототипа мы должны скомпилировать его с помощью подключаемых модулей protoc и micro.Плагин micro может помочь сгенерировать файлы прототипа, необходимые для go micro. переключить на$GOPATH/src
каталог, выполните команду:
protoc --proto_path=$GOPATH/src/popular/proto:. --micro_out=. --go_out=. popular/proto/popular.proto
Вы можете получить ошибку при выполнении этой команды
-bash: protoc: command not found
То есть для создания файлов кода protobuf необходимы следующие инструменты, которые отвечают за создание определенной реализации кода go.
- protoc
- protoc-gen-go
- protoc-gen-micro
brew install protobuf // 如果失败就下载源码包自己编译,加入到环境变量,我是这么整的
go get github.com/golang/protobuf/{proto,protoc-gen-go}
go get github.com/micro/protoc-gen-micro
При компиляции и установке исходного кода protobuf будут некоторые ошибки, просто игнорируйте их.Справочник по установке
После того, как все будет нормально, он будет сгенерирован в папке proto.
popular.micro.go popular.pb.go
служба записи
Необходимо выполнить несколько требований:
- Реализует интерфейс, определенный в Popular Handler.
- Инициализировать микросервис
- Регистрация Популярный обработчик
- запустить службу
переключить наpopular
папка, создайте файлmain.go
cd popular && touch main.go
Отредактируйте файл main.go
package main
import (
"context"
"fmt"
micro "github.com/micro/go-micro"
proto "popular/proto"
)
type Popular struct{}
func (g *Popular) Ping(ctx context.Context, req *proto.PingRequest, rsp *proto.PingResponse) error {
rsp.Popularing = "Ping " + req.Name // (Popularing, Name 首字母都要大写 )
return nil
}
func main() {
// 创建新的服务,这里可以传入其它选项。
service := micro.NewService(
micro.Name("popular"),
)
// 初始化方法会解析命令行标识
service.Init()
// 注册处理器
proto.RegisterPopularHandler(service.Server(), new(Popular))
// 运行服务
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
[Карта не может двигаться сюда, причина не указана. . . ]
Проработав целый день, я наконец собрал микросервис, у меня есть время организовать статью, я должен отдохнуть и почувствовать головокружение. .
Опубликовать картинку: Служба обнаружения и регистрации используется дляConsul
На этом статья о сервере пока заканчивается
Если вы хотите пойти дальше, вы можете прочитать мою следующую статью:Микросервисы на основе Golang — микропрактика (2)