概述
rk-boot/v2 是一款通过 YAML 配置文件,简化 Golang 微服务依赖,中间件逻辑的开源库。
目前,升级到了 V2 版本,在稳定性和接口层面做了很多优化。通过 gin 框架的例子,介绍 rk-boot 是如何工作的。
了解 rk-boot
| 名称 | 链接 |
|---|---|
| 代码库 | rk-boot/v2 |
| 主页 | rkdev.info |
| 文档 | docs.rkdev.info |
快速开始
1.下载
通过 rkdev.info 主页下载 gin 框架的代码例子。
2.验证
解压 rk-demo.zip 文件,并运行 main.go。
$ go run main.go
2022-05-21T00:35:17.530+0800 INFO boot/gin_entry.go:656 Bootstrap GinEntry {"eventId": "cec1525e-4f10-4fbe-838b-c89ff0eae4c8", "entryName": "rk-demo", "entryType": "GinEntry"}
2022-05-21T00:35:17.530+0800 INFO boot/gin_entry.go:413 SwaggerEntry: http://localhost:8080/sw/
2022-05-21T00:35:17.530+0800 INFO boot/gin_entry.go:416 DocsEntry: http://localhost:8080/docs/
2022-05-21T00:35:17.530+0800 INFO boot/gin_entry.go:419 PromEntry: http://localhost:8080/metrics
2022-05-21T00:35:17.530+0800 INFO boot/gin_entry.go:431 CommonSreviceEntry: http://localhost:8080/rk/v1/ready, http://localhost:8080/rk/v1/alive, http://localhost:8080/rk/v1/info
------------------------------------------------------------------------
endTime=2022-05-21T00:35:17.5309+08:00
startTime=2022-05-21T00:35:17.530409+08:00
elapsedNano=491455
timezone=CST
ids={"eventId":"cec1525e-4f10-4fbe-838b-c89ff0eae4c8"}
app={"appName":"rk","appVersion":"local","entryName":"rk-demo","entryType":"GinEntry"}
env={"arch":"amd64","domain":"*","hostname":"lark.local","localIP":"10.8.0.2","os":"darwin"}
payloads={"commonServiceEnabled":true,"docsEnabled":true,"docsPath":"/docs/","ginPort":8080,"promEnabled":true,"promPath":"/metrics","promPort":8080,"swEnabled":true,"swPath":"/sw/"}
counters={}
pairs={}
timing={}
remoteAddr=localhost
operation=Bootstrap
resCode=OK
eventStatus=Ended
EOE
在这个例子中,我们默认通过 YAML 文件启动了 swagger UI, rapiDocs UI,prometheus 客户端,Common API。
2.1 访问 swagger UI
2.2 访问 rapiDocs UI
2.3 访问 prometheus 客户端
3.boot.yaml 解释
# boot.yaml
gin:
- name: rk-demo # 启动 gin 框架微服务,命名为 rk-demo
port: 8080 # 定义 gin 端口
enabled: true # 开关
commonService:
enabled: true # 启动 Common API,/rk/v1/alive, /rk/v1/ready
sw:
enabled: true # 启动 Swagger UI
docs:
enabled: true # 启动 API Docs UI
prom:
enabled: true # 启动 Prometheus 客户端
middleware:
logging:
enabled: true # 启动 API 日志中间件,记录每一个 API 的访问日志
prom:
enabled: true # 启动 API 监控中间件,记录每一个 API metrics
4.main.go 解释
rk-boot 没有封装 gin 的原生用法,用户可以 Router 进行 API 的注册。
// 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"
"fmt"
"github.com/gin-gonic/gin"
"github.com/rookie-ninja/rk-boot/v2"
"github.com/rookie-ninja/rk-gin/v2/boot"
"net/http"
)
// @title Swagger Example API
// @version 1.0
// @description This is a sample rk-demo server.
// @termsOfService http://swagger.io/terms/
// @securityDefinitions.basic BasicAuth
// @contact.name API Support
// @contact.url http://www.swagger.io/support
// @contact.email support@swagger.io
// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
func main() {
// 创建 boot 实例,用于获取依赖
boot := rkboot.NewBoot()
// 获取 GinEntry
entry := rkgin.GetGinEntry("rk-demo")
// 获取 Router 实例,添加 API
entry.Router.GET("/v1/greeter", Greeter)
// 启动微服务
boot.Bootstrap(context.TODO())
// 等待关闭信号,实现优雅关闭, ctrl-c
boot.WaitForShutdownSig(context.TODO())
}
// *********** API 实现 ***********
// Greeter handler
// @Summary Greeter
// @Id 1
// @Tags Hello
// @version 1.0
// @Param name query string true "name"
// @produce application/json
// @Success 200 {object} GreeterResponse
// @Router /v1/greeter [get]
func Greeter(ctx *gin.Context) {
ctx.JSON(http.StatusOK, &GreeterResponse{
Message: fmt.Sprintf("Hello %s!", ctx.Query("name")),
})
}
type GreeterResponse struct {
Message string
}
RK 设计理念
在设计 rk-boot/v2 的时候,我们有几个【不做清单】。
- 不创造 RPC 框架
- 不重复造轮子
- 不封装开源 API/函数,保留原生用法
- 不引入小众开源
- 不绑定特定业务
我们想要做的是,让使用者可以通过 YAML 配置文件,以及几行简单代码,一键启动【高标准】Golang 微服务。简单点说,就是在 YAML 文件里,填写几行配置,就能让进程自动提供监控,日志,安全等等附属功能。
整个 RK 系列由3个大部分组成。
| 模块 | 介绍 |
|---|---|
| rk-boot/v2 | 使用者的统一入口,Golang 项目推荐通过 rk-boot/v2 作为入口使用 |
| rk-entry/v2 | 所有 RK 系列的通用接口和通用功能实现,核心库,用户可以通过实现 rk-entry 里的接口,自定义 rk-xxx 插件 |
| rk-xxx | RK 系列插件,由一系列包组成,用户根据需要自行引入,每一个 rk-xxx 插件都可以应设成 YAML 文件里的配置 |
如果把实现 Golang 后端微服务比喻成制作一个产品,RK 在其中的作用相当于【材料提供商】,与使用【原生开源材料】不同点在于, 使用者不必考虑和学习如何初始化【原生开源材料】,如何配置,如何进行监控,错误处理。使用者唯一要做的就是,熟悉【原生开源材料】的使用方法,嵌入到代码里使用。 我们希望通过这种方式,节省开发者的时间成本,以及保证代码库的标准性。
使用者通过配置 boot.yaml 文件,快速让代码获得【装备】,使用者可以在代码中,轻松获得【原生开源材料】,并使用,无需考虑使用方式以外的问题。
RK 插件
RK 的插件我们使用了【节外生枝】的设计理念。对于 RK 来说,流行的开源产品,属于【原料】,这些【原料】通过实现 rk-entry 抽象,就形成了 RK 系列的一个插件,形成【材料】。
rk-boot/v2 会自动识别这些插件,在启动进程的时候,进行相应初始化。
RK 插件列表
目前,rk-boot/v2 还处于萌芽阶段,实现的功能插件比较少,后续会持续迭代,也希望能在开源社区里得到更多的关注,并参与进来。
- Web 框架中间件
| 中间件 | 介绍 |
|---|---|
| Prom | API prometheus 监控中间件 |
| Logging | API 日志中间件 |
| Trace | 基于 open-telemetry/opentelemetry-go API 调用链中间件 |
| Panic | Panic 捕获中间件 |
| Meta | 自动添加 RequestId,时间等 API 元数据中间件 |
| Auth | [Basic Auth] & [API Key] 授权中间件 |
| RateLimit | API 限流中间件 |
| Timeout | API 超时中间件 |
| Gzip | API 压缩中间件 |
| CORS | API CORS 中间件 |
| JWT | API JWT 验证中间件 |
| Secure | API 通用安全中间件 |
| CSRF | API CSRF 中间件 |
- Web 框架启动项
| 启动项 | 介绍 |
|---|---|
| Config | spf13/viper 初始化 |
| Logger | uber-go/zap 日志初始化 |
| Event | rk-query event 初始化 |
| Certificate | TLS/SSL 证书初始化 |
| Prometheus | Prometheus client 初始化 |
| Swagger | 内嵌 swagger UI |
| Docs | 内嵌 RapiDoc API 在线文档 |
| CommonService | 通用 API |
| StaticFileHandler | 内嵌静态文件下载 Web UI |