nRPC — это фреймворк RPC, аналогичный gRPC, но для NATS.
Он может сгенерировать клиентское приложение на Go и сервер из одного файла .hproto, который вы бы использовали для генерации клиентских приложений и серверов gRPC. Сервер генерируется в виде обработчика сообщений NATS MsgHandler.
Выполнение RPC через модель запрос-ответ NATS имеет некоторые преимущества перед моделью gRPC:
Пирожное не всегда бесплатно, однако. При масштабировании сам кластер NATS может стать зоной затруднений. Возможности gRPC, такие как потоковая передача и продвинутая аутентификация, недоступны.Однако NATS и nRPC предлагают значительно меньшую операционную сложность, если ваш масштаб и требования подходят.
В RapidLoop мы используем эту модель для нашего SaaS-продукта OpsDash в производстве и довольны этим. nRPC является третьим поколением внутренней библиотеки.
nRPC включает в себя плагин компилятора протоколов protoc-gen-nrpc
, который генерирует Go-код из файла .proto.
Для файла .proto, такого как helloworld.proto, использование выглядит следующим образом:
$ ls
helloworld.proto
$ protoc --go_out=. --nrpc_out=. helloworld.proto
$ ls
helloworld.nrpc.go helloworld.pb.go helloworld.proto
Файл .pb.go, содержащий определения для классов сообщений, генерируется стандартным плагином Go для protoc. Файл .nrpc.go, содержащий определения для клиента, интерфейса сервера и обработчика NATS, генерируется плагином nRPC. Просмотрите сгенерированные и примерные файлы:
Файл .proto определяет сообщения (например, HelloRequest и HelloReply в примере) и службы (Greeter), имеющие методы (SayHello).Сообщения генерируются как структуры Go обычным плагином компилятора Go для Protobuf и записываются в файлы *.pb.go.
Для остального nRPC генерирует три логических части.
Первая — это тип интерфейса Go (GreeterServer), который ваш реальный микросервис должен реализовать:
// Это содержится в файле .proto
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// Это сгенерированный интерфейс, который вам следует реализовать
type GreeterServer interface {
SayHello(ctx context.Context, req HelloRequest) (resp HelloReply, err error)
}
Вторая часть — клиент (структура GreeterClient). Эта структура имеет методы с соответствующими типами, которые соответствуют определению службы. Код клиента будет сериализировать и оборачивать объект запроса (HelloRequest) и выполнит запрос NATS Request.
// Клиент связан с соединением NATS.
func NewGreeterClient(nc *nats.Conn) *GreeterClient {...}
// Имеет правильно типизированные методы, которые будут сериализировать и выполнять запрос NATS.
func (c *GreeterClient) SayHello(req HelloRequest) (resp HelloReply, err error) {...}
```Третья и последняя часть — обработчик (GreeterHandler). При наличии соединения NATS и реализации сервера он может принимать запросы NATS в формате, отправляемом вышеупомянутым клиентом. Он должен быть установлен как обработчик сообщений для конкретной темы NATS (по умолчанию имя службы) с помощью методов NATS Subscribe() или QueueSubscribe(). Обработчик вызовет соответствующий метод интерфейса GreeterServer при получении соответствующего запроса.```
// Обработчик связан с соединением NATS и реализацией сервера.
func NewGreeterHandler(ctx context.Context, nc *nats.Conn, s GreeterServer) *GreeterHandler {...}// У него есть метод, который может (и должен) использоваться в качестве обработчика сообщений NATS.
func (h *GreeterHandler) Handler(msg *nats.Msg) {...}
Запуск микросервиса включает в себя следующие шаги:
.proto
\*.pb.go
и \*.nrpc.go
Чтобы вызвать сервис:
\*.nrpc.go
Caller
и вызывать методы по мере необходимости (см. пример)Следующие страницы вики подробно описывают возможности nRPC:
nRPC требует Go версии 1.7 или выше. $GOPATH/bin
должно находиться в $PATH
, чтобы вызов protoc
работал корректно. Для генерации кода вам потребуется компилятор протоколов (который можно установить отсюда) и плагин protoc
для nRPC.
Для установки плагина protoc
для nRPC:
$ go get github.com/teamlint/nrpc/protoc-gen-nrpc
Для сборки и запуска примера greeter_server
:```
$ go get github.com/teamlint/nrpc/examples/helloworld/greeter_server
$ greeter_server
сервер работает, нажмите Ctrl+C для завершения работы.
Для сборки и запуска примера `greeter_client`:
$ go get github.com/teamlint/nrpc/examples/helloworld/greeter_client $ greeter_client Приветствие: Привет, мир $
## Документация
Дополнительную информацию о том, как описать службы gRPC с помощью файлов `.proto`, вы можете найти [здесь](https://grpc.io/docs/guides/concepts.html).
Дополнительную информацию о NATS начните с их [веб-сайта](https://nats.io/). Для получения более подробной информации о nRPC рекомендуется изучить исходный код.
## Статус
На данный момент поддерживаются только клиенты и серверы на Go.
## TODO - Время ожидания запроса клиента NRPC, CallOption или Context
- Изменение имени XXXHandler | XXXConcurrentHandler
- Пользователь [protogen](google.golang.org/protobuf/compiler/protogen) рефакторинг protoc-gen-nrpc
Создано RapidLoop. Выпущено под лицензией Apache 2.0.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )