婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go語言的http/2服務器功能及客戶端使用

Go語言的http/2服務器功能及客戶端使用

熱門標簽:惠州電銷防封電話卡 鄭州亮點科技用的什么外呼系統 釘釘有地圖標注功能嗎 黃岡人工智能電銷機器人哪個好 建造者2地圖標注 阿里云ai電話機器人 濱州自動電銷機器人排名 汕頭小型外呼系統 浙江高頻外呼系統多少錢一個月

前言

大家都知道,Go的標準庫HTTP服務器默認支持HTTP/2。那么,在這篇文章中,我們將首先展示Go的http/2服務器功能,并解釋如何將它們作為客戶端使用。

在這篇文章中,我們將首先展示Go的http/2服務器功能,并解釋如何將它們作為客戶端使用。Go的標準庫HTTP服務器默認支持HTTP/2。

下面話不多說了,來一起看看詳細的介紹吧

HTTP/2 服務器

首先,讓我們在Go中創建一個http/2服務器!根據http/2文檔,所有東西都是為我們自動配置的,我們甚至不需要導入Go的標準庫http2包:

HTTP/2強制使用TLS。為了實現這一點,我們首先需要一個私鑰和一個證書。在Linux上,下面的命令執行這個任務。

openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt

該命令將生成兩個文件:server.key 以及 server.crt

現在,對于服務器代碼,以最簡單的形式,我們將使用Go的標準庫HTTP服務器,并啟用TLS與生成的SSL文件。

package main

import (
 "log"
 "net/http"
)
 
func main() {
 // 在 8000 端口啟動服務器
 // 確切地說,如何運行HTTP/1.1服務器。

 srv := http.Server{Addr:":8000", Handler: http.HandlerFunc(handle)}
 // 用TLS啟動服務器,因為我們運行的是http/2,它必須是與TLS一起運行。
 // 確切地說,如何使用TLS連接運行HTTP/1.1服務器。
 log.Printf("Serving on https://0.0.0.0:8000")
 log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key"))
}

func handle(w http.ResponseWriter, r *http.Request) {
 // 記錄請求協議
 log.Printf("Got connection: %s", r.Proto)
 // 向客戶發送一條消息
 w.Write([]byte("Hello"))
}

HTTP/2 客戶端

在go中,標準 http.Client 也用于http/2請求。惟一的區別是在客戶端的Transport字段,使用 http2.Transport 代替 http.Transport。

我們生成的服務器證書是“自簽名”的,這意味著它不是由一個已知的證書頒發機構(CA)簽署的。這將導致我們的客戶端不相信它:

package main

import (
 "fmt"
 "net/http"
)

const url = "https://localhost:8000"

func main() {
 _, err := http.Get(url)
 fmt.Println(err)
}

讓我們試著運行它:

$ go run h2-client.go 
Get https://localhost:8000: x509: certificate signed by unknown authority

在服務器日志中,我們還將看到客戶端(遠程)有一個錯誤:

http: TLS handshake error from [::1]:58228: remote error: tls: bad certificate

為了解決這個問題,我們可以用定制的TLS配置去配置我們的客戶端。我們將把服務器證書文件添加到客戶端“證書池”中,因為我們信任它,即使它不是由已知CA簽名的。

我們還將添加一個選項,根據命令行標志在HTTP/1.1和HTTP/2傳輸之間進行選擇。

package main

import (
 "crypto/tls"
 "crypto/x509"
 "flag"
 "fmt"
 "io/ioutil"
 "log"
 "net/http"
 "golang.org/x/net/http2"
)
 
const url = "https://localhost:8000"

var httpVersion = flag.Int("version", 2, "HTTP version")

func main() {
 flag.Parse()
 client := http.Client{}
 // Create a pool with the server certificate since it is not signed
 // by a known CA
 caCert, err := ioutil.ReadFile("server.crt")
 if err != nil {
 log.Fatalf("Reading server certificate: %s", err)
 }
 caCertPool := x509.NewCertPool()
 caCertPool.AppendCertsFromPEM(caCert)
 // Create TLS configuration with the certificate of the server
 tlsConfig := tls.Config{
 RootCAs: caCertPool,
 }

 // Use the proper transport in the client
 switch *httpVersion {
 case 1:
 client.Transport = http.Transport{
 TLSClientConfig: tlsConfig,
 }
 case 2:
 client.Transport = http2.Transport{
 TLSClientConfig: tlsConfig,
 }
 }
 // Perform the request
 resp, err := client.Get(url)

 if err != nil {
 log.Fatalf("Failed get: %s", err)
 }
 defer resp.Body.Close()
 body, err := ioutil.ReadAll(resp.Body)
 if err != nil {
 log.Fatalf("Failed reading response body: %s", err)
 }
 fmt.Printf(
 "Got response %d: %s %s\n",
 resp.StatusCode, resp.Proto, string(body)
 )
}

