RK GRPCgRPC-golang 的快速启动器
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 服务
- http://localhost:8080/rk/v1/tv
Prometheus Metrics
日志
我们开启了日志中间件,所以每一个 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?
评论