Golang Rest API 并发

Vis*_*h K 2 concurrency go 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")
}
Run Code Online (Sandbox Code Playgroud)

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(){
}
Run Code Online (Sandbox Code Playgroud)

主班

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)
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

golang 如何通过此设置实现并发多个请求的并发性?

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

帮助澄清这个设计吗?

Cer*_*món 5

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

单个多路复用器、控制器和数据库值用于所有请求,并且可能同时使用。

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