這一次我們得到了正確的回應:

$ go run h2-client.go 
Got response 200: HTTP/2.0 Hello

在服務器日志中,我們將看到正確的日志線:獲得連接:Got connection: HTTP/2.0!!
但是當我們嘗試使用HTTP/1.1傳輸時,會發生什么呢?

$ go run h2-client.go -version 1
Got response 200: HTTP/1.1 Hello

我們的服務器對HTTP/2沒有任何特定的東西,所以它支持HTTP/1.1連接。這對于向后兼容性很重要。此外,服務器日志表明連接是HTTP/1.1:Got connection: HTTP/1.1。

HTTP/2 高級特性

我們創建了一個HTTP/2客戶機-服務器連接,并且我們正在享受安全有效的連接帶來的好處。但是HTTP/2提供了更多的特性,讓我們來研究它們!

服務器推送

HTTP/2允許服務器推送“使用給定的目標構造一個合成請求”。
這可以很容易地在服務器處理程序中實現(在github上的視圖):

func handle(w http.ResponseWriter, r *http.Request) {
 // Log the request protocol
 log.Printf("Got connection: %s", r.Proto)
 // Handle 2nd request, must be before push to prevent recursive calls.
 // Don't worry - Go protect us from recursive push by panicking.
 if r.URL.Path == "/2nd" {
 log.Println("Handling 2nd")
 w.Write([]byte("Hello Again!"))
 return
 }

 // Handle 1st request
 log.Println("Handling 1st")
 // Server push must be before response body is being written.
 // In order to check if the connection supports push, we should use
 // a type-assertion on the response writer.
 // If the connection does not support server push, or that the push
 // fails we just ignore it - server pushes are only here to improve
 // the performance for HTTP/2 clients.
 pusher, ok := w.(http.Pusher)

 if !ok {
 log.Println("Can't push to client")
 } else {
 err := pusher.Push("/2nd", nil)
  if err != nil {
 log.Printf("Failed push: %v", err)
 }
 }
 // Send response body
 w.Write([]byte("Hello"))
}

使用服務器推送

讓我們重新運行服務器,并測試客戶機。

對于HTTP / 1.1客戶端:

$ go run ./h2-client.go -version 1
Got response 200: HTTP/1.1 Hello

服務器日志將顯示:

Got connection: HTTP/1.1Handling 1st
Can't push to client

HTTP/1.1客戶端傳輸連接產生一個 http.ResponseWriter 沒有實現http.Pusher,這是有道理的。在我們的服務器代碼中,我們可以選擇在這種客戶機的情況下該做什么。

對于HTTP/2客戶:

go run ./h2-client.go -version 2
Got response 200: HTTP/2.0 Hello

服務器日志將顯示:

Got connection: HTTP/2.0Handling 1st
Failed push: feature not supported

這很奇怪。我們的HTTP/2傳輸的客戶端只得到了第一個“Hello”響應。日志表明連接實現了 http.Pusher 接口——但是一旦我們實際調用 Push() 函數——它就失敗了。

排查發現,HTTP/2客戶端傳輸設置了一個HTTP/2設置標志,表明推送是禁用的。

因此,目前沒有選擇使用Go客戶機來使用服務器推送。

作為一個附帶說明,google chrome作為一個客戶端可以處理服務器推送。

服務器日志將顯示我們所期望的,處理程序被調用兩次,路徑 / 和 /2nd,即使客戶實際上只對路徑 /:

Got connection: HTTP/2.0Handling 1st
Got connection: HTTP/2.0Handling 2nd

全雙工通信

Go HTTP/2演示頁面有一個echo示例,它演示了服務器和客戶機之間的全雙工通信。

讓我們先用CURL來測試一下:

$ curl -i -XPUT --http2 https://http2.golang.org/ECHO -d hello
HTTP/2 200 
content-type: text/plain; charset=utf-8
date: Tue, 24 Jul 2018 12:20:56 GMT

HELLO 

我們把curl配置為使用HTTP/2,并將一個PUT/ECHO發送給“hello”作為主體。服務器以“HELLO”作為主體返回一個HTTP/2 200響應。但我們在這里沒有做任何復雜的事情,它看起來像是一個老式的HTTP/1.1半雙工通信,有不同的頭部。讓我們深入研究這個問題,并研究如何使用HTTP/2全雙工功能。

服務器實現

下面是HTTP echo處理程序的簡化版本(不使用響應)。它使用 http.Flusher 接口,HTTP/2添加到http.ResponseWriter。

type flushWriter struct {
 w io.Writer
}

func (fw flushWriter) Write(p []byte) (n int, err error) {
 n, err = fw.w.Write(p)
 // Flush - send the buffered written data to the client
 if f, ok := fw.w.(http.Flusher); ok {
 f.Flush()
 }
  return
}

