這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
文章來源:http://gf.johng.cn/494366
gf架構提供了非常強大的Web Server模組,由ghttp包支援,API文檔地址: godoc.org/github.com/johng-cn/gf/g/net/ghttp。
哈嘍世界!
老規矩,我們先來一個Hello World:
package mainimport "gitee.com/johng/gf/g/net/ghttp"func main() { s := ghttp.GetServer() s.BindHandler("/", func(r *ghttp.Request){ r.Response.Write("哈嘍世界!") }) s.Run()}
這便是一個最簡單的Web Server,它不支援靜態檔案處理,只有一個功能,訪問http://127.0.0.1/
的時候,它會返回“哈嘍世界!”。
任何時候,您都可以通過ghttp.GetServer()
方法獲得一個預設的Web Server對象,該方法採用單例模式
設計,也就是說,多次調用該方法,返回的是同一個Web Server對象。
通過Run()方法執行Web Server的監聽運行,在沒有任何額外設定的情況下,它預設監聽80連接埠。
關於其中的服務註冊,我們將會在後續章節中介紹,我們繼續來看看如何建立一個支援靜態檔案的Web Server。
Web Server
建立並運行一個支援靜態檔案的Web Server:
package mainimport "gitee.com/johng/gf/g/net/ghttp"func main() { s := ghttp.GetServer() s.SetIndexFolder(true) s.SetServerRoot("/home/www/") s.Run()}
建立了Web Server對象之後,我們可以使用Set*
方法來設定Web Server的屬性,我們這裡的樣本中涉及到了兩個屬性設定方法:
SetIndexFolder
用來設定是否允許列出Web Server主目錄的檔案清單(預設為false);
SetServerRoot
用來設定Web Server的主目錄(預設為空白,在某些時候,Web Server僅提供介面服務,因此Web Server的主目錄為非必需參數);
Web Server預設情況下是沒有任何主目錄的設定,只有設定了主目錄,才支援對應主目錄下的靜態檔案的訪問。更多屬性設定請參考 ghttp API文檔。
多伺服器支援
ghttp支援多Web Server運行,下面我們來看一個例子:
package mainimport ( "gitee.com/johng/gf/g/net/ghttp")func main() { s1 := ghttp.GetServer("s1") s1.SetPort(8080) s1.SetIndexFolder(true) s1.SetServerRoot("/home/www/static1") go s1.Run() s2 := ghttp.GetServer("s2") s2.SetPort(8081) s2.SetIndexFolder(true) s2.SetServerRoot("/home/www/static2") go s2.Run() select{}}
如果需要再同一個進程中支援多個Web Server,那麼需要將每個Web Server使用goroutine進行非同步執行監聽,並且通過 select{} 語句(當然您也可以採用其他方式)保持主進程存活。
此外,可以看到我們在支援多個Web Server的語句中,給ghttp.GetServer傳遞了不同的參數,該參數為Web Server的名稱,之前我們提到ghttp的GetServer方法採用了單例設計模式,該參數用於標識不同的Web Server,因此需要保證唯一性。
如果需要擷取同一個Web Server,那麼傳入同一個名稱即可。例如在多個goroutine中,或者不同的模組中,都可以通過ghttp.GetServer擷取到同一個Web Server對象。
網域名稱&多網域名稱支援
同一個Web Server支援多網域名稱綁定,並且不同的網域名稱可以綁定不同的服務。
我們來看一個簡單的例子:
package mainimport "gitee.com/johng/gf/g/net/ghttp"func Hello1(r *ghttp.Request) { r.Response.Write("127.0.0.1: Hello1!")}func Hello2(r *ghttp.Request) { r.Response.Write("localhost: Hello2!")}func main() { s := ghttp.GetServer() s.Domain("127.0.0.1").BindHandler("/", Hello1) s.Domain("localhost").BindHandler("/", Hello2) s.Run()}
我們訪問http://127.0.0.1/
和http://localhost/
可以看輸出不同的內容。
此外,Domain
方法支援多個網域名稱參數,使用英文“,”號分隔,例如:
s.Domain("localhost1,localhost2,localhost3").BindHandler("/", Hello2)
這條語句的表示將Hello2方法註冊到指定的3個網域名稱中(localhost1~3),對其他網域名稱不可見。
需要注意的是:Domain方法的參數必須是準確的網域名稱,不支援泛網域名稱形式,例如:*.johng.cn或者.johng.cn是不支援的,api.johng.cn或者johng.cn才被認為是正確的網域名稱參數。