gpt4 book ai didi

Golang rest api并发

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:15 26 4
gpt4 key购买 nike

我正在用以下结构在 golang 中编写 rest 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 对象的一个​​实例。 (还会做另一个服务接口(interface))

golang 如何使用此设置实现并发以同时处理多个请求?

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

帮助阐明这个设计?

最佳答案

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

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

使用 mutex如果它们不是线程安全的,则保护这些值。 mux(假设您使用的是 gorilla/mux)和 Controller (如当前编写的那样)都是线程安全的。这些值不需要互斥量。我不知道 daos 包是什么,所以我无法评论使用互斥锁来保护 db 值的必要性。

关于Golang rest api并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49975616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com