使用golang的web框架gin搭建API SERVER

在程序的路上只会一种语言已经满足不了当下互联网的需求,当然并不是要每个程序员都去学习各种编程语言,还是要根据实际情况和个人精力。

今天我们学习用go的web框架gin搭建apisever,并同tornado的apiserver进行并发性能对比。为啥对比tornado,因为我的工作就是把原py下的一些业务迁移到go下~

基于gin的apiserver

准备工作

  1. 创建工作空间:mkdir $HOME/work
  2. 创建src:mkdir $HOME/work/src Go源文件目录
  3. 创建pkg: mkdir $HOME/work/pkg pkg存放编译后的包文件
  4. 创建bin: mkdir $HOME/work/bin bin存放编译后的可执行文件
  5. 安装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解析包
  1. 编写 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")
}
  1. 编写 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
}
  1. run起来: go run main.go
  2. 编写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()
  1. 使用ab压力测试 还是go bin快~


注:pkg和bin可以不用手动创建 执行go install work 会自动创建


微众公众号搜索“一起python”