RK GRPC

gRPC-golang 的快速启动器
授权协议 Apache
开发语言 Google Go
所属分类 Web应用开发、 RPC/XMLRPC项目
软件类型 开源软件
地区 国产
投 递 者 江睿
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

rk-grpc 是提供 gRPC-golang 框架中间件以及快速启动器,可以通过 YAML 文件的形式,快速启动 gRPC-golang 框架微服务。

提供的功能

功能 描述
通过 YAML 启动服务 用户可以通过定义 YAML 文件,快速启动基于 gRPC-golang 框架微服务。
通过代码启动服务 用户可以通过调用代码函数,快速启动基于 gRPC-golang 框架微服务。
启动 gRPC Gateway 用户可以通过定义 YAML 文件,快速启动 gRPC Gateway
启动 Swagger UI 用户可以通过 YAML 文件,无代码启动 Swagger UI。
启动 Common Service 用户可以通过 YAML 文件,无代码启动 RK 定义的常用 API 服务。
启动 TV UI 服务 用户可以通过 YAML 文件,无代码启动 RK 定义的 TV UI。TV UI 包含当前进程的原信息。
Prometheus 中间件 用户可以通过 YAML 文件,无代码启动 RPC Prometheus 中间件,记录每一个 RPC 请求状态。
日志中间件 用户可以通过 YAML 文件,无代码启动 RPC 日志中间件,记录每一个 RPC 请求状态。
调用链中间件     用户可以通过 YAML 文件,无代码启动 RPC 调用链中间件,记录每一个 RPC 请求状态。
Panic 中间件 用户可以通过 YAML 文件,无代码启动 RPC Panic 中间件,服务可以捕获 RPC 的 Panic 状态,防止服务崩溃。
原数据中间件 用户可以通过 YAML 文件,无代码启动 RPC 原数据 中间件,服务可以自动在返回数据中包含 RequestID,TracingID 等信息。
权限中间件 用户可以通过 YAML 文件,无代码启动 RPC 权限 中间件,拦截 RPC 中 Basic Auth 和 X-API-Key 形式的权限。
限流中间件 用户可以通过 YAML 文件,无代码启动 RPC 限流中间件,实现对整体服务,或者单个 API 的限流策略。

快速开始

启动 gRPC 服务

---
grpc:
  - name: greeter
    port: 8080
    enableReflection: true
    enableRkGwOption: true
    commonService:
      enabled: true
    tv:
      enabled: true
    sw:
      enabled: true
    prom:
      enabled: true
    interceptors:
      loggingZap:
        enabled: true
      metricsProm:
        enabled: true
func main() {
    // Bootstrap basic entries from boot config.
    rkentry.RegisterInternalEntriesFromConfig("example/boot/simple/boot.yaml")

    // Bootstrap grpc entry from boot config
    res := rkgrpc.RegisterGrpcEntriesWithConfig("example/boot/simple/boot.yaml")

    // Bootstrap grpc entry
    res["greeter"].Bootstrap(context.Background())

    // Wait for shutdown signal
    rkentry.GlobalAppCtx.WaitForShutdownSig()

    // Interrupt grpc entry
    res["greeter"].Interrupt(context.Background())
}
$ go run main.go

验证

发送请求

使用 grpcurl 发送请求,我们开启了 Common Service,所以有默认的 API 可以使用。

# List grpc services at port 1949 without TLS
# Expect RkCommonService since we enabled common services.
$ grpcurl -plaintext localhost:1949 list                           
grpc.reflection.v1alpha.ServerReflection
rk.api.v1.RkCommonService

# List grpc methods in rk.api.v1.RkCommonService
$ grpcurl -plaintext localhost:1949 list rk.api.v1.RkCommonService            
rk.api.v1.RkCommonService.Apis
rk.api.v1.RkCommonService.Certs
rk.api.v1.RkCommonService.Configs
rk.api.v1.RkCommonService.Deps
rk.api.v1.RkCommonService.Entries
rk.api.v1.RkCommonService.Gc
rk.api.v1.RkCommonService.GwErrorMapping
rk.api.v1.RkCommonService.Healthy
rk.api.v1.RkCommonService.Info
rk.api.v1.RkCommonService.License
rk.api.v1.RkCommonService.Logs
rk.api.v1.RkCommonService.Readme
rk.api.v1.RkCommonService.Req
rk.api.v1.RkCommonService.Sys
rk.api.v1.RkCommonService.Git

