golang 并发的http服务器

首先,我使用了github.com/ant0ine/go-json-rest/rest 这个包

直接贴代码

func Start(){

    NeptuneLog := logs.New()
    api := rest.NewApi()
    api.Use(rest.DefaultDevStack...)
    router, err := rest.MakeRouter(
            rest.Get("/:type/:action", handle),
            rest.Post("/:type/:action", handle),
    )
    if err != nil {
            NeptuneLog.Fatal(err)
    }
    api.SetApp(router)
    NeptuneLog.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))

}

=================start 负责调用 handle ====================

func handle (w rest.ResponseWriter, r *rest.Request) {

    NeptuneLog := logs.New()
    t  := r.PathParam("type")
    if (t == "submit") {
            action := r.PathParam("action")
            submitNode := SubmitNode{R:r,W:w,Action:action}
            SubmitChan <- submitNode
            NeptuneLog.Printf("%v",w)
            //node := test11{Action:action}
            //w.WriteJson(node)
    } else if t  =="browser" {
            action := r.PathParam("action")
            browserNode := BrowserNode{R:r,W:w,Action:action}
            BrowserChan <- browserNode
    } else  {
            //w.WriteJson("not found")
    }

}

============= handle 负责把request 和 response 放到结构体,然后放到channel ============

func doSubmit () {

    NeptuneLog := logs.New()
    for item := range  SubmitChan{
            NeptuneLog.Println("111")
            node := test11{Action:item.Action}
            NeptuneLog.Printf("%v",node)
            NeptuneLog.Printf("%v",item.W)
            item.W.WriteJson(node)
            NeptuneLog.Printf("%v",item.W)
    }

}

=========== dosubmit 真正干活,负责从channel拿东西,然后返回 ======

调用之后,server打印出了

http: multiple response.WriteHeader calls

的错误

==========更新下最新进展 ========

我把打印的返回拿出来的

发现有Conn.Write wrote more than the declared Content-Length 这个错误

=======更新下进展 =========

我测试了下,我在doSubmit里面sleep 10 ,然后看结果,结果请求很快返回了,说明在我复制response之后,这个访问就结束了,这样也能解释为什么会出现以上的错误

那么新的问题就是,如果实现一个高并发的服务器

阅读 12.9k
1 个回答

handle在把消息扔到channel后就退出了,responseWrite这个变量会跟着被销毁,所以doSubmit对responseWrite的写入会失败。
在MakeRouter的时候直接把路由绑定到对应的处理函数即可,不需要经过handle做消息传递,ant0ine的rest包在底层应该是实现了每接收到一个请求就创建一个线程的逻辑。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题