当前位置: 首页 > 知识库问答 >
问题:

如何使我的Web服务器用Golang编写,以支持HTTP/2服务器推送?

殳勇
2023-03-14

我的Web Server是用Golang编码的,并且支持HTTPS。我希望利用Web Server中的HTTP/2 Server Push功能。以下链接解释了如何将HTTP Server转换为Support HTTP/2:-https://www.ianlewis.org/en/http2-and-go
但是,不清楚如何在Golang中实现Server Push通知。
-我应该如何添加Server Push功能?
-我如何控制或管理要推送的文档和文件?

共有2个答案

严信瑞
2023-03-14

正如在其他答案中提到的,您可以使用Go 1.8功能(将编写器强制转换为http。推送,然后使用推送方法)。

这附带一个警告:您必须直接从您的服务器提供HTTP2流量。

如果您支持NGINX这样的代理,这可能不起作用。如果您想考虑这种情况,可以使用链接标题来公布要推送的URL。

// In the case of HTTP1.1 we make use of the `Link` header
// to indicate that the client (in our case, NGINX) should
// retrieve a certain URL.
//
// See more at https://www.w3.org/TR/preload/#server-push-http-2.
func handleIndex(w http.ResponseWriter, r *http.Request) {
  var err error

  if *http2 {
    pusher, ok := w.(http.Pusher)
    if ok {
      must(pusher.Push("/image.svg", nil))
    }
  } else {
    // This ends up taking the effect of a server push
    // when interacting directly with NGINX.
    w.Header().Add("Link", 
      "</image.svg>; rel=preload; as=image")
  }

  w.Header().Add("Content-Type", "text/html")
  _, err = w.Write(assets.Index)
  must(err)
}

PS.:我在这里写了更多关于这个的内容https://ops.tips/blog/nginx-http2-server-push/如果你感兴趣的话。

俞学
2023-03-14

Go 1.7及以上版本不支持标准库中的HTTP/2服务器推送。对服务器推送的支持将在即将发布的1.8版本中添加(请参阅发行说明,预计将于2月发布)。

使用Go 1.8您可以使用新的http. Pushers接口,该接口由net/超文本传输协议的默认响应写入器实现。Pushers Push方法返回ErrNotSupport,如果不支持服务器推送(HTTP/1)或不允许(客户端已禁用服务器推送)。

例子:

package main                                                                              

import (
    "io"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/pushed", func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "hello server push")
    })

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if pusher, ok := w.(http.Pusher); ok {
            if err := pusher.Push("/pushed", nil); err != nil {
                log.Println("push failed")
            }
        }

        io.WriteString(w, "hello world")
    })

    http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
}

如果你想使用Go 1.7或更早版本的服务器推送,可以使用golang。org/x/net/http2并直接编写框架。

 类似资料:
  • 创建一个 HTTP 服务器 最简单的方法来创建一个 HTTP 服务器,所有选项使用默认的。如下所示: HttpServer server = vertx.createHttpServer(); 配置 HTTP 服务器 如果你不想使用默认值,创建服务器时可以通过传入一个HttpServerOptions实例配置: HttpServerOptions options = new HttpServerO

  • 我已经读了很多关于HTTP 2(仍在开发中)的东西,所以我也听说了服务器推送功能,但我想,这还不清楚。 此服务器推送功能是否意味着服务器将能够向客户端发送响应,而无需后者发出请求?就像普通的TCP连接一样?还是我没抓住重点?

  • 我正在开发一个基于云的后端HTTP服务,该服务将公开用于与一些on-prem系统的集成。客户机系统是由外部供应商定制的,它们是带有自己数据库的后端系统。这些系统部署在我们客户的公司中,我们无法访问它们,也无法控制它们。我们向供应商提供我们的API规范,他们实现客户机代码。 我的服务与客户交换的数据格式基于XML,并遵循一定的标准。供应商用不同的编程语言实现他们的客户机系统,随着时间的推移,新的供应

  • 问题内容: 我已经在Android中创建了一个网络服务器,该服务器绑定到端口2090,并为Android设备的sdcard服务,如果在Internet Explorer中键入,则可以正常工作,但效果很好,但是当我在其他浏览器中打开它时,它会以文本形式打开HTML文件请帮我。 这是我的代码。 服务器启动器类: jhttp类: RequestProcessor: Logcat: 没有发布,因为没有错误

  • 问题内容: 我正在尝试用golang写一个Web服务器来处理地理编码请求。其中一些请求需要花费一分钟以上的时间来处理。在这种情况下,尽管处理程序一直在运行,但是服务器似乎正在向客户端返回一个空的主体。我尝试了下面的代码无济于事。我想念什么吗?pat这可能是个问题吗? 客户是红宝石。但我不认为这是问题所在,因为如果使用curl,我会看到类似的行为。 问题答案: 找到了问题。我没有提到我的服务器在Am

  • 问题内容: 我使用了getests和gorilla mux,并且可以对我的http handlefunc处理程序进行单元测试,但是它们没有像在大猩猩mux下那样响应正确的http请求方法。如何进行“实时服务器”版本的测试? 这里的问题是该函数同时响应get和post请求,而没有考虑我的主路由器。这对于单元测试功能是很好的,但是我认为最好编写一个集成测试来测试整个事情并一次性解决所有问题。 问题答案