gone

package module
v0.0.20 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 7, 2022 License: GPL-3.0 Imports: 10 Imported by: 14

README

gone

license
这是gone框架的第二版,第一版在这里

这是个啥?

这是一个依赖注入框架,应该是"最类似spring"的一个golang的依赖注入框架。可以将Goner理解为Spring Bean ,代码中只需要编写各种功能的Goner即可完成业务开发。在example目录可以找到详细的例子,后续会补充完成的帮忙手册。

概念

gone的意思是 走了,去了,没了,死了,那么Gone管理都是Goner(逝者)
存在一片神秘墓园,安葬在这里的逝者,灵魂会升入天国。天国指定的牧师可以将Goner葬入这片墓园...

  • Heaven: 天国 🕊☁️
  • Heaven.Start: 天国开始运行;Goner永生,直到天崩地裂
  • Heaven.Stop: 天国崩塌,停止运行
  • Cemetery: 墓园 🪦
  • Cemetery.Bury: 安葬
  • Cemetery.revive: 复活Goner,将其升入天国;对于Goner则是完成了属性的的注入(或者装配)
  • Tomb: 坟墓 ⚰️
  • Priest: 神父✝️,负责给Goner安葬
  • Goner: 逝者 💀;是对可注入对象的抽象:可以注入其他Goner,可以被注入其他Goner;
  • Prophet: 先知;如果一个Goner是先知,他被复活后会去执行AfterRevive() AfterReviveError方法,去窥视神的旨意
  • Prophet.AfterRevive: 复活后执行的方法
  • Angel: 天使 𓆩♡𓆪 ,实现了Start(gone.Cemetery) errorStop(gone.Cemetery) error方法的Goner,升入天国后被变成天使
  • Angel.Start: 天使左翼,开始工作;能力越大责任越大,天使是要工作的
  • Angel.Stop: 天使右翼,停止工作;
  • Vampire: 吸血鬼 🧛🏻‍,实现了Suck(conf string, v reflect.Value) gone.SuckError 方法的是吸血鬼;吸血鬼是一个邪恶的存在,他可能毁掉整个天国。理论上吸血行为可以制造Goner,但是这可能会导致循环依赖,从而破坏系统。
  • Vampire.Suck: 吸血鬼"吸血行为"
四种Goner
  • 普通Goner

    普通Goner,可以用于抽象App中的Service、Controller、Client等常见的组件。 如果Goner提供了方法 AfterRevive(Cemetery, Tomb) ReviveAfterError,在升入天国后会被调用。

  • 先知Prophet

    先知,复活后会去执行AfterRevive() AfterReviveError方法

  • 天使Angel

    天使会在天国承担一定的职责:启动阶段,天使的Start方法会被调用;停止阶段,天使的Stop方法会被调用;所以天使适合抽象" 需要启停控制"的组件。

  • 吸血鬼Vampire

    吸血鬼,具有吸血的能力,可以通过Suck方法去读取/写入被标记的字段;可以抽象需要控制其他组件某个属性的行为。

注入配置

普通Goner安葬

package goner_demo

import "github.com/gone-io/gone"

type XGoner struct {
	gone.GonerFlag
}

type Demo struct {
	gone.GonerFlag
	a  *XGoner     `gone:"x-goner"` // x-goner 是 GonerId; 支持使用非导出属性
	A  XGoner      `gone:"x-goner"` // x-goner 是 GonerId; 支持结构体;⚠️尽量不要这样使用,由于结构体是值拷贝,会导致不能深度复制的问题
	A1 *XGoner     `gone:"x-goner"` // x-goner 是 GonerId; 支持结构体的指针
	A2 any `gone:"x-goner"` // x-goner 是 GonerId; 支持接口

	B  *XGoner       `gone:"*"` //  支持匿名注入
	B1 []any `gone:"*"` // 支持匿名注入数组
}

对吸血鬼安葬,被安葬的是Goner是一个Vampire

吸血鬼是一种邪恶的生物,他可以读取/吸入被注入的Goner的属性

package goner_demo

import (
	"github.com/gone-io/gone"
	"github.com/magiconair/properties/assert"
	"reflect"
)

type ConfigVampire struct {
	gone.GonerFlag
}

func (*ConfigVampire) Suck(conf string, v reflect.Value) gone.SuckError {
	// conf = abc.dex,xxx|xxx
	// v = Demo.a 的 reflect.Value

	return nil
}

const ConfigVampireId = "x-config"

type Demo struct {
	// 吸血鬼不会被注入到属性中,而是会在属性上调用`Vampire.Suck`函数完成吸血,吸血鬼可以读取、写入属性的值
	a int `gone:"x-config,abc.dex,xxx|xxx"` //普通Goner会忽略GonerId(x-config)后面的字符串`abc.dex,xxx|xxx`; 而吸血鬼会用来进行"吸血"
}

func Priest(cemetery gone.Cemetery) error {
	cemetery.Bury(&ConfigVampire{}, ConfigVampireId)
	cemetery.Bury(&Demo{})
	return nil
}

func run() {
	gone.Run(Priest)
}

使用

  • 启动
package main

import "github.com/gone-io/gone"

func main() {
	gone.Run(func(cemetery gone.Cemetery) error {
		//安葬Goner
		return nil
	})
}

代码生成(生成Priest函数)

在gone框架中提供了一个同名的代码生成工具,他的作用是 扫描文件目录中标记了 //go:gone 的函数,为这些函数生成一个 Priest函数;

  • 安装gone
    go install github.com/gone-io/gone/tools/gone@v0.0.3
    
  • 使用,参考 example/app/Makefile
    gone -s ${scan_package_dir} -p ${pkgName} -f ${funcName} -o ${output_dir} [-w] --stat
    
  • Demo
    # 进入本仓库的例子目录 
    cd example/app
    
    # 安装gone
    go install github.com/gone-io/gone/tools/gone@v0.0.4
    
    # 生成 priest.go 文件
    gone -s internal -p internal -f Priest -o internal/priest.go
    
    将生成文件internal/priest.go,内容如下:
    // Code generated by gone; DO NOT EDIT.
    package internal
    import (
        "github.com/gone-io/gone/example/app/internal/worker"
        "github.com/gone-io/gone"
    )
    
    func Priest(cemetery gone.Cemetery) error {
        cemetery.Bury(worker.NewPrintWorker())
        worker.Priest(cemetery)
        return nil
    }
    

组件库

  • github.com/gone-io/gone/goner/cumx
    github.com/soheilhy/cmux 进行封装,用于复用同一个端口实现多种协议;
  • github.com/gone-io/gone/goner/config
    完成 gone-app 的配置
  • github.com/gone-io/gone/goner/gin
    github.com/gin-gonic/gin封装,提供web服务
  • github.com/gone-io/gone/goner/logrus
    github.com/sirupsen/logrus封装,提供日志服务
  • github.com/gone-io/gone/goner/tracer
    提供日志追踪,可以用于给同一条请求链路提供统一的tracerId
  • github.com/gone-io/gone/goner/xorm
    封装xorm.io/xorm,用于数据库的访问;使用时,按需引用数据库驱动;
  • github.com/gone-io/gone/goner/redis 封装github.com/gomodule/redigo,用于操作redis
  • github.com/gone-io/gone/goner/schedule 封装 github.com/robfig/cron/v3,用于设置定时器

TODO LIST

  • emitter,封装事件处理
  • grpc,封装 github.com/grpc/grpc

📢注意

  • 尽量不用使用 struct(结构体)作为 gone 标记的字段,由于struct在golang中是值拷贝,可能导致相关依赖注入失败的情况
  • 下面这些Goner上的方法都不应该是阻塞的
    • AfterRevive(Cemetery, Tomb) ReviveAfterError
    • Start(Cemetery) error
    • Stop(Cemetery) error
    • Suck(conf string, v reflect.Value) SuckError

Documentation

Index

Constants

View Source
const (
	// GonerIdIsExisted GonerId 不存在
	GonerIdIsExisted = 1001 + iota

	// CannotFoundGonerById 通过GonerId查找Goner失败
	CannotFoundGonerById

	// CannotFoundGonerByType 通过类型查找Goner失败
	CannotFoundGonerByType

	//NotCompatible 类型不兼容
	NotCompatible

	//ReplaceBuryIdParamEmpty 替换性下葬,GonerId不能为空
	ReplaceBuryIdParamEmpty
)

错误代码:gone框架内部错误代码编码空间:1001~1999

View Source
const (
	// IdGoneHeaven 天堂组件的ID,代码了程序本身,Gone程序启动时默认注入
	IdGoneHeaven = "gone-heaven"

	// IdGoneCemetery 坟墓组件的ID,是完成依赖注入的关键组件,Gone程序启动时默认注入
	IdGoneCemetery = "gone-cemetery"

	//IdGoneTestKit 测试箱,调用 gone.Test 或者 gone.TestAt 时,会将测试箱注入到程序;非测试代码中不应该注入该组件
	IdGoneTestKit = "gone-test-kit"

	//IdConfig 配置 Goner 的ID,提过能配置能力
	IdConfig = "config"
	//IdGoneConfigure 配置器 Goner 的ID
	IdGoneConfigure = "gone-configure"
	// IdGoneTracer Tracer Goner 的ID,提供日志追踪能力
	IdGoneTracer = "gone-tracer"
	// IdGoneLogger 日志 Goner 的ID,用于日志打印
	IdGoneLogger = "gone-logger"

	//IdGoneCumx [cmux Goner](/goner/cmux#Server) ID
	IdGoneCumx = "gone-cumx"

	//IdGoneGin Gin相关的组件ID,可以使用 [goner.GinPriest](goner#GinPriest) 牧师函数批量安葬
	IdGoneGin          = "gone-gin"
	IdGoneGinRouter    = "gone-gin-router"
	IdGoneGinProcessor = "gone-gin-processor"
	IdGoneGinProxy     = "gone-gin-proxy"
	IdGoneGinResponser = "gone-gin-responser"

	//IdGoneXorm Xorm Goner 的ID,封装了xorm,用于操作数据库;使用 [goner.XormPriest](goner#XormPriest) 牧师函数安葬
	IdGoneXorm = "gone-xorm"

	//IdGoneRedisPool redis pool goner; redis 相关 Goner,使用 [goner.RedisPriest](goner#RedisPriest) 牧师函数安葬
	IdGoneRedisPool   = "gone-redis-pool"
	IdGoneRedisCache  = "gone-redis-cache"
	IdGoneRedisLocker = "gone-redis-locker"

	// IdGoneSchedule 定时器Goner;使用 [goner.SchedulePriest](goner#SchedulePriest) 牧师函数安葬
	IdGoneSchedule = "gone-schedule"
)

Gone框架中的内置组件ID

Variables

View Source
var AfterStopSignalWaitSecond = 10

AfterStopSignalWaitSecond 收到停机信号后,退出程序等待的时间

Functions

func GetFuncName added in v0.0.20

func GetFuncName(f any) string

GetFuncName 获取某个函数的名字

func GetInterfaceType added in v0.0.17

func GetInterfaceType[T any](t *T) reflect.Type

GetInterfaceType 获取接口的类型

func NewSimpleLogger added in v0.0.8

func NewSimpleLogger() (Goner, GonerId)

func PanicTrace

func PanicTrace(kb int) []byte

PanicTrace 用于获取调用者的堆栈信息

func Run

func Run(priests ...Priest)

Run 开始运行一个Gone程序;`gone.Run` 和 `gone.Serve` 的区别是: 1. gone.Serve启动的程序,主协程会调用 Heaven.WaitEnd 挂起等待停机信号,可以用于服务程序的开发 2. gone.Run启动的程序,主协程则不会挂起,运行完就结束,适合开发一致性运行的代码

    // 定义加载服务的Priest函数
	func LoadServer(c Cemetery) error {
		c.Bury(goneXorm.New())
		c.Bury(goneGin.New())
		return nil
	}

    // 加载组件的Priest函数
	func LoadComponent(c Cemetery) error {
		c.Bury(componentA.New())
		c.Bury(componentB.New())
	}

//开始运行 gone.Run(LoadServer, LoadComponent)

func Serve added in v0.0.6

func Serve(priests ...Priest)

Serve 开始服务,参考[Run](#Run)

func Test added in v0.0.6

func Test[T Goner](fn func(T), priests ...Priest)

Test 用于编写测试用例,参考[示例](https://github.com/gone-io/gone/blob/main/example/test/goner_test.go)

func TestAt added in v0.0.6

func TestAt[T Goner](id GonerId, fn func(T), priests ...Priest)

TestAt 用于编写测试用例,测试某个特定ID的Goner

Types

type AfterReviveError added in v0.0.6

type AfterReviveError error

type Angel

type Angel interface {
	Goner
	Start(Cemetery) error
	Stop(Cemetery) error
}

type Cemetery

type Cemetery interface {
	DefaultLoggerUser
	Goner

	Bury(Goner, ...GonerId) Cemetery  // 埋葬,将逝者埋葬到墓园
	ReplaceBury(Goner, GonerId) error // 替换性埋葬

	GetTomById(GonerId) Tomb
	GetTomByType(reflect.Type) []Tomb
	// contains filtered or unexported methods
}

Cemetery 墓园

type DefaultLoggerUser added in v0.0.17

type DefaultLoggerUser interface {
	SetLogger(logger Logger) SetLoggerError
}

type Error

type Error interface {
	error
	Msg() string
	Code() int
}

Error 普通错误

func CannotFoundGonerByIdError

func CannotFoundGonerByIdError(id GonerId) Error

func CannotFoundGonerByTypeError

func CannotFoundGonerByTypeError(t reflect.Type) Error

func GonerIdIsExistedError

func GonerIdIsExistedError(id GonerId) Error

func NewError

func NewError(code int, msg string) Error

func NewInnerError added in v0.0.6

func NewInnerError(code int, msg string) Error

func NotCompatibleError

func NotCompatibleError(a reflect.Type, b reflect.Type) Error

func ReplaceBuryIdParamEmptyError

func ReplaceBuryIdParamEmptyError() Error

type Flag

type Flag struct{}

type Goner

type Goner interface {
	// contains filtered or unexported methods
}

Goner 逝者

type GonerId

type GonerId string

GonerId 逝者ID

func GetGoneDefaultId

func GetGoneDefaultId(goner Goner) GonerId

type Heaven

type Heaven interface {
	Install() Heaven
	WaitEnd() Heaven
	End() Heaven

	Start() Heaven
	Stop() Heaven

	GetHeavenStopSignal() <-chan struct{}

	BeforeStart(Process) Heaven
	AfterStart(Process) Heaven

	BeforeStop(Process) Heaven
	AfterStop(Process) Heaven
	DefaultLoggerUser
}

func New

func New(priests ...Priest) Heaven

New 新建Heaven; Heaven 代表了一个应用程序;

type InnerError added in v0.0.6

type InnerError interface {
	Error
	Stack() []byte
}

InnerError 内部错误

type Logger

type Logger interface {
	Tracef(format string, args ...any)
	Errorf(format string, args ...any)
	Warnf(format string, args ...any)
	Infof(format string, args ...any)
}

type Priest

type Priest func(cemetery Cemetery) error

Priest 神父,负责给Goner下葬

type Process

type Process func(cemetery Cemetery) error

type Prophet added in v0.0.6

type Prophet interface {
	Goner
	//AfterRevive 在Goner复活后会被执行
	AfterRevive() AfterReviveError
}

Prophet 先知

type SetLoggerError added in v0.0.17

type SetLoggerError error

type SuckError

type SuckError error

type TestHeaven

type TestHeaven[T Goner] interface {
	Heaven
	WithId(id GonerId) TestHeaven[T]
	WithPriest(priests ...Priest) TestHeaven[T]
	Run()
}

func TestKit

func TestKit[T Goner](fn func(T)) TestHeaven[T]

type Tomb

type Tomb interface {
	SetId(GonerId) Tomb
	GetId() GonerId
	GetGoner() Goner
	GonerIsRevive(flags ...bool) bool
}

Tomb 坟墓,逝者的容器

func NewTomb

func NewTomb(goner Goner) Tomb

type Tombs

type Tombs []Tomb

func (Tombs) GetTomByType

func (tombs Tombs) GetTomByType(t reflect.Type) (filterTombs []Tomb)

type Vampire

type Vampire interface {
	Goner
	Suck(conf string, v reflect.Value) SuckError
}

Directories

Path Synopsis
example
app Module
http-server Module
gin
tools

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL