所有应用程序应具有的基本Web调整

时间:2016-04-23 21:04:39

标签: go

目前,我的网络应用只是路由器和处理程序。

为了让这部作品值得,我缺少哪些重要的东西?

  1. 我认为我必须设置过程的数量以确保它使用最大的goroutines?

  2. 我应该使用输出缓冲吗?

  3. 你认为缺少哪一种最佳做法?

    var (
      templates = template.Must(template.ParseFiles("templates/home.html")
    )
    
    func main() {
      r := mux.NewRouter()
      r.HandleFunc("/", WelcomeHandler)
    
      http.ListenAndServe(":9000", r)
    }
    
    func WelcomeHandler(w http.ResponseWriter, r *http.Request) {
        homePage, err := api.LoadHomePage()
        if err != nil {
        }
        tmpl := "home"
        renderTemplate(w, tmpl, homePage)
    }
    
    func renderTemplate(w http.ResponseWriter, tmpl string, hp *HomePage) {
    
        err := templates.ExecuteTemplate(w, tmpl+".html", hp)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
    }
    

2 个答案:

答案 0 :(得分:1)

  1. 您不需要设置/更改runtime.GOMAXPROCS(),因为自Go 1.5以来它默认为可用的CPU核心数。

  2. 缓冲输出?从性能的角度来看,您并不需要。但您可能还有其他考虑因素。

  3. 例如,您的renderTemplate()功能可能会出现恐慌。如果执行模板开始写入输出,则涉及在写入数据之前设置HTTP响应代码和其他标头。如果之后发生模板执行错误,它将返回错误,因此您的代码会尝试发回错误响应。此时已经编写了HTTP标头,此http.Error()函数将尝试再次设置标头=>恐慌。

    避免这种情况的一种方法是首先将模板渲染到缓冲区(例如bytes.Buffer),如果模板执行没有返回错误,则可以将缓冲区的内容写入响应编写器。如果发生错误,那么您当然不会写入缓冲区的内容,但会像您一样发回错误响应。

    总而言之,您的代码在性能方面是生产就绪的(不包括处理模板执行错误的方式)。

答案 1 :(得分:0)

  1. WelcomeHandler应在err != nil为真时返回。
  2. 记录错误,以帮助调查。
  3. templates = template.Must(template.ParseFiles("templates/home.html")放入init。将其拆分为单独的行。如果template.ParseFiles返回错误,则生成Fatal日志。如果你有多个模板要初始化,那么在goroutines中用一个共同的WaitGroup初始化它们,以加快启动速度。
  4. 由于您使用的是mux, HTTP Server is too clean with its URLs 也可能很有用。
  5. 您可能还想重新考虑让用户知道他们为何获得http.StatusInternalServerError回复的决定。
  6. 设置GOMAXPROCS> 1如果你有更多的核心肯定是一个好主意,但我会保持它少于可用的核心数。