国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - WEB服務器 - 教你搭建一個簡單的Go Web服務器

教你搭建一個簡單的Go Web服務器

2019-05-21 12:5151cto服務器之家 WEB服務器

在學習Go語言有一個很好的起點,Go語言官方文檔很詳細,今天我們學習的Go Web服務器的搭建就需要用到Go語言官方提供的標準庫 net/http,通過http包提供了HTTP客戶端和服務端的實現。同時使用這個包能很簡單地對web的路由,靜態文件

今天給大家分享一篇搭建一個GO web服務器,HelloWorld!!

Go語言標準庫 - net/http

在學習Go語言有一個很好的起點,Go語言官方文檔很詳細,今天我們學習的Go Web服務器的搭建就需要用到Go語言官方提供的標準庫 net/http,通過http包提供了HTTP客戶端和服務端的實現。同時使用這個包能很簡單地對web的路由,靜態文件,模版,cookie等數據進行設置和操作。如果對http概念不是太清楚的朋友可以自行google。

教你搭建一個簡單的Go Web服務器

http包建立Web服務器

  1. packagemain 
  2.  
  3. import
  4.  
  5. "fmt" 
  6.  
  7. "net/http" 
  8.  
  9. "strings" 
  10.  
  11. "log" 
  12.  
  13.  
  14. funcsayhelloName(whttp.ResponseWriter,r*http.Request){ 
  15.  
  16. r.ParseForm()//解析參數,默認是不會解析的 
  17.  
  18. fmt.Println(r.Form)//這些信息是輸出到服務器端的打印信息 
  19.  
  20. fmt.Println("path",r.URL.Path) 
  21.  
  22. fmt.Println("scheme",r.URL.Scheme) 
  23.  
  24. fmt.Println(r.Form["url_long"]) 
  25.  
  26. fork,v:=ranger.Form{ 
  27.  
  28. fmt.Println("key:",k) 
  29.  
  30. fmt.Println("val:",strings.Join(v,"")) 
  31.  
  32.  
  33. fmt.Fprintf(w,"HelloWrold!")//這個寫入到w的是輸出到客戶端的 
  34.  
  35.  
  36. funcmain(){ 
  37.  
  38. http.HandleFunc("/",sayhelloName)//設置訪問的路由 
  39.  
  40. err:=http.ListenAndServe(":9090",nil)//設置監聽的端口 
  41.  
  42. iferr!=nil{ 
  43.  
  44. log.Fatal("ListenAndServe:",err) 
  45.  
  46.  

上面的代碼我們在IDE中編譯后并運行成功后,這個時侯我們就可以在9090端口監聽http鏈接請求了。

教你搭建一個簡單的Go Web服務器

上圖中,我們在瀏覽器中輸入了 http://localhost:9090 ,可以看到瀏覽器頁面中輸入出 Hello World!

這個時侯如果我們在瀏覽器地址后面加一些參數試試:http://localhost:9090?url_long=111&url_long=222,看看瀏覽器中輸出什么?服務器端輸出的又是什么?

教你搭建一個簡單的Go Web服務器

瀏覽器中輸出圖片

教你搭建一個簡單的Go Web服務器

服務器端輸出圖片

我們看到了上面的代碼,要編寫一個Web服務器是不是很簡單,只要調用http包的兩個函數就可以了。

如果以前你是.NET程序員,那你也許就會問,我們的IIS服務器不需要嗎?Go就是不需要這些,因為他直接就監聽了TCP端口了。

我們看到Go通過簡單的幾行代碼就已經運行起來一個Web服務了,而且這個Web服務內部有支持高并發的特性。現在Web服務已經搭建完成了,那我們現在來了解一個這個服務是怎么運行起來的呢?

Web工作方式的幾個概念

以下幾個為服務器段的概念

Request:用戶請求的信息,用來解析用戶的請求信息,包括post、get、cookie、url等信息

Response:服務器需要反饋給客戶端的信息

Conn:用戶的每次請求鏈接

Handler:處理請求和生成返回信息的處理邏輯

分析http包運行機制

教你搭建一個簡單的Go Web服務器

Go實現Web服務的工作模式流程圖

這個過程我們需要清楚以下三個問題,則就清楚Go是如何讓Web運行起來了

如何監聽端口?

通過上面的代碼我們看到Go是通過一個函數ListenAndServe來處理這些事情的,這個底層其實這樣處

理的:初始化一個server對象,然后調用了net.Listen("tcp", addr),也就是底層用TCP協議搭建了一個服

務,然后監控我們設置的端口。

Go http包的源碼,這里我們可以看到整個http處理過程

  1. func(srv*Server)Serve(lnet.Listener)error{ 
  2.  
  3. deferl.Close() 
  4.  
  5. vartempDelaytime.Duration//howlongtosleeponacceptfailure 
  6.  
  7. for
  8.  
  9. rw,e:=l.Accept() 
  10.  
  11. ife!=nil{ 
  12.  
  13. ifne,ok:=e.(net.Error);ok&&ne.Temporary(){ 
  14.  
  15. iftempDelay==0
  16.  
  17. tempDelay=5*time.Millisecond 
  18.  
  19. }else
  20.  
  21. tempDelay*=2 
  22.  
  23.  
  24. ifmax:=1*time.Second;tempDelay>max{ 
  25.  
  26. tempDelay=max 
  27.  
  28.  
  29. log.Printf("http:Accepterror:%v;retryingin%v",e,tempDelay) 
  30.  
  31. time.Sleep(tempDelay) 
  32.  
  33. continue 
  34.  
  35.  
  36. returne 
  37.  
  38.  
  39. tempDelay=0 
  40.  
  41. ifsrv.ReadTimeout!=0
  42.  
  43. rw.SetReadDeadline(time.Now().Add(srv.ReadTimeout)) 
  44.  
  45.  
  46. ifsrv.WriteTimeout!=0
  47.  
  48. rw.SetWriteDeadline(time.Now().Add(srv.WriteTimeout)) 
  49.  
  50.  
  51. c,err:=srv.newConn(rw) 
  52.  
  53. iferr!=nil{ 
  54.  
  55. continue 
  56.  
  57.  
  58. goc.serve() 
  59.  
  60.  
  61. panic("notreached"
  62.  

如何接收客戶端請求?

上面代碼執行監控端口之后,調用了srv.Serve(net.Listener)函數,這個函數就是處理接收客戶端的請求信 息。這個函數里面起了一個for{},首先通過Listener接收請求,其次創建一個 Conn,最后單獨開了一個 goroutine,把這個請求的數據當做參數扔給這個conn去服務:go c.serve()。這 個就是高并發體現了, 用戶的每一次請求都是在一個新的goroutine去服務,相互不影響。

如何分配handler?

conn首先會解析request:c.readRequest(),然后獲取相應的handler:handler := c.server.Handler,也就是我們剛才在調用函數ListenAndServe時候的第二個參數,我們前面例子傳遞的是nil,也就是為空,那么默認獲取handler = DefaultServeMux,那么這個變量用來做什么的呢?對,這個變量就是一個路由器,它用來匹配url跳轉到其相應的handle函數,那么這個我們有設置過嗎?有,我們調用的代碼里面第一句不是調用了http.HandleFunc("/", sayhelloName)嘛。這個作用就是注冊了請求/的路由規則,當請求uri為"/",路由就會轉到函數sayhelloName,DefaultServeMux會調用ServeHTTP方法,這個方法內部其實就是調用sayhelloName本身,最后通過寫入response的信息反饋到客戶端。

教你搭建一個簡單的Go Web服務器

一個http連接處理流程

至此我們的三個問題已經全部得到了解答,你現在對于Go如何讓Web跑起來的是否已經基本了解

延伸 · 閱讀

精彩推薦
  • WEB服務器阿里云服務器部署web項目查看

    阿里云服務器部署web項目查看

    阿里 云服務器 部署web項目查看 隨著互聯網的發展,越來越多的企業開始將自己的業務擴展到線上平臺。為了滿足用戶的需求,企業需要部署自己的網站或...

    未知872023-09-07
  • WEB服務器如何將web項目部署到騰訊云服務器

    如何將web項目部署到騰訊云服務器

    如何將Web項目部署到騰訊 云服務器 摘要:本文將詳細介紹如何將Web項目部署到 騰訊云服務器 。包括選擇合適的云服務器實例,配置服務器環境,上傳代碼...

    未知1952023-06-24
  • WEB服務器云服務器安裝多個web網站嗎

    云服務器安裝多個web網站嗎

    云服務器 安裝多個web網站 云服務器是一種基于云計算技術的 虛擬主機 服務,可以提供各種云計算基礎設施和服務。作為一個虛擬主機,云服務器可以用于...

    未知1302023-07-12
  • WEB服務器寶塔面板負載狀態(load average)中的數據代表了什么?

    寶塔面板負載狀態(load average)中的數據代表了什么?

    寶塔面板是現在眾多站長選擇的服務器管理軟件,本文主要講解寶塔面板負載狀態(load average)中的數據代表了什么?有需要的朋友可以參考一下。...

    九天博客5792020-05-23
  • WEB服務器云端webdav服務器

    云端webdav服務器

    云端WebDAV服務器是一種在云端環境下提供WebDAV(Web Distributed Authoring and Versioning)協議服務的技術。WebDAV是一種HTTP擴展協議,它允許用戶通過Internet訪問分布...

    未知972023-05-25
  • WEB服務器WDCP控制面板升級mysql為5.7.11的方法

    WDCP控制面板升級mysql為5.7.11的方法

    本文主要講解在WDCP控制面板升級mysql為5.7.11的方法,有需要的朋友可以參考下...

    yuanxiaoping5322020-07-15
  • WEB服務器phpstudy默認不支持64位php的解決方法

    phpstudy默認不支持64位php的解決方法

    下面小編就為大家帶來一篇phpstudy默認不支持64位php的解決方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian4702019-10-17
  • WEB服務器湖北web云服務器價格

    湖北web云服務器價格

    湖北web 云服務器 價格 近年來,隨著互聯網技術的快速發展,云計算技術已經被廣泛應用于各行各業,對于企業來說,云計算技術已經成為提升企業信息化...

    未知1612023-06-07
主站蜘蛛池模板: 在线观看一区二区三区四区 | 久久性网站 | 欧美一级片在线 | 午夜社区 | 山岸逢花在线 | 国产欧美一区二区 | 黄色99| 女人久久久 | 日韩成人在线播放 | 国产精品国产三级国产aⅴ原创 | 日韩精品三区 | 中文字幕欧美在线 | 黄色片在线 | 亚洲精品永久免费 | 午夜欧美一区二区三区在线播放 | 黄色片小视频 | 91精选| 午夜视频一区二区三区 | 日韩综合一区 | 一区二区三区在线免费观看 | 亚洲欧美高清 | 久久夜视频 | 天天综合久久 | 高清18麻豆 | 国产成人一区二区三区 | 日本激情视频一区二区三区 | 啪啪导航 | 毛片在线视频 | 综合激情网 | 欧美日韩精品久久久 | 毛片网站免费在线观看 | 久久中文字幕一区二区三区 | 午夜国产精品成人 | 久久国产亚洲精品 | 91精品麻豆日日躁夜夜躁 | 91亚洲日本aⅴ精品一区二区 | 精品久久久久久久久久久久 | 亚洲国产一区二区三区四区 | 久久久久久久久国产 | 中文在线播放 | 丁香伊人|