mcube
 
 
 
 

微服务工具箱, 构建微服务中使用的工具集
- http框架: 用于构建领域服务的路由框架, 基于httprouter进行封装
- 异常处理: 定义API Exception
- 日志处理: 封装zap, 用于日志处理
- 加密解密: 封装cbc和ecies
- 自定义类型: ftime方便控制时间序列化的类型, set集合
- 服务注册: 服务注册组件
- 缓存处理: 用于构建多级对象缓存
- 事件总线: 用于系统事件订阅与发布
- 链路追踪: mcubte提供的组件都内置了链路追踪
快速上手
首先你需要安装mcube, 所有的功能都集成到这个CLI工具上了
$ go install github.com/infraboard/mcube 
按照完成后, 通过help指令查看基本使用方法
$ mcube -h
mcube ...
Usage:
  mcube [flags]
  mcube [command]
Available Commands:
  enum        枚举生成器
  help        Help about any command
  init        初始化
Flags:
  -h, --help      help for mcube
  -v, --version   the mcube version
Use "mcube [command] --help" for more information about a command.
mcube提供项目初始化能力, 利用mcube提供的工具箱, 快速组装出一个接近生产级别的应用(使用请看README):
$ mkdir demo && cd demo
$ mcube init
? 请输入项目包名称: github.com/infraboard/demo
? 请输入项目描述: 项目描述,会生成到CLI和READMD.md中
项目初始化完成, 项目结构如下: 
├───.gitignore (269b)
├───Makefile (1212b)
├───README.md (894b)
├───api
│       └───api.go (3768b)
├───cmd
│       ├───root.go (888b)
│       └───service.go (4036b)
├───conf
│       ├───config.go (3222b)
│       ├───load.go (720b)
│       └───log.go (365b)
├───etc
│       ├───demo.env (149b)
│       └───demo.toml (237b)
├───go.mod (43b)
├───main.go (90b)
├───pkg
│       ├───auther.go (345b)
│       ├───http.go (1224b)
│       └───service.go (865b)
├───script
│       └───build.sh (3378b)
└───version
        └───version.go (566b)
启用看一看
$ make run
2020-06-06T20:03:00.328+0800    INFO    [INIT]  cmd/service.go:151      log level: debug
2020-06-06T20:03:00.328+0800    INFO    [CLI]   cmd/service.go:93       loaded services: []
Version   : 
Build Time: 
Git Branch: 
Git Commit: 
Go Version: 
2020-06-06T20:03:00.328+0800    INFO    [API]   api/api.go:66   http endpoint registry success
2020-06-06T20:03:00.328+0800    INFO    [API]   api/api.go:100  HTTP服务启动成功, 监听地址: 0.0.0.0:8050
解放双手
对于一些可能标准化的代码模块, mcube已经为你准备好了生成器, 用于提升效率
安装好mcube好后, 编写好基本的枚举, 然后生成器会提取这些信息, 生成序列化方法
//go:generate  mcube enum -m
package enum_test
const (
	// Running (running) todo
	Running Status = iota
	// Stopping (stopping) tdo
	Stopping
	// Stopped (stopped) todo
	Stopped
	// Canceled (canceled) todo
	Canceled
	test11
)
const (
	// Running (running) todo
	E1 Enum = iota
	// Running (running) todo
	E2
)
// Status AAA
// BBB
type Status uint
type Enum uint
执行生成器
go generate ./...
基于上面的样例生成如下:
// Code generated by github.com/infraboard/mcube
// DO NOT EDIT
package enum_test
import (
	"bytes"
	"fmt"
	"strings"
)
var (
	enumStatusShowMap = map[Status]string{
		Running:  "Running",
		Stopping: "Stopping",
		Stopped:  "Stopped",
		Canceled: "Canceled",
		test11:   "test11",
	}
	enumStatusIDMap = map[string]Status{
		"Running":  Running,
		"Stopping": Stopping,
		"Stopped":  Stopped,
		"Canceled": Canceled,
		"test11":   test11,
	}
)
// ParseStatus Parse Status from string
func ParseStatus(str string) (Status, error) {
	key := strings.Trim(string(str), `"`)
	v, ok := enumStatusIDMap[key]
	if !ok {
		return 0, fmt.Errorf("unknown Status: %s", str)
	}
	return v, nil
}
// Is todo
func (t Status) Is(target Status) bool {
	return t == target
}
// String stringer
func (t Status) String() string {
	v, ok := enumStatusShowMap[t]
	if !ok {
		return "unknown"
	}
	return v
}
// MarshalJSON todo
func (t Status) MarshalJSON() ([]byte, error) {
	b := bytes.NewBufferString(`"`)
	b.WriteString(t.String())
	b.WriteString(`"`)
	return b.Bytes(), nil
}
// UnmarshalJSON todo
func (t *Status) UnmarshalJSON(b []byte) error {
	ins, err := ParseStatus(string(b))
	if err != nil {
		return err
	}
	*t = ins
	return nil
}
var (
	enumEnumShowMap = map[Enum]string{
		E1: "E1",
		E2: "E2",
	}
	enumEnumIDMap = map[string]Enum{
		"E1": E1,
		"E2": E2,
	}
)
// ParseEnum Parse Enum from string
func ParseEnum(str string) (Enum, error) {
	key := strings.Trim(string(str), `"`)
	v, ok := enumEnumIDMap[key]
	if !ok {
		return 0, fmt.Errorf("unknown Status: %s", str)
	}
	return v, nil
}
// Is todo
func (t Enum) Is(target Enum) bool {
	return t == target
}
// String stringer
func (t Enum) String() string {
	v, ok := enumEnumShowMap[t]
	if !ok {
		return "unknown"
	}
	return v
}
// MarshalJSON todo
func (t Enum) MarshalJSON() ([]byte, error) {
	b := bytes.NewBufferString(`"`)
	b.WriteString(t.String())
	b.WriteString(`"`)
	return b.Bytes(), nil
}
// UnmarshalJSON todo
func (t *Enum) UnmarshalJSON(b []byte) error {
	ins, err := ParseEnum(string(b))
	if err != nil {
		return err
	}
	*t = ins
	return nil
}