项目作者: duyanghao

项目描述 :
gin-apiserver is a HTTP apiserver framework based on Gin.
高级语言: Go
项目地址: git://github.com/duyanghao/gin-apiserver.git
创建时间: 2019-07-04T08:20:15Z
项目社区:https://github.com/duyanghao/gin-apiserver

开源协议:Apache License 2.0

下载


gin-apiserver

gin-apiserver is a HTTP apiserver framework based on Gin.

Introduction

gin-apiserver是一个基于gin框架写的ApiServer框架,主要用于企业生产环境中的快速开发

Features

  • 1、支持configmap reload api

    1. // config reload
    2. r.Any("/-/reload", func(c *gin.Context) {
    3. log.Info("===== Server Stop! Cause: Config Reload. =====")
    4. os.Exit(1)
    5. })
  • 2、支持ping-pong健康检查&版本获取

    1. // a ping api test
    2. r.GET("/ping", controller.Ping)
    3. // get gin-apiserver version
    4. r.GET("/version", controller.Version)
  • 3、支持dump-goroutine-stack-traces

    1. $ kill -SIGUSR1 41307
    2. === BEGIN goroutine stack dump ===
    3. goroutine 20 [running]:
    4. github.com/duyanghao/gin-apiserver/pkg/util.dumpStacks()
    5. /root/go/src/github.com/duyanghao/gin-apiserver/pkg/util/trap.go:23 +0x6d
    6. github.com/duyanghao/gin-apiserver/pkg/util.SetupSigusr1Trap.func1(0xc000332240)
    7. /root/go/src/github.com/duyanghao/gin-apiserver/pkg/util/trap.go:16 +0x34
    8. created by github.com/duyanghao/gin-apiserver/pkg/util.SetupSigusr1Trap
    9. /root/go/src/github.com/duyanghao/gin-apiserver/pkg/util/trap.go:14 +0xab
    10. goroutine 1 [IO wait]:
    11. internal/poll.runtime_pollWait(0x7fccf3b86f68, 0x72, 0x0)
    12. /usr/local/go/src/runtime/netpoll.go:182 +0x56
    13. internal/poll.(*pollDesc).wait(0xc000442618, 0x72, 0x0, 0x0, 0xbadadd)
    14. /usr/local/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b
    15. internal/poll.(*pollDesc).waitRead(...)
    16. /usr/local/go/src/internal/poll/fd_poll_runtime.go:92
    17. internal/poll.(*FD).Accept(0xc000442600, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
    18. /usr/local/go/src/internal/poll/fd_unix.go:384 +0x1ba
    19. net.(*netFD).accept(0xc000442600, 0xb51080, 0x50, 0xc0000a77c0)
    20. /usr/local/go/src/net/fd_unix.go:238 +0x42
    21. net.(*TCPListener).accept(0xc00049e110, 0xc000046a80, 0x7fccf3be26d0, 0xc000000180)
    22. /usr/local/go/src/net/tcpsock_posix.go:139 +0x32
    23. net.(*TCPListener).AcceptTCP(0xc00049e110, 0x40d9b8, 0x30, 0xb51080)
    24. /usr/local/go/src/net/tcpsock.go:247 +0x48
    25. net/http.tcpKeepAliveListener.Accept(0xc00049e110, 0xb51080, 0xc0002d0e70, 0xadef20, 0x2294c70)
    26. /usr/local/go/src/net/http/server.go:3264 +0x2f
    27. net/http.(*Server).Serve(0xc0002d7d40, 0xcb8640, 0xc00049e110, 0x0, 0x0)
    28. /usr/local/go/src/net/http/server.go:2859 +0x22d
    29. net/http.(*Server).ListenAndServe(0xc0002d7d40, 0xc0002d7d40, 0xc000355ea8)
    30. /usr/local/go/src/net/http/server.go:2797 +0xe4
    31. net/http.ListenAndServe(...)
    32. /usr/local/go/src/net/http/server.go:3037
    33. github.com/gin-gonic/gin.(*Engine).Run(0xc000394000, 0xc000355f48, 0x1, 0x1, 0x0, 0x0)
    34. /root/go/src/github.com/duyanghao/gin-apiserver/vendor/github.com/gin-gonic/gin/gin.go:294 +0x140
    35. main.main()
    36. /root/go/src/github.com/duyanghao/gin-apiserver/cmd/main.go:22 +0x2c4
    37. goroutine 19 [syscall]:
    38. os/signal.signal_recv(0xcb28a0)
    39. /usr/local/go/src/runtime/sigqueue.go:139 +0x9c
    40. os/signal.loop()
    41. /usr/local/go/src/os/signal/signal_unix.go:23 +0x22
    42. created by os/signal.init.0
    43. /usr/local/go/src/os/signal/signal_unix.go:29 +0x41
    44. === END goroutine stack dump ===

Framework

gin-apiserver框架的核心就是pkg包,下面主要针对该包结构进行描述:

  1. pkg/
  2. ├── config
  3. ├── config.go
  4. ├── key.go
  5. ├── model.go
  6. └── opt_defs.go
  7. ├── controller
  8. ├── ping.go
  9. ├── todo.go
  10. └── version.go
  11. ├── log
  12. └── log.go
  13. ├── middleware
  14. ├── basic_auth_middleware.go
  15. ├── models
  16. └── common.go
  17. ├── route
  18. └── routes.go
  19. ├── service
  20. └── todo.go
  21. ├── store
  22. └── util
  • config:主要用于配置文件,实现:文件+环境变量+命令行参数读取
  • controller: 对应MVC中controller,调用service中的接口进行实际处理,自己只做数据校验与拼接
  • service: 负责主要的逻辑实现
  • log: 日志模块,实现:模块名(文件名)+函数名+行数+日志级别
  • middleware: 中间件,负责通用的处理,例如:鉴权
  • models: 对应MVC中的model
  • route: gin路由
  • store: 存储模块,可以添加MySQL、Redis等
  • util: 通用的库函数

Usage

  • step1 - 替换项目名称

    实际使用中,通常需要将gin-apiserver替换成业务需要的后台server名称,可以执行如下命令:

    1. $ grep -rl gin-apiserver . | xargs sed -i 's/gin-apiserver/youapiserver/g'
  • step2 - 开发业务controller和service

    框架中已经集成了一个示例(todo):

    1. // controller(pkg/controller/todo.go)
    2. type ToDoController interface {
    3. GetToDo(c *gin.Context)
    4. }
    5. // service(pkg/service/todo.go)
    6. type ToDoService interface {
    7. Get()
    8. }

    我们需要按照自身业务需求开发todo(替换成任意功能)的controller和service逻辑。另外你也可以参考todo添加其它功能对应的controller和service

  • step3 - 启动服务

    可以直接启动运行服务,如下:

    1. $ bash hack/start.sh

    也可以在Kubernetes集群中启动服务,如下:

    1. # generated image
    2. $ make dockerfiles.build
    3. # retag and push to your docker registry
    4. $ docker tag duyanghao/gin-apiserver:v0.1.0 xxx/duyanghao/gin-apiserver:v0.1.0
    5. $ docker push xxx/duyanghao/gin-apiserver:v0.1.0
    6. # Update the deployment to use the built image name
    7. $ sed -i 's|REPLACE_IMAGE|xxx/duyanghao/gin-apiserver:v0.1.0|g' hack/deploy/deployment.yaml
    8. # create service
    9. $ kubectl apply -f hack/deploy/service.yaml
    10. # create deployment
    11. $ kubectl apply -f hack/deploy/deployment.yaml

3rd party Implements

Refs