使用golang的web框架gin搭建API SERVER
在程序的路上只会一种语言已经满足不了当下互联网的需求,当然并不是要每个程序员都去学习各种编程语言,还是要根据实际情况和个人精力。
今天我们学习用go的web框架gin搭建apisever,并同tornado的apiserver进行并发性能对比。为啥对比tornado,因为我的工作就是把原py下的一些业务迁移到go下~
基于gin的apiserver
准备工作
- 创建工作空间:mkdir $HOME/work
- 创建src:mkdir $HOME/work/src Go源文件目录
- 创建pkg: mkdir $HOME/work/pkg pkg存放编译后的包文件
- 创建bin: mkdir $HOME/work/bin bin存放编译后的可执行文件
- 安装gin,redis,ffjson
go get gopkg.in/gin-gonic/gin.v1
go get gopkg.in/redis.v5
go get -u github.com/pquerna/ffjson 一个超块的json解析包
- 编写 vi ./src/work/main.go
package main
import (
//"fmt"
"gopkg.in/gin-gonic/gin.v1"
"redis_util")func main() {
r := gin.Default()
r.GET("/api/test", func(c *gin.Context) {
redisClient := redis_util.GetRedisClientInstance()
test := redisClient.Get("test")
if test == nil {
c.JSON(200, gin.H{})
} else {
c.JSON(200, test)
}
})
r.Run(":8080")
}
- 编写 vi ./src/redis_util/redis_client.go redisclient
package redis_util
import (
"fmt"
"github.com/pquerna/ffjson/ffjson"
"gopkg.in/redis.v5"
"log"
"sync"
"time")
type RedisClient struct {
pool *redis.Client
}
var once sync.Once
var redisClient *RedisClient
func GetRedisClientInstance() *RedisClient {
once.Do(func() { //once do 单例模式
client := redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
MaxRetries: 3,
DialTimeout: 5 * time.Second,
WriteTimeout: 3 * time.Second,
PoolSize: 20,
PoolTimeout: 0,
IdleTimeout: 0,
DB: 3,
})
pong, err := client.Ping().Result()
log.Println(pong, err)
redisClient = &RedisClient{client}
})
return redisClient
}
func (c *RedisClient) Get(key string) map[string]interface{} {
val, err := c.pool.Get(key).Result()
log.Println(val, err)
var dat map[string]interface{}
if err == nil {
ffjson.Unmarshal([]byte(val), &dat) //将结果统一格式化
if len(dat) == 0 {
return map[string]interface{}{"val": val}
}
} return dat
}
- run起来: go run main.go
- 编写tornado servier
import tornado.ioloopimport tornado.webimport jsonimport redis
redis_cli = redis.StrictRedis(host="127.0.0.1", port="6379", db="3")
class MainHandler(tornado.web.RequestHandler):
def get(self):
test_val = redis_cli.get("test")
self.write(test_val)
def make_app(): return tornado.web.Application([
(r"/api/test", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
- 使用ab压力测试 还是go bin快~
注:pkg和bin可以不用手动创建 执行go install work 会自动创建
微众公众号搜索“一起python”