【问题标题】:Golang rest api concurrencyGolang REST API 并发
【发布时间】:2018-04-24 00:59:59
【问题描述】:

我正在用 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 如何通过此设置实现并发多个请求?

对于每个请求,将使用相同的 handler 或 db 对象?

帮助澄清这个设计?

【问题讨论】:

    标签: go concurrency gorilla


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @Cerise ... true :)
      • 也是正确的..但你现在只是毫无意义的迂腐。它实际上并没有改变并发发生在服务器内的事实,并且将同时调用发问者处理函数。您希望我如何编辑答案以使您满意?完整的调用堆栈?
      • 谢谢,我明白了,是的,关心小细节:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 2018-05-21
      • 1970-01-01
      相关资源
      最近更新 更多