doujing8435 2018-04-23 07:32
浏览 77

Golang Rest API并发

I am writing the rest api in golang with the following structure

Handler classes:

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 classes

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(){
}

main class

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)
}

Question:

We are creating only one instance of Handler and Repository objects. (will make another service interface also)

How golang achieve concurrency with this setup for simultaneous many request ?

For every request the same object of handler or db will be used ?

Help to clarify this design ?

  • 写回答

2条回答 默认 最新

  • dongliang1996 2018-04-23 07:51
    关注

    The concurrency happens inside the router - it will start a separate goroutine for each messaged received that uses the handler. Repository instances will be shared so don't put any code in there that isn't concurrency safe.

    评论

报告相同问题?