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等框架繼續完善。