我正在使用以下结构在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如何通过此设置同时实现许多请求的并发性?
对于每个请求,将使用处理程序或数据库的相同对象吗?
帮助澄清这种设计?
答案 0 :(得分:1)
并发在路由器内部发生 - 它将为每个使用处理程序的消息启动一个单独的goroutine。存储库实例将被共享,因此不要在其中放置任何非并发安全的代码。
答案 1 :(得分:1)
net / http服务器自动为每个客户端连接启动一个新的goroutine,并在这些goroutine中执行请求处理程序。应用程序不需要做任何特殊的事情来同时处理请求。
单个mux,controller和db值用于所有请求,可能同时使用。
如果这些值不是线程安全的,请使用mutex来保护这些值。多路复用器(假设您正在使用gorilla / mux)和控制器(如当前编写的)都是线程安全的。这些值不需要互斥锁。我不知道daos
包是什么,所以我不能评论使用互斥锁来保护db值的必要性。