成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

教你搭建一個簡單的GoWeb服務(wù)器

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

我們提供的服務(wù)有:網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、梁溪ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的梁溪網(wǎng)站制作公司

Go語言標準庫 - net/http

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

http包建立Web服務(wù)器

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

上面的代碼我們在IDE中編譯后并運行成功后,這個時侯我們就可以在9090端口監(jiān)聽http鏈接請求了。成都網(wǎng)站建設(shè)公司

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

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

瀏覽器中輸出圖片

服務(wù)器端輸出圖片

我們看到了上面的代碼,要編寫一個Web服務(wù)器是不是很簡單,只要調(diào)用http包的兩個函數(shù)就可以了。成都網(wǎng)站建設(shè)公司

如果以前你是.NET程序員,那你也許就會問,我們的IIS服務(wù)器不需要嗎?Go就是不需要這些,因為他直接就監(jiān)聽了TCP端口了。成都網(wǎng)站建設(shè)公司

我們看到Go通過簡單的幾行代碼就已經(jīng)運行起來一個Web服務(wù)了,而且這個Web服務(wù)內(nèi)部有支持高并發(fā)的特性?,F(xiàn)在Web服務(wù)已經(jīng)搭建完成了,那我們現(xiàn)在來了解一個這個服務(wù)是怎么運行起來的呢?

Web工作方式的幾個概念

以下幾個為服務(wù)器段的概念

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

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

Conn:用戶的每次請求鏈接

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

分析http包運行機制

Go實現(xiàn)Web服務(wù)的工作模式流程圖

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

如何監(jiān)聽端口?

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

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

務(wù),然后監(jiān)控我們設(shè)置的端口。成都機柜租用

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

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

如何接收客戶端請求?

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

如何分配handler?

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

一個http連接處理流程

至此我們的三個問題已經(jīng)全部得到了解答,你現(xiàn)在對于Go如何讓W(xué)eb跑起來的是否已經(jīng)基本了解

文章標題:教你搭建一個簡單的GoWeb服務(wù)器
路徑分享:http://jinyejixie.com/article32/csspc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、品牌網(wǎng)站設(shè)計標簽優(yōu)化、電子商務(wù)ChatGPT、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
永寿县| 疏勒县| 沅陵县| 苏尼特右旗| 玉山县| 承德县| 太仆寺旗| 桂东县| 樟树市| 新化县| 桐柏县| 衡阳县| 四川省| 新化县| 平邑县| 灌云县| 平湖市| 潼关县| 醴陵市| 闻喜县| 英德市| 原平市| 宁远县| 海城市| 万源市| 辽宁省| 安陆市| 巴南区| 凉山| 大石桥市| 江永县| 册亨县| 长白| 安塞县| 江阴市| 南召县| 巴东县| 阜阳市| 揭西县| 临武县| 弋阳县|