rk-grpc
Inject middlewares & server configuration of gRPC и grpc-gateway из YAML файла.
Это часть семейства rk-boot. Мы предлагаем использовать эту библиотеку с rk-boot.
В приведённом ниже примере мы запустим микросервис со следующей функциональностью и включёнными промежуточными программами через YAML.
Пожалуйста, обратитесь к примеру в example/boot/simple.
go get github.com/rookie-ninja/rk-grpc/v2
syntax = "proto3";
package api.v1;
option go_package = "api/v1/greeter";
service Greeter {
rpc Greeter (GreeterRequest) returns (GreeterResponse) {}
}
message GreeterRequest {
bytes msg = 1;
}
message GreeterResponse {}
type: google.api.Service
config_version: 3
# Please refer google.api.Http in https://github.com/googleapis/googleapis/blob/master/google/api/http.proto file for details.
http:
rules:
- selector: api.v1.Greeter.Greeter
get: /v1/greeter
version: v1beta1
name: github.com/rk-dev/rk-boot
build:
roots:
- api
version: v1beta1
plugins:
# protoc-gen-go needs to be installed, generate go files based on proto files
- name: go
out: api/gen
opt:
- paths=source_relative
# protoc-gen-go-grpc needs to be installed, generate grpc go files based on proto files
- name: go-grpc
out: api/gen
opt:
- paths=source_relative
- require_unimplemented_servers=false
# protoc-gen-grpc-gateway needs to be installed, generate grpc-gateway go files based on proto files
- name: grpc-gateway
out: api/gen
opt:
- paths=source_relative **grpc_api_configuration=api/v1/gw_mapping.yaml**
Необходимо установить protoc-gen-openapiv2, сгенерировать конфигурационные файлы swagger на основе файлов proto.
- name: openapiv2
out: api/gen
opt:
- grpc_api_configuration=api/v1/gw_mapping.yaml
2. Generate .pb.go files with buf
$ buf generate --path api/v1
.
├── api
│ ├── gen
│ │ └── v1
│ │ ├── greeter.pb.go
│ │ ├── greeter.pb.gw.go
│ │ ├── greeter.swagger.json
│ │ └── greeter_grpc.pb.go
│ └── v1
│ ├── greeter.proto
│ └── gw_mapping.yaml
├── boot.yaml
├── buf.gen.yaml
├── buf.yaml
├── go.mod
├── go.sum
└── main.go
**3. Create boot.yaml**
```yaml
---
grpc:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
enableReflection: true # Optional, default: false
enableRkGwOption: true # Optional, default: false
commonService:
enabled: true # Optional, default: false
docs:
enabled: true # Optional, default: false
sw:
enabled: true # Optional, default: false
prom:
enabled: true # Optional, default: false
middleware:
logging:
enabled: true # Optional, default: false
prom:
enabled: true # Optional, default: false
meta:
enabled: true # Optional, default: false
**4. Create main.go**
```go
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"embed"
_ "embed"
"github.com/rookie-ninja/rk-entry/v2/entry"
"github.com/rookie-ninja/rk-grpc/v2/boot"
proto "github.com/rookie-ninja/rk-grpc/v2/example/boot/simple/api/gen/v1"
"google.golang.org/grpc"
)
//go:embed boot.yaml
var boot []byte
//go:embed api/gen/v1
var docsFS embed.FS
//go:embed api/gen/v1
var staticFS embed.FS
func init() {
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.DocsEntryType, "greeter", &docsFS)
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.SWEntryType, "greeter", &docsFS)
rkentry.GlobalAppCtx.AddEmbedFS(rkentry.StaticFileHandlerEntryType, "greeter", &staticFS)
}
func main() {
// Bootstrap basic entries from boot config.
rkentry.BootstrapPreloadEntryYAML(boot)
// Bootstrap grpc entry from boot config
res := rkgrpc.RegisterGrpcEntryYAML(boot)
// Get GrpcEntry
grpcEntry := res["greeter"].(*rkgrpc.GrpcEntry)
// Register gRPC server
grpcEntry.AddRegFuncGrpc(func(server *grpc.Server) {
proto.RegisterGreeterServer(server, &GreeterServer{})
})
// Register grpc-gateway func
grpcEntry.AddRegFuncGw(proto.RegisterGreeterHandlerFromEndpoint)
// Bootstrap grpc entry
grpcEntry.Bootstrap(context.Background())
// Wait for shutdown signal
rkentry.GlobalAppCtx.WaitForShutdownSig()
// Interrupt gin entry
grpcEntry.Interrupt(context.Background())
}
// GreeterServer Implementation of GreeterServer.
type GreeterServer struct{}
// Greeter Handle Greeter method.
func (server *GreeterServer) Greeter(context.Context, *proto.GreeterRequest) (*proto.GreeterResponse, error) {
return &proto.GreeterResponse{}, nil
}
**5. Start server**
$ go run main.go
6. Validation
Попробуйте протестировать gRPC & grpc-gateway Service с curl & grpcurl.
# Curl to common service
$ curl localhost:8080/rk/v1/ready
{"ready":true}
Пожалуйста, обратитесь к разделу sw в Full YAML.
По умолчанию мы можем получить доступ к пользовательскому интерфейсу swagger по адресу: | Встроенный экземпляр RapiDoc, который можно использовать для замены swagger и RK TV. | | ОбщийСервис | Список общих API. | | StaticFileHandler | Веб-интерфейс показывает файлы, которые можно загрузить с сервера, в настоящее время поддерживает источник локального и встроенного.FS. | | PProf | Веб-интерфейс PProf. |
Все промежуточные программы можно настроить через YAML или код.
Пользователь может включить любой из них по мере необходимости! Обязательной привязки нет!
Промежуточное ПО | Описание |
---|---|
Метрики | Сбор метрик RPC и экспорт клиенту prometheus. |
Журнал | Регистрировать каждый запрос RPC как событие с помощью rk-query. |
Трассировка | Сбор трассировки RPC и её экспорт в стандартный вывод, файл или jaeger с помощью open-telemetry/opentelemetry-go. |
Паника | Восстановление после паники при запросах RPC и их регистрация. |
Мета | Отправка микросервисных метаданных в виде заголовка клиенту. |
Аутентификация | Поддержка типов авторизации [Basic Auth] и [API Key]. |
Лимит скорости | Ограничение скорости RPC глобально или для каждого пути. |
Тайм-аут | Истечение времени ожидания запроса по конфигурации. |
CORS | Проверка CORS на стороне сервера. |
JWT | Проверка JWT на стороне сервера. |
Безопасность | Проверка безопасности на стороне сервера. |
CSRF | Проверка csrf на стороне сервера. |
Пользователь может одновременно запускать несколько экземпляров gRPC и grpc-gateway. Пожалуйста, убедитесь, что используете разные порты и имена.
---
#app:
# name: my-app # Optional, default: "rk-app"
# version: "v1.0.0" # Optional, default: "v0.0.0"
# description: "this is description" # Optional, default: ""
# keywords: ["rk", "golang"] # Optional, default: []
# homeUrl: "http://example.com" # Optional, default: ""
# docsUrl: ["http://example.com"] # Optional, default: []
# maintainers: ["rk-dev"] # Optional
*Примечание: в тексте запроса не удалось найти код на каком-либо языке программирования, гиперссылки, специальные теги форматирования в markdown, html, yaml, json, plantuml и другие.* По умолчанию: []
#logger:
# - имя: my-logger # Обязательный
# описание: "Описание записи" # Необязательный
# домен: "*" # Необязательный, по умолчанию: "*"
# по умолчанию: false # Необязательный, по умолчанию: false, использовать как запись регистратора по умолчанию
# zap: # Необязательный
# уровень: информация # Необязательный, по умолчанию: информация
# разработка: истина # Необязательный, по умолчанию: истина
# disableCaller: ложь # Необязательный, по умолчанию: ложь
# disableStacktrace: истина # Необязательный, по умолчанию: истина
# кодирование: консоль # Необязательный, по умолчанию: консоль
# outputPaths: ["стандартный вывод"] # Необязательный, по умолчанию: [стандартный вывод]
# errorOutputPaths: ["stderr"] # Необязательный, по умолчанию: [stderr]
# encoderConfig: # Необязательный
# timeKey: "ts" # Необязательный, по умолчанию: ts
# levelKey: "уровень" # Необязательный, по умолчанию: уровень
# nameKey: "регистратор" # Необязательный, по умолчанию: регистратор
# callerKey: "вызывающий" # Необязательный, по умолчанию: вызывающий
# messageKey: "сообщение" # Необязательный, по умолчанию: сообщение
# stacktraceKey: "трассировка стека" # Необязательный, по умолчанию: трассировка стека
# skipLineEnding: ложь # Необязательный, по умолчанию: ложь
# lineEnding: "\n" # Необязательный, по умолчанию: \n
# consoleSeparator: "\t" # Необязательный, по умолчанию: \t
# sampling: # Необязательный, по умолчанию: nil
# initial: 0 # Необязательный, по умолчанию: 0
# thereafter: 0 # Необязательный, по умолчанию: 0
# initialFields: # Необязательный, по умолчанию: пустая карта
# ключ: значение
# lumberjack: # Необязательный, по умолчанию: nil
# имя файла:
# maxsize: 1024 # Необязательный, рекомендуется: 1024 (МБ)
# maxage: 7 # Необязательный, рекомендуется: 7 (дней)
# maxbackups: 3 # Необязательный, рекомендуется: 3 (дня)
# localtime: истина # Необязательный, рекомендуется: истина
# compress: истина # Необязательный, рекомендуется: истина
# loki:
# включено: истина # Необязательный, по умолчанию: ложь
# адрес: localhost:3100 # Необязательный, по умолчанию: localhost:3100
# путь: /loki/api/v1/push # Необязательный, по умолчанию: /loki/api/v1/push
# имя пользователя: "" # Необязательный, по умолчанию: ""
# пароль: "" # Необязательный, по умолчанию: ""
# maxBatchWaitMs: 3000 # Необязательный, по умолчанию: 3000
# maxBatchSize: 1000 # Необязательный, по умолчанию: 1000
# insecureSkipVerify: ложь # Необязательный, по умолчанию: ложь
# метки: # Необязательный, по умолчанию: пустая карта
# my_label_key: my_label_value
#event:
# - name: my-event # Обязательный
# description: "Описание записи" # Необязательный
# домен: "*" # Необязательный, по умолчанию: "*"
# кодирование: консоль # Необязательный, по умолчанию: консоль
# по умолчанию: ложь # Необязательный, по умолчанию: ложь, использовать как событие по умолчанию # Необязательные параметры, значения по умолчанию: [stdout]
# lumberjack: # Необязательный параметр, значение по умолчанию: nil
# filename:
# maxsize: 1024 # Необязательный параметр, рекомендуемое значение: 1024 (МБ)
# maxage: 7 # Необязательный параметр, рекомендуемое значение: 7 (дней)
# maxbackups: 3 # Необязательный параметр, рекомендуемое значение: 3 (дня)
# localtime: true # Необязательный параметр, рекомендуемое значение: true
# compress: true # Необязательный параметр, рекомендуемое значение: true
# loki:
# enabled: true # Необязательный параметр, значение по умолчанию: false
# addr: localhost:3100 # Необязательный параметр, значение по умолчанию: localhost:3100
# path: /loki/api/v1/push # Необязательный параметр, значение по умолчанию: /loki/api/v1/push
# username: "" # Необязательный параметр, значение по умолчанию: ""
# password: "" # Необязательный параметр, значение по умолчанию: ""
# maxBatchWaitMs: 3000 # Необязательный параметр, значение по умолчанию: 3000
# maxBatchSize: 1000 # Необязательный параметр, значение по умолчанию: 1000
# insecureSkipVerify: false # Необязательный параметр, значение по умолчанию: false
# labels: # Необязательный параметр, значение по умолчанию: пустая карта
# my_label_key: my_label_value
cert:
- name: my-cert # Обязательный параметр
description: "Description of entry" # Необязательный параметр, значение по умолчанию: ""
domain: "*" # Необязательный параметр, значение по умолчанию: "*"
caPath: "certs/ca.pem" # Необязательный параметр, значение по умолчанию: ""
certPemPath: "certs/server-cert.pem" # Необязательный параметр, значение по умолчанию: ""
keyPemPath: "certs/server-key.pem" # Необязательный параметр, значение по умолчанию: ""
config:
- name: my-config # Обязательный параметр
description: "Description of entry" # Необязательный параметр, значение по умолчанию: ""
domain: "*" # Необязательный параметр, значение по умолчанию: "*"
## path: "config/config.yaml" # Необязательный параметр
# envPrefix: "" # Необязательный параметр, значение по умолчанию: ""
# content: # Необязательный параметр, значение по умолчанию: пустая карта
# key: value
grpc:
- name: greeter # Обязательный параметр
enabled: true # Обязательный параметр
port: 8080 # Обязательный параметр
# description: "greeter server" # Необязательный параметр, значение по умолчанию: ""
# enableReflection: true # Необязательный параметр, значение по умолчанию: false
# enableRkGwOption: true # Необязательный параметр, значение по умолчанию: false
# gwOption: # Необязательный параметр, значение по умолчанию: nil
# marshal: # Необязательный параметр, значение по умолчанию: nil
# multiline: false # Необязательный параметр, значение по умолчанию: false
# emitUnpopulated: false # Необязательный параметр, значение по умолчанию: false
# indent: "" # Необязательный параметр, значение по умолчанию: false
# allowPartial: false # Необязательный параметр, значение по умолчанию: false
# useProtoNames: false # Необязательный параметр, значение по умолчанию: false
# useEnumNumbers: false # Необязательный параметр, значение по умолчанию: false
# unmarshal: # Необязательный параметр, значение по умолчанию: nil
# allowPartial: false # Необязательный параметр, значение по умолчанию: false
# discardUnknown: false # Необязательный параметр, значение по умолчанию: false
# noRecvMsgSizeLimit: true # Необязательный параметр, значение по умолчанию: false
# certEntry: my-cert # Необязательный параметр, значение по умолчанию: "", ссылка на запись сертификата, объявленную выше
# loggerEntry: my-logger # Необязательно, по умолчанию: "", ссылка на запись сертификата, объявленную выше, если она отсутствует, будет использоваться STDOUT
# eventEntry: my-event # Необязательно, по умолчанию: "", ссылка на запись сертификата, объявленную выше, если она отсутствует, будет использоваться STDOUT
# sw:
# включено: true # Необязательно, по умолчанию: false
# путь: "sw" # Необязательно, по умолчанию: "sw"
# jsonPath: "" # Необязательно
# заголовки: ["sw:rk"] # Необязательно, по умолчанию: []
# docs:
# включено: true # Необязательно, по умолчанию: false
# путь: "docs" # Необязательно, по умолчанию: "docs"
# specPath: "" # Необязательно
# заголовки: ["sw:rk"] # Необязательно, по умолчанию: []
# стиль: # Необязательно
# тема: "light" # Необязательно, по умолчанию: "light"
# отладка: false # Необязательно, по умолчанию: false
# commonService:
# включено: true # Необязательно, по умолчанию: false
# static:
# включено: true # Необязательно, по умолчанию: false
# путь: "/static" # Необязательно, по умолчанию: /static
# sourceType: local # Обязательно, варианты: pkger, local
# sourcePath: "." # Обязательно, полный путь исходного каталога
# pprof:
# включено: true # Необязательно, по умолчанию: false
# путь: "/pprof" # Необязательно, по умолчанию: /pprof
# prom:
# включено: true # Необязательно, по умолчанию: false
# путь: "" # Необязательно, по умолчанию: "metrics"
# pusher:
# включено: false # Необязательно, по умолчанию: false
# jobName: "greeter-pusher" # Обязательно
# remoteAddress: "localhost:9091" # Обязательно
# basicAuth: "user:pass" # Необязательно, по умолчанию: ""
# intervalMs: 10000 # Необязательно, по умолчанию: 1000
# certEntry: my-cert # Необязательно, по умолчанию: "", ссылка на запись сертификата, объявленную выше
# middleware:
# игнорировать: [""] # Необязательно, по умолчанию: []
# errorModel: google # Необязательно, по умолчанию: google, [amazon, google] — поддерживаемые варианты
# ведение журнала:
# включено: true # Необязательно, по умолчанию: false
# игнорировать: [""] # Необязательно, по умолчанию: []
# loggerEncoding: "console" # Необязательно, по умолчанию: "console"
# loggerOutputPaths: ["logs/app.log"] # Необязательно, по умолчанию: ["stdout"]
# eventEncoding: "console" # Необязательно, по умолчанию: "console"
# eventOutputPaths: ["logs/event.log"] # Необязательно, по умолчанию: ["stdout"]
# prom:
# включено: true # Необязательно, по умолчанию: false
# игнорировать: [""] # Необязательно, по умолчанию: []
# auth:
# включено: true # Необязательно, по умолчанию: false
# игнорировать: [""] # Необязательный, по умолчанию: []
# базовый:
# - "пользователь: пароль" # Необязательно, по умолчанию: []
# apiKey:
# - "ключи" # Необязательно, по умолчанию: []
# meta:
# включено: true # Необязательно, по умолчанию: false
# игнорировать: [""] # Необязательно, по умолчанию: []
# префикс: "rk" # Необязательный, по умолчанию: «rk»
# trace:
# включено: true # Необязательно, по умолчанию: false
# ignore: [""] # Необязательно, по умолчанию: []
# экспортер: # Необязательно, по умолчанию будет создан экспортер stdout
# файл:
# включено: true # Необязательно, по умолчанию: false
# outputPath: "logs/trace.log" # Необязательно, по умолчанию: stdout
# jaeger:
# агент:
# включено: false # Необязательно, по умолчанию: false
# host: "" # Необязательно, по умолчанию: localhost
# порт: 0 # Необязательно, по умолчанию: 6831
# коллектор:
# включено: true # Необязательно, по умолчанию: false
# endpoint: "" # Необязательно, по умолчанию: http://localhost:14268/api/traces
# username: "" # Необязательно, по умолчанию: ""
# password: "" # Необязательно, по умолчанию: ""
# rateLimit:
# включено: false # Необязательно, по умолчанию: false
# ignore: [""] # Необязательно, по умолчанию: []
# алгоритм: "leakyBucket" # Необязательно, по умолчанию: "tokenBucket"
# reqPerSec: 100 # Необязательно, по умолчанию: 1000000
# paths:
# - путь: "/rk/v1/healthy" # Необязательно, по умолчанию: ""
# reqPerSec: 0 # Необязательно, по умолчанию: 1000000
# timeout:
# включено: false # Необязательно, по умолчанию: false
# ignore: [""] # Необязательно, по умолчанию: []
# timeoutMs: 5000 # Необязательно, по умолчанию: 5000
# paths:
# - путь: "/rk/v1/healthy" # Необязательно, по умолчанию: ""
# timeoutMs: 1000 # Необязательно, по умолчанию: 5000
# jwt:
# включено: true # Необязательно, по умолчанию: false
# ignore: [ "" ] # Необязательно, по умолчанию: []
# signerEntry: "" # Необязательно, по умолчанию: ""
# skipVerify: false # Необязательно, по умолчанию: false
# симметричный: # Необязательно
# алгоритм: "" # Обязательно, по умолчанию: ""
# токен: "" # Необязательно, по умолчанию: ""
# tokenPath: "" # Необязательно, по умолчанию: ""
# асимметричный: # Необязательно
# алгоритм: "" # Требуется, по умолчанию: ""
# privateKey: "" # Необязательно, по умолчанию: ""
# privateKeyPath: "" # Необязательно, по умолчанию: ""
# publicKey: "" # Необязательно, по умолчанию: ""
# publicKeyPath: "" # Необязательно, по умолчанию: ""
# tokenLookup: "header:<name>" # Необязательно, по умолчанию: "header:Authorization"
# authScheme: "Bearer" # Необязательно, по умолчанию: "Bearer"
# secure:
# включено: true # Необязательно, по умолчанию: false
# ignore: [""] # Необязательно, по умолчанию: []
# xssProtection: "" # Необязательно, по умолчанию: "1; mode=block"
# contentTypeNosniff: "" # Необязательно, по умолчанию: nosniff
# xFrameOptions: "" # Необязательно, по умолчанию: SAMEORIGIN
# hstsMaxAge: 0 # Необязательно, по умолчанию: 0
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )