zoo

package module
v0.0.5 Latest Latest
Warning

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

Go to latest
Published: Apr 14, 2026 License: Apache-2.0 Imports: 24 Imported by: 0

README

zoo 动物园框架

为简约而生
它是继承于 zgg(https://github.com/suisrc/zgg.git) 框架
分离 kwdog(kwcat, kwrat), kwlog, front 等模块(独立出来)
创建一个zoant(https://github.com/suisrc/zoant.git) 模块,用来孵化为模块

框架介绍

这是一极精简的 web 服务框架, 默认没有 routing, 使用 map 进行 action 检索 ,为单接口而生。
通过 query.action(query参数) 或者 path=action(path就是action) 两种方式确定 handle 函数。

为什么需要它?
在很多项目中,可能只需要几个接口, 而为这些接口无论使用 gin, echo, iris, fasthttp...我认为都是不值当的。因此它就诞生了。

自动注入wire?
wire 是一个依赖注入框架, 但是考虑到框架本身就比较小,本身不依赖任何第三方库,所以不会集成wire, 如果需要,可以考虑自行增加。
但是,实现了一个简单的注入封装,svckit:"auto", 可以自动注入依赖。例如:


type HelloHandler struct {
	F1 any                           // 标记不注入,默认
	F2 any      `svckit:"-"`         // 标记不注入,默认
	F3 zoo.Module `svckit:"type"`      // 根据【类型】自动注入
	F4 zoo.SvcKit `svckit:"type"`      // 根据【类型】自动注入
	F5 any      `svckit:"hdl-hello"` // 根据【名称】自动注入
	F6 any      `svckit:"hdl-world"` // 根据【名称】自动注入
	F7 zoo.TplKit `svckit:"auto"`      // 根据【类型】自动注入
	f1 zoo.TplKit `svckit:"auto"`      // 私有【属性】不能注入
}

项目列表

zodog 网关工具, 反向代理, 正向代理,透传代理
zolog 为 fluentbit 提供 http 协议的收集和展示方案
zofnt 取代常规 nginx 部署前端静态资源,提供文件路由和展示
zobee 基于 ebpf 对 系统中的 http / https 流量进行免入侵形式监控

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	AppName = "zoo"
	Version = "v0.0.0"
	AppInfo = "(https://github.com/suisrc/zoo.git)"

	G = struct {
		Server EngineConf
	}{}

	IngoreError = errors.New("ignore error")

	// 路由构建器
	Engines = map[string]func(SvcKit) Engine{
		"map": NewMapRouter,
		"mux": NewMuxRouter,
		"dir": NewDirRouter,
		"hst": NewHstRouter,
	}
)
View Source
var (
	ErrTplNotFound = errors.New("tpl not found")
)
View Source
var HttpServeDef = true // 是否启动默认 http 服务? 这里不能通过配置,只能通过代码控制

----------------------------------------------------------------------------

View Source
var ResultEncoders = map[string]ResultEncoder{
	"2": EncodeJson2,
	"3": EncodeHtml3,
}

Functions

func AddCmd

func AddCmd(name string, cmd func())

增加命令, 如果 cmd 为空,则删除该命令

func EncodeHtml3

func EncodeHtml3(rr *http.Request, rw http.ResponseWriter, rs *Result)

func EncodeJson2

func EncodeJson2(rr *http.Request, rw http.ResponseWriter, rs *Result)

func Execute

func Execute(envpre, appname, version, appinfo string)

程序入口

func Favicon

func Favicon(ctx *Ctx)

favicon.ico

func FieldInject

func FieldInject(target any, value any, tag string, debug bool) bool

获取 target 中每个字段的属性,注入和 value 属性的字段 这只是一个演示的例子,实际开发中,请使用 SvcKit 模块

func FieldSetVal

func FieldSetVal(target any, field string, value any)

可设置字段值

func FieldValue

func FieldValue(target any, field string) any

可获取有权限字段

func FieldValue_

func FieldValue_(target any, field string) any

获取字段, 可夸包获取私有字段 闭包原则,原则上不建议使用该方法,因为改方法是在破坏闭包原则

func GET

func GET(key string, hdl HandleFunc, svc SvcKit)

GET http method

func GetAction

func GetAction(uu *url.URL) string

获取请求 action, 优先使用 query.action, 其次使用 path[1:] 作为 action

func GetRemoteIP

func GetRemoteIP(req *http.Request) string

func GetReqType

func GetReqType(request *http.Request) string

获取 reqType / 配置 reqType

func GetTraceID

func GetTraceID(request *http.Request) string

获取 traceID / 配置 traceID

func HTML0

func HTML0(zg *Zoo, rr *http.Request, rw http.ResponseWriter, rs any, tp string)

响应 HTML 模板结果: content-type http-status html-data

func HasPrepath

func HasPrepath(path string, epre string) bool

前缀匹配, 用于路径判断, 例如 /api/v1/user, pre=/api, 则返回 true

func Healthz

func Healthz(ctx *Ctx)

健康检查接口

func Initializ

func Initializ()

注册默认方法

func Inject

func Inject[T any](kit SvcKit, val T) T

注册服务, name = val.(type), 并自动初始化 val 实体

func JSON

func JSON(ctx *Ctx, res *Result)

响应 JSON 结果, 这是一个套娃,

func JSON0

func JSON0(rr *http.Request, rw http.ResponseWriter, rs *Result)

响应 JSON 结果: content-type http-status json-data

func POST

func POST(key string, hdl HandleFunc, svc SvcKit)

POST http method

func PrintVersion

func PrintVersion()

打印版本信息

func Ptr

func Ptr[T any](v T) *T

创建指针

func ReadBody

func ReadBody[T any](rr *http.Request, rb T) (T, error)

请求数据

func ReadForm

func ReadForm[T any](rr *http.Request, rb T) (T, error)

请求数据

func RegKey

func RegKey[T any](kit SvcKit, inj bool, key string, val T) T

*

  • 注册服务, key 必须唯一, 如果 key 为空, 使用 val.(type).Name() 作为 key
  • @param kit 服务容器
  • @param inj 自动注入
  • @param key 服务 key
  • @param val 服务实例

func RegSvc

func RegSvc[T any](kit SvcKit, val T) T

注册服务, name = val.(type)

func Register

func Register(key string, opts ...any)

在 init 注册配置函数

func RunHttpServe

func RunHttpServe()

运行 http 服务

func SetRouterKeyByDir

func SetRouterKeyByDir(rr *http.Request)

SetRouterKeyByDir 从 URL.Path 中提取第一个目录作为 key,并设置到 X-Router-Key 头部信息中,同时更新 URL.Path 去掉第一个目录

func SetRouterKeyByHst

func SetRouterKeyByHst(rr *http.Request)

SetRouterKeyByHst 从 Host 中提取子域名作为 key,并设置到 X-Router-Key 头部信息中,供后续路由识别使用

func WriteResp

func WriteResp(rw http.ResponseWriter, ctype string, code int, data []byte)

响应数据

Types

type BufferPool

type BufferPool interface {
	Get() []byte
	Put([]byte)
}

func NewBufferPool

func NewBufferPool(defCap, maxCap int) BufferPool

NewBufferPool 初始化缓冲池 defCap: 新缓冲区的默认容量(如32KB) maxCap: 允许归还的最大容量(如1MB)

type BufferPoolDef

type BufferPoolDef struct {
	// contains filtered or unexported fields
}

BufferPoolDef 字节缓冲池:基于sync.Pool实现

func (*BufferPoolDef) Get

func (p *BufferPoolDef) Get() []byte

Get 获取缓冲区:从池取出或创建新缓冲区

func (*BufferPoolDef) Put

func (p *BufferPoolDef) Put(buf []byte)

Put 归还缓冲区:重置后放回池(若容量超过maxCap则丢弃)

type Closed

type Closed func()

close function

func RegisterHttpServe

func RegisterHttpServe(svc SvcKit) Closed

type Ctx

type Ctx struct {
	Ctx context.Context
	// Cancel func
	Cancel context.CancelFunc
	// All Module
	SvcKit SvcKit
	// Request action
	Action string
	// Request Cache
	Caches map[string]any
	// Params
	Params func(key string) string
	// Request
	Request *http.Request
	// Response
	Writer http.ResponseWriter
	// Trace ID
	TraceID string
	// X-Request-Rt
	ReqType string
	// contains filtered or unexported fields
}

请求上下文内容

func NewCtx

func NewCtx(svckit SvcKit, request *http.Request, writer http.ResponseWriter, router string) *Ctx

创建上下文函数

func (*Ctx) Abort

func (ctx *Ctx) Abort()

用于标记提前结束,不是强制的

func (*Ctx) BYTE

func (ctx *Ctx) BYTE(bts io.Reader, hss int, cty string)

已 BYTE 模板格式写出响应

func (*Ctx) Clear

func (ctx *Ctx) Clear()

清理访问资源

func (*Ctx) Clone

func (ctx *Ctx) Clone(hasContext, hasRequest bool) *Ctx

克隆上下文函数

func (*Ctx) HTML

func (ctx *Ctx) HTML(tpl string, res any, hss int)

已 HTML 模板格式写出响应

func (*Ctx) IsAbort

func (ctx *Ctx) IsAbort() bool

func (*Ctx) JERR

func (ctx *Ctx) JERR(err error, hss int)

已 JSON 错误格式写出响应

func (*Ctx) JSON

func (ctx *Ctx) JSON(err error)

已 JSON 格式写出响应

func (*Ctx) TEXT

func (ctx *Ctx) TEXT(txt string, hss int)

已 TEXT 模板格式写出响应

type DirRouter

type DirRouter struct {
	Helper RdeHelper
	Router map[string]Engine
	// contains filtered or unexported fields
}

func (*DirRouter) Handle

func (aa *DirRouter) Handle(method, action string, handle HandleFunc)

func (*DirRouter) Name

func (aa *DirRouter) Name() string

func (*DirRouter) ServeHTTP

func (aa *DirRouter) ServeHTTP(rw http.ResponseWriter, rr *http.Request)

type Engine

type Engine interface {
	Name() string                                       // router engine name
	Handle(method, action string, handle HandleFunc)    // register router handle, [method]可能为"", [action]开头无"/"
	ServeHTTP(rw http.ResponseWriter, rr *http.Request) // http.HandlerFunc
}

引擎接口, Engine, 不适用 Router 是为了和 其他 Router 名字上区分开。以便于支持多 Router 而不会出现冲突

func NewDirRouter

func NewDirRouter(svckit SvcKit) Engine

func NewHstRouter

func NewHstRouter(svckit SvcKit) Engine

func NewMapRouter

func NewMapRouter(svckit SvcKit) Engine

func NewMuxRouter

func NewMuxRouter(svckit SvcKit) Engine

type EngineConf added in v0.0.2

type EngineConf struct {
	Fxser   bool   `json:"xser"` // 标记 xser 头部信息
	Local   bool   `json:"local"`
	Addr    string `json:"addr" default:"0.0.0.0"`
	Port    int    `json:"port" default:"80"`
	Ptls    int    `json:"ptls" default:"443"`
	Dual    bool   `json:"dual"`   // http and https
	Engine  string `json:"engine"` // router engine
	ApiRoot string `json:"root"`   // root api root
	TplPath string `json:"tpl"`    // templates folder path
	ReqXrtd string `json:"xrt"`    // X-Request-Rt default value, 1: zoo, 2: ali, 3: html
}

默认配置, Engine 配置需要内嵌该结构体

type HandleFunc

type HandleFunc func(zrc *Ctx)

定义处理函数

func MergeFunc

func MergeFunc(handles ...HandleFunc) HandleFunc

merge multi func to one func

func TokenAuth

func TokenAuth(token *string, handle HandleFunc) HandleFunc

request token auth

type HstRouter

type HstRouter struct {
	Helper RdeHelper
	Router map[string]Engine
	// contains filtered or unexported fields
}

func (*HstRouter) Handle

func (aa *HstRouter) Handle(method, action string, handle HandleFunc)

func (*HstRouter) Name

func (aa *HstRouter) Name() string

func (*HstRouter) ServeHTTP

func (aa *HstRouter) ServeHTTP(rw http.ResponseWriter, rr *http.Request)

type MapRouter

type MapRouter struct {
	Handle_ HandleFunc            // 默认函数,没有找到Action触发
	Handles map[string]HandleFunc // 接口集合
	// contains filtered or unexported fields
}

func (*MapRouter) GetHandle

func (aa *MapRouter) GetHandle(method, action string) (HandleFunc, bool)

func (*MapRouter) Handle

func (aa *MapRouter) Handle(method, action string, handle HandleFunc)

func (*MapRouter) Name

func (aa *MapRouter) Name() string

func (*MapRouter) ServeHTTP

func (aa *MapRouter) ServeHTTP(rw http.ResponseWriter, rr *http.Request)

type MuxRouter

type MuxRouter struct {
	Router *http.ServeMux
	// contains filtered or unexported fields
}

func (*MuxRouter) Handle

func (aa *MuxRouter) Handle(method, action string, handle HandleFunc)

func (*MuxRouter) Name

func (aa *MuxRouter) Name() string

func (*MuxRouter) ServeHTTP

func (aa *MuxRouter) ServeHTTP(rw http.ResponseWriter, rr *http.Request)

type RaData

type RaData struct {
	Atyp string `json:"type"`
	Data string `json:"data"`
}

请求结构体, 特殊的请求体

func ReadData

func ReadData(rr *http.Request) (*RaData, error)

请求数据

type RdeHelper

type RdeHelper interface {
	KeyGetter(key string) (string, error)
	NewRouter(svckit SvcKit) Engine
}

type Ref

type Ref[K cmp.Ordered, T any] struct {
	Key K
	Val T
}

键值对

type Result

type Result struct {
	Success bool   `json:"success"`
	Data    any    `json:"data,omitempty"`
	ErrCode string `json:"errcode,omitempty"`
	Message string `json:"message,omitempty"`
	ErrShow int    `json:"errshow,omitempty"`
	TraceID string `json:"traceid,omitempty"`
	Total   *int   `json:"total,omitempty"`

	Ctx    *Ctx              `json:"-"`
	Status int               `json:"-"`
	Header map[string]string `json:"-"`
	TplKey string            `json:"-"`
}

定义响应结构体

func (*Result) Error

func (aa *Result) Error() string

type Result2

type Result2 struct {
	Success bool   `json:"success"`
	Data    any    `json:"data,omitempty"`
	ErrCode string `json:"errorCode,omitempty"`
	Message string `json:"errorMessage,omitempty"`
	ErrShow int    `json:"showType,omitempty"`
	TraceID string `json:"traceId,omitempty"`
	Total   *int   `json:"total,omitempty"`
}

func (*Result2) Error

func (aa *Result2) Error() string

type ResultEncoder

type ResultEncoder func(rr *http.Request, rw http.ResponseWriter, rs *Result)

type Server

type Server interface {
	Name() string
	Addr() string
	RunServe()
	Shutdown(ctx context.Context) error
}

func NewServer

func NewServer(name string, handler http.Handler, addr string, conf *tls.Config) Server

type Slice

type Slice[T any] []T

func (*Slice[T]) Add

func (s *Slice[T]) Add(vals ...T)

追加一条数据到数据集中

func (*Slice[T]) Del

func (s *Slice[T]) Del(fn func(val T) bool)

删除满足条件的第一条数据

func (*Slice[T]) Get

func (s *Slice[T]) Get(fn func(val T) bool) (val T, ok bool)

获取满足条件的第一条数据

func (*Slice[T]) Set

func (s *Slice[T]) Set(fn func(val T) bool, val T)

校验数据是否存在,存在替换,不存在追加

type SvcKit

type SvcKit interface {
	Engine() *Zoo                      // 获取模块管理器 *Zoo 接口
	Inject(obj any) SvcKit             // 注册服务 inject 使用 `svckit:"xxx"` 初始化服务
	Router(key string, hdl HandleFunc) // 注册路由
	Get(key string) any                // 获取服务
	Set(key string, val any) SvcKit    // 增加服务 val = nil 是卸载服务
	Map() map[string]any               // 服务列表, 注意,是副本
}

服务工具接口

func NewSvcKit

func NewSvcKit(engine *Zoo) SvcKit

type TplCtx

type TplCtx struct {
	Key string             // 模版编码
	Tpl *template.Template // 模版
	Err error              // 加载模版的异常
	Txt string             // 模版原始内容
	Lck sync.Mutex         // 模版锁
}

type TplKit

type TplKit interface {
	Get(key string) *TplCtx
	Render(wr io.Writer, name string, data any) error
	Load(key string, str string) *TplCtx
	Preload(dir string) error
}

模版工具接口

func NewTplKit

func NewTplKit(srv SvcKit) TplKit

type Zoo

type Zoo struct {
	Servers Slice[Server] // 接口服务模块列表
	Closeds Slice[Closed] // 模块关闭函数列表
	TLSConf *tls.Config   // Certificates, GetCertificate

	Engine Engine // 路由引擎
	SvcKit SvcKit // 服务工具
	TplKit TplKit // 模版工具
	// contains filtered or unexported fields
}

默认服务实体

func (*Zoo) AddRouter

func (aa *Zoo) AddRouter(key string, handle HandleFunc)

增加处理函数 @param key: [method:]action, 如果 method 为空,则默认为 所有请求

func (*Zoo) RunServe

func (aa *Zoo) RunServe()

启动 HTTP 服务

func (*Zoo) ServeHTTP

func (aa *Zoo) ServeHTTP(rw http.ResponseWriter, rr *http.Request)

默认相应函数 http.HandlerFunc(zoo.ServeHTTP)

func (*Zoo) ServeInit

func (aa *Zoo) ServeInit() bool

服务初始化

func (*Zoo) ServeStop

func (aa *Zoo) ServeStop(err ...string)

服务终止,注意,这里只会终止模版,不会终止服务, 终止服务,需要调用 hsv.Shutdown

func (*Zoo) WaitFor

func (aa *Zoo) WaitFor()

等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)

Directories

Path Synopsis
zoe
gte
gtw
@see ReverseProxy(https://pkg.go.dev/net/http/httputil#ReverseProxy) @see net/http/httputil.ReverseProxy
@see ReverseProxy(https://pkg.go.dev/net/http/httputil#ReverseProxy) @see net/http/httputil.ReverseProxy
log
rdx
Package httprouter is a trie based high performance HTTP request router.
Package httprouter is a trie based high performance HTTP request router.
sqlx
Package reflectx implements extensions to the standard reflect lib suitable for implementing marshalling and unmarshalling packages.
Package reflectx implements extensions to the standard reflect lib suitable for implementing marshalling and unmarshalling packages.
wsg
wsz

Jump to

Keyboard shortcuts

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