如何选择web框架:
首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术。当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂时没有,但是不是所有人都喜欢这种复杂的框架。Golang里面一些应用层面的技术需要自己去组装,比如session,cache, log等等. 可选择的web框架有martini, goji等,都是轻量级的。
Golang的web项目中的keepalive
关于keepalive, 是比较复杂的, 注意以下几点:
-
http1.1 默认支持keepalive, 但是不同浏览器对keepalive都有个超时时间, 比如firefox:
默认超时时间115秒, 不同浏览器不一样; -
Nginx默认超时时间75秒;
-
golang默认超时时间是无限的, 要控制golang中的keepalive可以设置读写超时, 举例如下:
server := &http.Server{
Addr: ":9999",
Handler: framework,
ReadTimeout: 32 * time.Second,
WriteTimeout: 32 * time.Second,
MaxHeaderBytes: 1 << 20,
}
server.ListenAndServe()
github.com/go-sql-driver/mysql使用主意事项:
这是使用率极高的一个库, 在用它进行事务处理的情况下, 要注意一个问题, 由于它内部使用了连接池, 使用事务的时候如果没有Rollback或者Commit, 这个取出的连接就不会放回到池子里面, 导致的后果就是连接数过多, 所以使用事务的时候要注意正确地使用。
github.com/garyburd/redigo/redis使用注意事项:
这也是一个使用率极高的库, 同样需要注意,它是支持连接池的, 所以最好使用连接池, 正确的用法是这样的:
func initRedis(host string) *redis.Pool {
return &redis.Pool{
MaxIdle: 64,
IdleTimeout: 60 * time.Second,
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", host)
if err != nil {
return nil, err
}
_, err = c.Do("SELECT", config.RedisDb)
return c, err
},
}
}
另外使用的时候也要把连接放回到池子里面, 否则也会导致连接数居高不下。用完之后调用rd.Close(), 这个Close并不是真的关闭连接,而是放回到池子里面。
如何全局捕获panic级别错误: