草庐IT

Golang rest api并发

coder 2024-07-05 原文

我正在用以下结构在 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/

有关Golang rest api并发的更多相关文章

  1. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  2. Ruby 并发/异步处理(简单用例) - 2

    我一直在研究ruby​​的并行/异步处理能力,并阅读了许多文章和博客文章。我查看了EventMachine、Fibers、Revactor、Reia等。不幸的是,我无法为这个非常简单的用例找到简单、有效(且非IO阻塞)的解决方案:File.open('somelogfile.txt')do|file|whileline=file.gets#(R)ReadfromIOline=process_line(line)#(P)Processthelinewrite_to_db(line)#(W)WritetheoutputtosomeIO(DBorfile)endend你看到了吗,我的小脚本正

  3. ruby-on-rails - 乘客并发连接错误 - 2

    我有生产服务器(Nginx+Passenger)。当我尝试从另一台计算机ab-n3-c3myhost.ru/时,我在我的nginxerror.log中收到此错误日志:[pid=21160thr=139775297914624file=ext/nginx/HelperAgent.cpp:584time=2011-08-3115:25:49.22]:UncaughtexceptioninPassengerServerclientthread:exception:Cannotreadresponsefrombackendprocess:Connectionresetbypeer(104)ba

  4. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

  5. ruby - 并发::Promise.all?不起作用 - 2

    在执行所有promise后,我正在尝试进行一些计算。但是proc从不调用:cbr_promise=Concurrent::Promise.execute{CbrRatesService.call}bitfinex_promise=Concurrent::Promise.execute{BitfinexService.call}proc=Proc.newdoputs10endConcurrent::Promise.all?([cbr_promise,bitfinex_promise]).then{proc}使用concurrent-ruby制作gem。例如,我是否应该创建一个每100毫秒

  6. ruby - 处理并发 ruby​​ 线程池中的异常 - 2

    如何处理并发ruby​​线程池中的异常(http://ruby-concurrency.github.io/concurrent-ruby/file.thread_pools.html)?例子:pool=Concurrent::FixedThreadPool.new(5)pool.postdoraise'somethinggoeswrong'end#howtorescuethisexceptionhere更新:这是我的代码的简化版本:defprocesspool=Concurrent::FixedThreadPool.new(5)products.eachdo|product|new_

  7. ruby - 如何限制同一 Ruby 脚本的并发实例? - 2

    在Ruby1.9.x中,不允许我的Ruby脚本再次运行或等待前一个实例完成的简单方法是什么?**我希望避免困惑的文件锁定或进程表检查。有没有类似globalmutex的东西或信号量已经在核心?我研究了原生Mutex但这似乎只适用于一个Ruby进程内的线程,而不适用于不同进程。**稍后我可能会添加超时功能,或者限制为N个实例,或者希望使用多个全局锁(每个系统范围的资源一个,最多只能有一个实例)。 最佳答案 这段非常短的代码将卡住在原地,直到/tmp中以您的脚本命名的锁定文件被独占锁定:File.open("/tmp/#{File.ba

  8. ruby - 了解赛璐珞并发 - 2

    以下是我的赛璐珞代码。client1.rb2个客户之一。(我将其命名为客户端1)client2.rb2个客户中的第2个。(命名为客户端2)备注:上述2个客户端之间的唯一区别是传递给服务器的文本。即('client-1'和'client-2'分别)针对以下2个服务器(一次一个)测试这2个客户端(通过并排运行)。我发现非常奇怪的结果。server1.rb(取自celluloid-zmq的README.md的基本示例)将其用作上述2个客户端的示例服务器导致任务的并行执行。输出rubyserver1.rbReceivedat04:59:39PMandmessageisclient-1Going

  9. ruby-on-rails - 什么测试工具/框架可以测试 Rails 应用程序中的并发请求? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion如何在N个并发用户的情况下测试我的Rails应用程序?这些模拟用户会做一些上传/下载文件等操作是否有支持此功能的任何框架或免费工具?

  10. 阿里云———阿里云的初始化配置,并发布java项目 - 2

    下载宝塔XShell连接上阿里云后,下载宝塔面板yuminstall-ywget&&wget-Oinstall.shhttp://download.bt.cn/install/install_6.0.sh&&shinstall.sh下载结束登录宝塔,一键下载服务下载phpadmin,nginx,mysql等服务器(图略了,我直接点击了,忘了截图了,反正登录后宝塔会自动弹出提示下载)安装jdkjdk网盘(linux)链接:https://pan.baidu.com/s/1VVrC6CYaJTBSucXz4sewHw提取码:frlo把jdk复制到目录中:我复制到了/home/jdk访问jdk目录:

随机推荐