func echoCapitalHandler(w http.ResponseWriter, r *http.Request) {
 // First flash response headers
 if f, ok := w.(http.Flusher); ok {
 f.Flush()
 }
 // Copy from the request body to the response writer and flush
 // (send to client)
 io.Copy(flushWriter{w: w}, r.Body)
}

服務器將從請求正文讀取器復制到寫入ResponseWriter和 Flush() 的“沖洗寫入器”。同樣,我們看到了笨拙的類型斷言樣式實現,沖洗操作將緩沖的數據發送給客戶機。

請注意,這是全雙工,服務器讀取一行,并在一個HTTP處理程序調用中重復寫入一行。

GO客戶端實現

我試圖弄清楚一個啟用了HTTP/2的go客戶端如何使用這個端點,并發現了這個Github問題。提出了類似于下面的代碼。

const url = "https://http2.golang.org/ECHO"

func main() {
  // Create a pipe - an object that implements `io.Reader` and `io.Writer`. 
  // Whatever is written to the writer part will be read by the reader part.

  pr, pw := io.Pipe() 
  // Create an `http.Request` and set its body as the reader part of the
  // pipe - after sending the request, whatever will be written to the pipe,
  // will be sent as the request body.  // This makes the request content dynamic, so we don't need to define it
  // before sending the request.
 req, err := http.NewRequest(http.MethodPut, url, ioutil.NopCloser(pr))

 if err != nil {
 log.Fatal(err)
 }
 
  // Send the request
 resp, err := http.DefaultClient.Do(req) if err != nil {
   log.Fatal(err)
   }
 log.Printf("Got: %d", resp.StatusCode) 
 // Run a loop which writes every second to the writer part of the pipe
 // the current time.
 go func() { for { 
 time.Sleep(1 * time.Second)
 fmt.Fprintf(pw, "It is now %v\n", time.Now())
 }
 }() 

  // Copy the server's response to stdout.
 _, err = io.Copy(os.Stdout, res.Body)

 log.Fatal(err)
}

總結

Go支持與服務器推送和全雙工通信的HTTP/2連接,這也支持HTTP/1.1與標準庫的標準TLS服務器的連接——這太不可思議了。對于標準的庫HTTP客戶端,它不支持服務器推送,但是支持標準庫的標準HTTP的全雙工通信。以上就是本篇的內容,大家有什么疑問可以在文章下面留言溝通。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go 實現熱重啟的詳細介紹
  • 詳解如何熱重啟golang服務器
  • 在Go中構建并發TCP服務器
  • 解析Go 標準庫 http.FileServer 實現靜態文件服務
  • MongoDB4.0在windows10下的安裝與服務配置教程詳解
  • goland服務熱重啟的配置文件

標簽:阿壩 昭通 瀘州 滄州 東營 駐馬店 泰安 晉中

