1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/rookie-ninja-rk-grpc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

rk-grpc

Inject middlewares & server configuration of gRPC и grpc-gateway из YAML файла.

Это часть семейства rk-boot. Мы предлагаем использовать эту библиотеку с rk-boot.

Архитектура

image

Быстрый старт

В приведённом ниже примере мы запустим микросервис со следующей функциональностью и включёнными промежуточными программами через YAML.

  • gRPC и grpc-gateway сервер
  • отражение сервера gRPC
  • Swagger UI
  • CommonService
  • Docs
  • Prometheus Metrics (промежуточное ПО)
  • Logging (промежуточное ПО)
  • Meta (промежуточное ПО)

Пожалуйста, обратитесь к примеру в example/boot/simple.

Установка

go get github.com/rookie-ninja/rk-grpc/v2

1. Подготовка файлов .proto

show
  • api/v1/greeter.proto
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 {}
  • api/v1/gw_mapping.yaml
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
  • buf.yaml
version: v1beta1
name: github.com/rk-dev/rk-boot
build:
  roots:
    - api
  • buf.gen.yaml
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

6.1 gRPC & grpc-gateway server

Попробуйте протестировать gRPC & grpc-gateway Service с curl & grpcurl.

# Curl to common service
$ curl localhost:8080/rk/v1/ready
{"ready":true}

6.2 Swagger UI

Пожалуйста, обратитесь к разделу 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 на стороне сервера.

Параметры YAML

Пользователь может одновременно запускать несколько экземпляров 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 )

Вы можете оставить комментарий после Вход в систему

Введение

grpc related entry. Смотрите https://rkdocs.netlify.app/docs/ для получения подробной информации. Расширить Свернуть
Apache-2.0
Отмена

Обновления (4)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/rookie-ninja-rk-grpc.git
git@gitlife.ru:oschina-mirror/rookie-ninja-rk-grpc.git
oschina-mirror
rookie-ninja-rk-grpc
rookie-ninja-rk-grpc
master