RK GRPCgRPC-golang 的快速启动器

联合创作 · 2023-09-23 12:06

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




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 或者官方文档

浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报