gf架構之基本介紹 - 哈嘍世界!

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

文章來源: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的屬性,我們這裡的樣本中涉及到了兩個屬性設定方法:

  1. SetIndexFolder用來設定是否允許列出Web Server主目錄的檔案清單(預設為false);
  2. 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才被認為是正確的網域名稱參數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.