# Send request to rk.api.v1.RkCommonService.Healthy
$ grpcurl -plaintext localhost:1949 rk.api.v1.RkCommonService.Healthy
{
    "healthy": true
}

使用 curl 发送请求,我们开启了 Common Service 和 grpc gateway,所以有默认的 API 可以使用。

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

Swagger UI

sw

TV 服务

Prometheus Metrics

prom

日志

我们开启了日志中间件,所以每一个 RPC 都会自动被日志记录。

通用日志

2021-06-24T05:25:20.621+0800    INFO    boot/common_service_entry.go:141        Bootstrapping CommonServiceEntry.       {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GrpcCommonServiceEntry"}
2021-06-24T05:25:20.622+0800    INFO    boot/tv_entry.go:172    Bootstrapping TvEntry.  {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GrpcTvEntry"}
2021-06-24T05:25:20.624+0800    INFO    boot/sw_entry.go:202    Bootstrapping SwEntry.  {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GrpcSwEntry", "swPath": "/sw/", "headers": {}}
2021-06-24T05:25:20.624+0800    INFO    boot/prom_entry.go:202  Bootstrapping promEntry.        {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GrpcPromEntry", "path": "/metrics", "port": 8080}
2021-06-24T05:25:20.624+0800    INFO    boot/gw_entry.go:415    Bootstrapping GwEntry.  {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GwEntry", "grpcPort": 1949, "httpPort": 8080, "swEnabled": true, "tvEnabled": true, "promEnabled": true, "commonServiceEnabled": true, "clientTlsEnabled": false, "serverTlsEnabled": false}
2021-06-24T05:25:20.624+0800    INFO    boot/grpc_entry.go:671  Bootstrapping grpcEntry.        {"eventId": "5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a", "entryName": "greeter", "entryType": "GrpcEntry", "grpcPort": 1949, "commonServiceEnabled": true, "tlsEnabled": false, "gwEnabled": true, "reflectionEnabled": true, "swEnabled": true, "tvEnabled": true, "promEnabled": true, "gwClientTlsEnabled": false, "gwServerTlsEnabled": false, "swPath": "/sw/", "headers": {}, "tvPath": "/rk/v1/tv"}

RPC 日志

RPC 日志的格式默认是 console 格式,console 格式是我们自定义的 human readable 格式,用户可以切换成 JSON 格式。

------------------------------------------------------------------------
endTime=2021-06-24T05:25:20.622025+08:00
startTime=2021-06-24T05:25:20.621977+08:00
elapsedNano=48142
timezone=CST
ids={"eventId":"5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a"}
app={"appName":"rk-grpc","appVersion":"master-xxx","entryName":"greeter","entryType":"GrpcCommonServiceEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.6","os":"darwin","realm":"*","region":"*"}
payloads={"entryName":"greeter","entryType":"GrpcCommonServiceEntry"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=bootstrap
resCode=OK
eventStatus=Ended
EOE
...
------------------------------------------------------------------------
endTime=2021-06-24T05:25:20.62478+08:00
startTime=2021-06-24T05:25:20.621944+08:00
elapsedNano=2836634
timezone=CST
ids={"eventId":"5b82a7e0-f7ef-4a3a-abe7-fc1f9f83673a"}
app={"appName":"rk-grpc","appVersion":"master-xxx","entryName":"greeter","entryType":"GrpcEntry"}
env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"10.8.0.6","os":"darwin","realm":"*","region":"*"}
payloads={"commonServiceEnabled":true,"entryName":"greeter","entryType":"GrpcEntry","grpcPort":1949,"gwClientTlsEnabled":false,"gwEnabled":true,"gwServerTlsEnabled":false,"headers":{},"promEnabled":true,"reflectionEnabled":true,"swEnabled":true,"swPath":"/sw/","tlsEnabled":false,"tvEnabled":true,"tvPath":"/rk/v1/tv"}
error={}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=bootstrap
resCode=OK
eventStatus=Ended
EOE

原数据

我们开启了原数据中间件,每一个 RPC 请求返回值都会自带如下的 Header。

$ curl -vs localhost:8080/rk/v1/healthy
...
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Request-Id: cb615712-74dc-4e62-afb9-2fc6599bf452
< X-Rk-App-Name: rk-grpc
< X-Rk-App-Unix-Time: 2021-06-24T05:29:09.481073+08:00
< X-Rk-App-Version: master-xxx
< X-Rk-Received-Time: 2021-06-24T05:29:09.481073+08:00
< Date: Wed, 23 Jun 2021 21:29:09 GMT
...

如何编辑 YAML?

请参考 README 或者官方文档

  • GRPC: 如何添加 API Prometheus 监控拦截器/中间件?_点目科技的博客-CSDN博客_grpc 普罗米修斯  GRPC: 如何在 gRPC 服务中加入 Prometheus 监控?_点目科技的博客-CSDN博客_grpc 监控 RK-BOOT gRPC 框架 | rk-boot gRPC实现方式调研报告 1.包装成gRPC拦截器 主要针对目前公司内部模块grpc通信状态进行监控,

  • 简介: 本文将介绍优雅关闭 gRPC 微服务。在进程收到关闭信号时,我们需要关闭后台运行的逻辑,比如,MySQL 连接等等。 介绍 本文将介绍优雅关闭 gRPC 微服务。 什么是优雅关闭? 在进程收到关闭信号时,我们需要关闭后台运行的逻辑,比如,MySQL 连接等等。 我们将会使用 rk-boot 来启动 gRPC 服务。 请访问如下地址获取完整教程: https://rkdev.info/cn

  • 介绍 本文将介绍如何在 gRPC 微服务中添加 API 日志拦截器/中间件。 什么是日志拦截器/中间件? 日志拦截器会对每一个 API 请求记录日志。 我们将会使用 rk-boot 来启动 gRPC 服务。 请访问如下地址获取完整教程: https://rkdev.info/cn https://rkdocs.netlify.app/cn (备用) 安装 go get github.com/roo

  • 介绍 本文将介绍优雅关闭 gRPC 微服务。 什么是优雅关闭? 在进程收到关闭信号时,我们需要关闭后台运行的逻辑,比如,MySQL 连接等等。 我们将会使用 rk-boot 来启动 gRPC 服务。 请访问如下地址获取完整教程: https://rkdev.info/cnhttps://rkdocs.netlify.app/cn (备用) 安装 go get github.com/rookie-n

 相关资料
  • Swoole的绝大部分功能只能用于cli命令行环境,请首先准备好Linux Shell环境。可使用vim、emacs、phpstorm或其他编辑器编写代码,并在命令行中通过下列指令执行程序。 php /path/to/your_file.php 成功执行Swoole服务器程序后,如果你的代码中没有任何echo语句,屏幕不会有任何输出,但实际上底层已经在监听网络端口,等待客户端发起连接。可使用相应的

  • Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。 如果不想使用 Spring 配置,可以通过 API 的方式 进行调用。 服务提供者 完整安装步骤,请参见:示例提供者安装 定义服务接口 DemoService.java 1: package

  • 我尝试使用命令-movflags faststart 并得到以下错误: Microsoft Windows[Version6.0.6002]版权所有(c)2006 Microsoft Corporation。版权所有。 C:\uploads\1\videos>ffmpeg-i simple1.mp4-codec copy-map 0-movflags faststart output.mp4 -m

  • 启动项目(请先完成环境依赖安装) 克隆项目 执行 => composer install (如果安装很慢,可以使用国内镜像,但是镜像包会有延迟) 新建一个runtime目录,用于存放日志等cache文件 配置config中的database配置文件 设置config/service.php中的registry_address.目前只支持redis、mysql作为注册中心 启动http server

  • 我将应用程序添加到Firebase控制台,并将google json文件添加到应用程序文件夹。然后,当我尝试启动应用程序时,它会出现以下消息。 提前道谢。 错误: 分级 清单

  • 官方版本下载 最新的MOAC SCS软件可以从官方的发布地址下载 release link, 解压后可以看到有scs的目录,其中有userconfig.json文件,其内容如下: { "VnodeServiceCfg": "localhost:50062", "DataDir": "./scsdata", "LogPath": "./_logs", "Benefic

  • 我正在尝试官方的5分钟快速入门大约角2的打字稿。我遵循了所有步骤,当我运行时,它确实在我的火狐浏览器上弹出了预期的消息。 但是,当我检查控制台时,我发现了错误消息: 我不知道这是否与我之前在项目根文件夹上运行时收到的警告消息有关: 有人能告诉我我的方法出了什么问题吗?更详细的控制台输出如下所示:

  • 我已经注册开始使用Twilio,我正在尝试设置快速入门(https://www.twilio.com/docs/voice/client/javascript/quickstart),它几乎可以工作,但来电没有收到: 客户端代码(在getTokenCapables之后在浏览器上使用): 用于语音通话的Twilio函数代码(始终打印控制台,否则永远不会调用条件: 我已经将我的电话号码包含为已验证的来