Golang rest api并发

时间:2018-04-23 07:32:06

标签: go concurrency gorilla

我正在使用以下结构在golang中编写其余的api

处理程序类:

type Controller struct {
    db daos.IUserDB
}

func NewController(db daos.IUserDB) *Controller{
    return &Controller{db:db}
}


func (c *Controller) Test(w http.ResponseWriter, r *http.Request)  {

    fmt.Fprintf(w, "Welcome to the HomePage!")
}

func (c *Controller) RegisterRoutes(r *mux.Router){
    r.HandleFunc("/test", c.Test).Methods("GET")
}

DAO课程

type IUserDB interface {
    Get
    GetByID ... 
}


type userDAO struct {
    db *sql.DB
}


func NewDB(dataSourceName string) (*userDAO, error) {
    db, err := sql.Open("mysql", dataSourceName)
    if err != nil {
        return nil, err
    }
    if err = db.Ping(); err != nil {
        return nil, err
    }
    return &userDAO{db}, nil
}

func (dao *userDAO) Get(){
}

func (dao *userDAO) GetByID(){
}

主要班级

func main() {

    db, err := daos.NewDB(connectionStr)
    if err != nil {
        log.Panic(errr)
    }
    handler := handlers.NewController(db)

    router := mux.NewRouter()
    handler.RegisterRoutes(router)

    log.Printf("serving on port 8080")
    http.ListenAndServe(":3000", router)
}

问题:

我们只创建一个Handler和Repository 对象的实例。 (也会制作另一个服务界面)

Golang如何通过此设置同时实现许多请求的并发性?

对于每个请求,将使用处理程序或数据库的相同对象吗?

帮助澄清这种设计?

2 个答案:

答案 0 :(得分:1)

并发在路由器内部发生 - 它将为每个使用处理程序的消息启动一个单独的goroutine。存储库实例将被共享,因此不要在其中放置任何非并发安全的代码。

答案 1 :(得分:1)

net / http服务器自动为每个客户端连接启动一个新的goroutine,并在这些goroutine中执行请求处理程序。应用程序不需要做任何特殊的事情来同时处理请求。

单个mux,controller和db值用于所有请求,可能同时使用。

如果这些值不是线程安全的,请使用mutex来保护这些值。多路复用器(假设您正在使用gorilla / mux)和控制器(如当前编写的)都是线程安全的。这些值不需要互斥锁。我不知道daos包是什么,所以我不能评论使用互斥锁来保护db值的必要性。