巨人網絡通訊聲明:本文標題《Go語言的http/2服務器功能及客戶端使用》,本文關鍵詞  語言,的,http,服務器,功,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言的http/2服務器功能及客戶端使用》相關的同類信息!
  • 本頁收集關于Go語言的http/2服務器功能及客戶端使用的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国内成人自拍视频| 久久久精品天堂| 不卡视频一二三| 国产成人精品在线看| 国产成人免费视频一区| 国产一区二区三区久久久 | 日韩精品一区在线观看| 欧美三级电影精品| 91超碰这里只有精品国产| 欧美一区二区视频在线观看| 51久久夜色精品国产麻豆| 欧美日本在线播放| 日韩精品中文字幕一区二区三区| 欧美色精品天天在线观看视频| 欧美视频完全免费看| 69av一区二区三区| 久久久久久亚洲综合影院红桃| 国产欧美一区二区精品忘忧草| 国产精品系列在线| 中文字幕一区二| 同产精品九九九| 国产毛片精品视频| 91视频免费播放| 欧美一区二区日韩一区二区| 久久亚洲精华国产精华液| 中文字幕av不卡| 日韩成人免费在线| 国产成人免费视频| 欧美日韩一级片在线观看| 精品欧美一区二区三区精品久久| 国产三级久久久| 亚洲国产一区在线观看| 国产一区福利在线| 欧美三级日本三级少妇99| 欧美xfplay| 亚洲国产视频网站| 成人午夜激情在线| 91精品国产91久久综合桃花| 国产精品国产馆在线真实露脸| 日日夜夜精品视频免费| 成人中文字幕合集| 日韩一区二区三区视频在线| 国产精品对白交换视频| 国产成人免费在线| 欧美性受xxxx| 中文字幕亚洲在| 国产精品资源站在线| 欧美日韩视频一区二区| 国产精品久线在线观看| 久久爱另类一区二区小说| 色视频成人在线观看免| 久久精品人人爽人人爽| 日本一道高清亚洲日美韩| 色悠悠久久综合| 久久精品视频一区| 久88久久88久久久| 在线电影国产精品| 一区二区三区四区激情| 成人国产精品免费网站| 久久色中文字幕| 狠狠色综合日日| 日韩欧美在线1卡| 日产国产高清一区二区三区 | 欧美福利视频导航| 一区二区三区波多野结衣在线观看| 国产**成人网毛片九色| 精品99久久久久久| 日韩高清一区在线| 日本韩国欧美国产| 亚洲日本一区二区三区| 国产成人激情av| 国产女人aaa级久久久级| 国产一区二区三区精品视频| 久久综合九色综合久久久精品综合| 日韩极品在线观看| 这里只有精品免费| 免费高清视频精品| 精品电影一区二区| 成人丝袜高跟foot| 中文字幕一区二| 91福利视频网站| 亚洲成av人综合在线观看| 欧美精品免费视频| 奇米精品一区二区三区在线观看| 日韩免费福利电影在线观看| 美女精品自拍一二三四| 精品区一区二区| 成人精品视频网站| 亚洲美女在线一区| 欧美在线免费视屏| 免费观看一级欧美片| 日韩视频一区二区在线观看| 狠狠色丁香九九婷婷综合五月| 久久九九国产精品| 欧洲一区在线电影| 久久9热精品视频| 国产精品女同一区二区三区| 色婷婷av一区二区三区之一色屋| 亚洲第一av色| 久久久综合视频| 色综合久久天天| 免费欧美在线视频| 中文字幕一区二区三区四区不卡| 欧美性一二三区| 国产美女一区二区| 亚洲成人福利片| 国产欧美日韩综合精品一区二区| 一本色道久久综合狠狠躁的推荐| 免费视频最近日韩| 中文字幕制服丝袜一区二区三区 | 精品一区二区三区在线播放视频 | 天天综合网 天天综合色| 欧美成人高清电影在线| 91视频在线观看免费| 韩国欧美一区二区| 亚洲已满18点击进入久久| 久久天天做天天爱综合色| 欧美日精品一区视频| bt7086福利一区国产| 免费人成精品欧美精品| 亚洲卡通欧美制服中文| 久久久久久久网| 欧美疯狂做受xxxx富婆| 99综合电影在线视频| 日本怡春院一区二区| 亚洲美腿欧美偷拍| 中文字幕第一区综合| 日韩三级免费观看| 欧美色视频一区| 麻豆精品视频在线观看| 亚洲欧美一区二区三区国产精品| 欧美不卡视频一区| 欧美日韩另类一区| 色哟哟一区二区| 成人av综合一区| 国产综合久久久久久鬼色| 麻豆精品视频在线观看视频| 天使萌一区二区三区免费观看| 亚洲精品国产精华液| 综合激情网...| 亚洲特黄一级片| 亚洲欧洲日韩一区二区三区| 久久综合中文字幕| 日韩写真欧美这视频| 在线观看亚洲一区| 91九色02白丝porn| 91高清视频在线| 欧美视频在线一区二区三区 | 日本中文在线一区| 视频在线观看一区| 男女性色大片免费观看一区二区 | 久久久亚洲精品石原莉奈| 日韩亚洲欧美成人一区| 精品理论电影在线| 久久综合狠狠综合久久激情| 久久综合九色综合97_久久久| 久久女同性恋中文字幕| 久久久久青草大香线综合精品| 久久久不卡网国产精品二区| 国产女主播视频一区二区| 国产精品国产精品国产专区不片 | 日韩视频免费观看高清完整版| 日韩免费观看高清完整版在线观看| 精品乱人伦一区二区三区| 精品欧美乱码久久久久久1区2区| 久久久久9999亚洲精品| 亚洲国产精品传媒在线观看| 国产精品久久久久四虎| 亚洲午夜久久久久久久久电影院| 亚洲一线二线三线视频| 日本少妇一区二区| 国产精品911| 色拍拍在线精品视频8848| 欧美精品日韩一本| 国产性色一区二区| 亚洲激情图片小说视频| 日本麻豆一区二区三区视频| 韩国女主播成人在线观看| 99久久免费国产| 欧美一级精品大片| 中文字幕一区二区三区乱码在线| 污片在线观看一区二区| 丰满少妇在线播放bd日韩电影| 在线观看av一区| 国产欧美日韩精品一区| 亚洲福利视频导航| 国产成人av电影在线播放| 91国产免费观看| 日本一区二区三区视频视频| 亚洲成人av在线电影| 国产乱子轮精品视频| 欧美日韩国产美| 中日韩av电影| 日韩精品视频网| 91免费在线看| 日韩欧美的一区二区| 亚洲男人的天堂在线观看| 毛片av一区二区| 欧美日韩亚洲综合一区二区三区| 国产日韩三级在线|