三、beekit 入门指南
快速开始
这是一个最简单的 后台服务 例子:
main.go
package main
import (
// _ "github.com/go-sql-driver/mysql" //mysql数据驱动
// _ "drivers/dm" //达梦数据库驱动
_ "drivers/kingbase.com/gokb" //人大金仓数据库驱动
"beekit/adapter"
"beekit/cmd"
"beekit/common"
"beekit/middleware/auth"
"beekit/service"
"beekit/transport/rpc"
"github.com/valyala/fasthttp"
)
// 初始化调试日志
func init() {}
// 初始化接口参数校验器
func init() {}
// 初始化配置文件
func init() {}
// 初始化orm引擎
func init() {}
func main() {
//初始化权限粒度控制器
common.EnforcerInstance = auth.Setup(common.Engine)
server := rpc.NewService()
//注册服务方法
server.AddInstanceMethods(&SysLoginLogService{}, "SysLoginLogService")
s := &fasthttp.Server{}
err := server.Bind(s)
for _, v := range server.Names() {
fmt.Println(v)
}
s.ListenAndServe(":8000")
fmt.Println(err)
}
根据自己使用的数据库来匿名引入驱动,例如引入 "github.com/go-sql-driver/mysql"
服务层 SysLoginLogService.go
package service
import (
"beekit/common"
"beekit/models"
"beekit/transport/rpc/core"
"context"
)
type SysLoginLogService struct {
}
func (e *SysLoginLogService) ExistID(ctx context.Context, id string) (bool, error) {
has, err := common.Engine.ID(id).Exist(&models.SysLoginLog{})
return has, err
}
func (e *SysLoginLogService) FindID(ctx context.Context, id string) (entity.SysDept, error) {
var data entity.SysDept
_, err := common.Engine.ID(id).Get(&data)
return data, err
}
我们在服务层中定义了两个方法,分别是ExistID、FindID,这两个方法在main中便已经注册到服务的执行器里面了。
我们执行 go run main.go,运行服务,等服务启动后将会打印上面两个方法。
下面我们用postman来直接调用服务方法来试一下。
可以看到结果返回不存在id为1的记录。
调用数据格式说明
1.概述
beekit采用JSON-RPC 2.0 规范,JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。本规范主要定义了一些数据结构及其相关的处理规则。
2.约定
接口服务名由两部分组成,格式为:命名空间_方法名称,使用下划线拼接,定义的接口服务名必须唯一。
例如 SysLoginLogService_ExistID。
“SysLoginLogService”为服务层的命名空间,该名称可以随便自定义,最好唯一,不要重复。
“ExistID”为函数方法名称。
3.请求对象
{"jsonrpc":"2.0","method":"SysLoginLogService_ExistID","params":["1"]}
发送一个请求对象至服务端代表一个rpc调用, 一个请求对象包含下列成员:
- jsonrpc
指定JSON-RPC协议版本的字符串,必须准确写为“2.0” - method
包含所要调用方法名称的字符串,给rpc内部的方法名及扩展名,不能在其他地方使用。 - params
调用方法所需要的结构化参数值,且必须是集合类型params:[],该成员参数可以被省略。 - id
已建立客户端的唯一标识id,值必须int数值,该成员参数可以被省略。服务端必须回答相同的值如果包含在响应对象。这个成员用来两个对象之间的关联上下文,省略时默认为零。
4.响应对象
{"jsonrpc":"2.0","id":0,"result":false,"code":0}
当发起一个rpc调用时,除通知之外,服务端都必须回复响应。响应表示为一个JSON对象,使用以下成员:
- jsonrpc
指定JSON-RPC协议版本的字符串,必须准确写为“2.0” - code
使用整数表示调用结果状态。0表示成功状态,其他则表示失败。 - result
该成员在成功时必须包含。
当调用方法引起错误时必须不包含该成员。
服务端中的被调用方法决定了该成员的值。 - error
该成员在失败是必须包含。
当没有引起错误的时必须不包含该成员。 - id
该成员必须包含。
该成员值必须于请求对象中的id成员值一致。
响应对象必须包含result或error成员,但两个成员不会同时呈现。
5.错误对象
当一个rpc调用遇到错误时,返回的响应对象必须包含错误成员参数,并且为带有下列成员参数的对象:
- code
使用数值表示该异常的错误类型。必须为整数。 - message
对该错误的简单描述字符串。该描述应尽量限定在简短的一句话。 - data
包含关于错误附加信息的基本类型或结构化类型。该成员可忽略。该成员值由服务端定义(例如详细的错误信息,嵌套的错误等)。
-32768至-32000为保留的预定义错误代码。
- -32700 Parse error语法解析错误,服务端接收到无效的json。该错误发送于服务器尝试解析json文本。
- -32600 Invalid Request无效请求,发送的json不是一个有效的请求对象。
- -32601 Method not found找不到方法,该方法不存在或无效
- -32602 Invalid params无效的参数,无效的方法参数。
- -32603 Internal error内部错误,JSON-RPC内部错误。
- -32000 to -32099
Server error服务端错误,预留用于自定义的服务器错误。
除此之外剩余的错误类型代码可供应用程序作为自定义错误。