今天給大家分享一篇搭建一個GO web服務器,HelloWorld!!
我們提供的服務有:網站建設、網站制作、微信公眾號開發(fā)、網站優(yōu)化、網站認證、梁溪ssl等。為數千家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的梁溪網站制作公司Go語言標準庫 - net/http
在學習Go語言有一個很好的起點,Go語言官方文檔很詳細,今天我們學習的Go Web服務器的搭建就需要用到Go語言官方提供的標準庫 net/http,通過http包提供了HTTP客戶端和服務端的實現。同時使用這個包能很簡單地對web的路由,靜態(tài)文件,模版,cookie等數據進行設置和操作。如果對http概念不是太清楚的朋友可以自行google。
http包建立Web服務器
- packagemain
- import(
- "fmt"
- "net/http"
- "strings"
- "log"
- )
- funcsayhelloName(whttp.ResponseWriter,r*http.Request){
- r.ParseForm()//解析參數,默認是不會解析的
- fmt.Println(r.Form)//這些信息是輸出到服務器端的打印信息
- fmt.Println("path",r.URL.Path)
- fmt.Println("scheme",r.URL.Scheme)
- fmt.Println(r.Form["url_long"])
- fork,v:=ranger.Form{
- fmt.Println("key:",k)
- fmt.Println("val:",strings.Join(v,""))
- }
- fmt.Fprintf(w,"HelloWrold!")//這個寫入到w的是輸出到客戶端的
- }
- funcmain(){
- http.HandleFunc("/",sayhelloName)//設置訪問的路由
- err:=http.ListenAndServe(":9090",nil)//設置監(jiān)聽的端口
- iferr!=nil{
- log.Fatal("ListenAndServe:",err)
- }
- }
上面的代碼我們在IDE中編譯后并運行成功后,這個時侯我們就可以在9090端口監(jiān)聽http鏈接請求了。成都網站建設公司
上圖中,我們在瀏覽器中輸入了 http://localhost:9090 ,可以看到瀏覽器頁面中輸入出 Hello World!
這個時侯如果我們在瀏覽器地址后面加一些參數試試:http://localhost:9090?url_long=111&url_long=222,看看瀏覽器中輸出什么?服務器端輸出的又是什么?
瀏覽器中輸出圖片
服務器端輸出圖片
我們看到了上面的代碼,要編寫一個Web服務器是不是很簡單,只要調用http包的兩個函數就可以了。成都網站建設公司
如果以前你是.NET程序員,那你也許就會問,我們的IIS服務器不需要嗎?Go就是不需要這些,因為他直接就監(jiān)聽了TCP端口了。成都網站建設公司
我們看到Go通過簡單的幾行代碼就已經運行起來一個Web服務了,而且這個Web服務內部有支持高并發(fā)的特性。現在Web服務已經搭建完成了,那我們現在來了解一個這個服務是怎么運行起來的呢?
Web工作方式的幾個概念
以下幾個為服務器段的概念
Request:用戶請求的信息,用來解析用戶的請求信息,包括post、get、cookie、url等信息
Response:服務器需要反饋給客戶端的信息
Conn:用戶的每次請求鏈接
Handler:處理請求和生成返回信息的處理邏輯
分析http包運行機制
Go實現Web服務的工作模式流程圖
這個過程我們需要清楚以下三個問題,則就清楚Go是如何讓Web運行起來了
如何監(jiān)聽端口?
通過上面的代碼我們看到Go是通過一個函數ListenAndServe來處理這些事情的,這個底層其實這樣處
理的:初始化一個server對象,然后調用了net.Listen("tcp", addr),也就是底層用TCP協(xié)議搭建了一個服
務,然后監(jiān)控我們設置的端口。成都機柜租用
Go http包的源碼,這里我們可以看到整個http處理過程
- func(srv*Server)Serve(lnet.Listener)error{
- deferl.Close()
- vartempDelaytime.Duration//howlongtosleeponacceptfailure
- for{
- rw,e:=l.Accept()
- ife!=nil{
- ifne,ok:=e.(net.Error);ok&&ne.Temporary(){
- iftempDelay==0{
- tempDelay=5*time.Millisecond
- }else{
- tempDelay*=2
- }
- ifmax:=1*time.Second;tempDelay>max{
- tempDelay=max
- }
- log.Printf("http:Accepterror:%v;retryingin%v",e,tempDelay)
- time.Sleep(tempDelay)
- continue
- }
- returne
- }
- tempDelay=0
- ifsrv.ReadTimeout!=0{
- rw.SetReadDeadline(time.Now().Add(srv.ReadTimeout))
- }
- ifsrv.WriteTimeout!=0{
- rw.SetWriteDeadline(time.Now().Add(srv.WriteTimeout))
- }
- c,err:=srv.newConn(rw)
- iferr!=nil{
- continue
- }
- goc.serve()
- }
- panic("notreached")
- }
如何接收客戶端請求?
上面代碼執(zhí)行監(jiān)控端口之后,調用了srv.Serve(net.Listener)函數,這個函數就是處理接收客戶端的請求信 息。這個函數里面起了一個for{},首先通過Listener接收請求,其次創(chuàng)建一個 Conn,最后單獨開了一個 goroutine,把這個請求的數據當做參數扔給這個conn去服務:go c.serve()。這 個就是高并發(fā)體現了, 用戶的每一次請求都是在一個新的goroutine去服務,相互不影響。
如何分配handler?
conn首先會解析request:c.readRequest(),然后獲取相應的handler:handler := c.server.Handler,也就是我們剛才在調用函數ListenAndServe時候的第二個參數,我們前面例子傳遞的是nil,也就是為空,那么默認獲取handler = DefaultServeMux,那么這個變量用來做什么的呢?對,這個變量就是一個路由器,它用來匹配url跳轉到其相應的handle函數,那么這個我們有設置過嗎?有,我們調用的代碼里面第一句不是調用了http.HandleFunc("/", sayhelloName)嘛。這個作用就是注冊了請求/的路由規(guī)則,當請求uri為"/",路由就會轉到函數sayhelloName,DefaultServeMux會調用ServeHTTP方法,這個方法內部其實就是調用sayhelloName本身,最后通過寫入response的信息反饋到客戶端。
一個http連接處理流程
至此我們的三個問題已經全部得到了解答,你現在對于Go如何讓Web跑起來的是否已經基本了解
文章標題:教你搭建一個簡單的GoWeb服務器
路徑分享:http://muchs.cn/article32/csspc.html
成都網站建設公司_創(chuàng)新互聯,為您提供企業(yè)建站、品牌網站設計、標簽優(yōu)化、電子商務、ChatGPT、建站公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