polaris虽然是模仿tornado开发,但我以为做为一个go的web框架,还须要提供一些额外的扩展支持。git
polaris如今已经支持session以及middleware,主要参加django。github
polaris对于这些额外功能的支持,采起的是注册 + json配置驱动的方式。这个跟go的database/sql有点相似,任何模块都提供一套相似以下的接口:web
type Obj interface { } type Driver interface{ Open(jsonConfig json.RawMessage) (Obj, error) } func Register(name string, driver Driver) error func Open(name string, jsonConfig json.RawMessage) (Obj, error)
若是咱们须要自定义功能,只须要实现本身的driver以及对应的obj,而后Register进去,后续就能够经过Open直接使用了。redis
对于每一个模块的配置,由于polaris的总体配置是json,因此我也强制要求参数是json格式的,也就是json.RawMessage,各个模块自行进行Unmarshal处理。sql
对于一个session对象,无非就是Set,Get,Delete等,polaris须要关心的是这个session对应的store。store能够理解为该session的持久化保存位置,能够是db,redis,cookie或者memory。django
polaris提供的store接口以下:json
type Store interface { //get a session by id //if no session exist, regenerate another id to new a session Get(id string) (*Session, error) //delete session from store Delete(*Session) error //Save session to stroe Save(*Session) error } type Driver interface { Open(jsonConfig json.RawMessage) (Store, error) }
现阶段,只提供了redis的支持,这里特别说明一下,我是在如今才知道redis有一个setex命令,想一想之前常常用set + expire来设置一个key以及超时,想一想都汗颜。restful
对于session的持久化,polaris提供了codec的接口,外部能够注册本身的序列化方式,同时在相应的store里面实现。对于一个codec,接口以下:cookie
//codec for session encode and decode type Codec interface { Encode(values map[interface{}]interface{}) ([]byte, error) Decode(buf []byte) (map[interface{}]interface{}, error) } func RegisterCodec(name string, codec Codec) error func GetCodec(name string) (Codec, error)
现阶段,polaris提供了gob方式的codec。外部经过GetCodec("gob")就能够获取到。session
polaris的middleware主要提供以下接口:
type Middleware interface { ProcessRequest(env *context.Env) error ProcessResponse(env *context.Env) error }
context.Env是该次请求的上下文环境,对于每次http请求,polaris会首先调用middleware的ProcessRequest,在处理实际对应的restful接口,而后再调用ProcessResponse。
若是Process的时候,返回error,或者env已经finished,polaris会终止后续的process操做。这套处理流程是否合适后续在好好考量。
现阶段,polaris提供了session middleware的支持。
polaris采用注册 + json配置的方式,我以为能够很好的处理后续模块功能的添加问题,后续能够参考django等框架继续完善。