GoFrame WEB服務開發(fā)-開始使用

2022-04-13 09:42 更新

?GoFrame?是一款基礎(chǔ)設(shè)施建設(shè)比較完善的模塊化框架,?WebServer?模塊是其中比較核心的模塊,我們這里將Web服務開發(fā)作為框架入門的選擇,便于大家更容易學習和理解。

?GoFrame?框架提供了非常強大的?WebServer?,由?ghttp?模塊實現(xiàn)。實現(xiàn)了豐富完善的相關(guān)組件,例如:?Router?、?Cookie?、?Session?、路由注冊、配置管理、模板引擎、緩存控制等等,支持熱重啟、熱更新、多域名、多端口、多實例、?HTTPS?、?Rewrite?、?PProf?等等特性。

接口文檔地址:

https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp

哈嘍世界

老規(guī)矩,我們先來一個?Hello World?:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("哈嘍世界!")
    })
    s.Run()
}

這便是一個最簡單的服務,默認情況下它不支持靜態(tài)文件處理,只有一個功能,訪問 ?http://127.0.0.1/? 的時候,它會返回哈嘍世界!。

任何時候,您都可以通過?g.Server()?方法獲得一個默認的?Server?對象,該方法采用單例模式設(shè)計,也就是說,多次調(diào)用該方法,返回的是同一個?Server?對象。通過?Run()?方法執(zhí)行?Server?的監(jiān)聽運行,在沒有任何額外設(shè)置的情況下,它默認監(jiān)聽?80?端口。

關(guān)于其中的路由注冊,我們將會在后續(xù)的章節(jié)中介紹,我們繼續(xù)來看看如何創(chuàng)建一個支持靜態(tài)文件的?Server?。

靜態(tài)服務

創(chuàng)建并運行一個支持靜態(tài)文件的?WebServer?:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
)

func main() {
    s := g.Server()
    s.SetIndexFolder(true)
    s.SetServerRoot("/home/www/")
    s.Run()
}

創(chuàng)建了?Server?對象之后,我們可以使用?Set*?方法來設(shè)置?Server?的屬性,我們這里的示例中涉及到了兩個屬性設(shè)置方法:

  • ?SetIndexFolder?用來設(shè)置是否允許列出?Server?主目錄的文件列表(默認為?false?)。
  • ?SetServerRoot?用來設(shè)置?Server?的主目錄(類似?nginx?中的?root?配置,默認為空)。

?Server?默認情況下是沒有任何主目錄的設(shè)置,只有設(shè)置了主目錄,才支持對應主目錄下的靜態(tài)文件的訪問。

多端口監(jiān)聽

?Server?同時支持多端口監(jiān)聽,只需要往?SetPort?參數(shù)設(shè)置多個端口號即可(當然,針對于?HTTPS?服務,我們也同樣可以通過?SetHTTPSPort?來設(shè)置綁定并支持多個端口號的監(jiān)聽,?HTTPS?服務的介紹請參看后續(xù)對應章節(jié))。

我們來看一個例子:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request){
        r.Response.Writeln("go frame!")
    })
    s.SetPort(8100, 8200, 8300)
    s.Run()
}

執(zhí)行以上示例后,我們訪問以下URL將會得到期望的相同結(jié)果:

http://127.0.0.1:8100/
http://127.0.0.1:8200/
http://127.0.0.1:8300/

多實例支持

?Server?支持同一進程多實例運行,下面我們來看一個例子:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
)

func main() {
    s1 := g.Server("s1")
    s1.SetPort(8080)
    s1.SetIndexFolder(true)
    s1.SetServerRoot("/home/www/static1")
    s1.Start()

    s2 := g.Server("s2")
    s2.SetPort(8088)
    s2.SetIndexFolder(true)
    s2.SetServerRoot("/home/www/static2")
    s2.Start()

    g.Wait()
}

可以看到我們在支持多個?Server?的語句中,給?g.Server?方法傳遞了不同的單例名稱參數(shù),該參數(shù)用于標識不同的?Server?實例,因此需要保證唯一性。如果需要獲取同一個?Server?實例,那么傳入同一個名稱即可。例如在多個?goroutine?中,或者不同的模塊中,都可以通過?g.Server?獲取到同一個?Server?實例。

域名綁定

?Server?支持多域名綁定,并且不同的域名可以綁定不同的服務。

我們來看一個簡單的例子:

package main

import (
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/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 := g.Server()
    s.Domain("127.0.0.1").BindHandler("/", Hello1)
    s.Domain("localhost").BindHandler("/", Hello2)
    s.Run()
}

我們訪問 http://127.0.0.1/ 和 http://localhost/ 可以看輸出不同的內(nèi)容。

此外,?Domain?方法支持多個域名參數(shù),使用英文“?,?”號分隔,例如:

s.Domain("localhost1,localhost2,localhost3").BindHandler("/", Hello2)

這條語句的表示將?Hello2?方法注冊到指定的3個域名中(?localhost1~3?),對其他域名不可見。

需要注意的是:?Domain?方法的參數(shù)必須是準確的域名,不支持泛域名形式,例如:?*.goframe.org?或者?.goframe.org?是不支持的,?api.goframe.org?或者?goframe.org?才被認為是正確的域名參數(shù)。

路由特性

?Server?提供了非常出色的路由特性,我們先來看一個簡單的示例:

package main

import (
    "github.com/gogf/gf/v2/net/ghttp"
    "github.com/gogf/gf/v2/frame/g"
)

func main() {
    s := g.Server()
    s.BindHandler("/{class}-{course}/:name/*act", func(r *ghttp.Request) {
        r.Response.Writef(
            "%v %v %v %v",
            r.Get("class"),
            r.Get("course"),
            r.Get("name"),
            r.Get("act"),
        )
    })
    s.SetPort(8199)
    s.Run()
}

這是一個混合的路由規(guī)則示例,用于展示某個班級、某個學科、某個學生、對應的操作,運行后,我們可以通過例如該地址: http://127.0.0.1:8199/class3-math/john/score 看到測試結(jié)果。在頁面上你可以看得到對應的路由規(guī)則都被一一解析,業(yè)務層可以根據(jù)解析的參數(shù)進行對應的業(yè)務邏輯處理。

配置管理

?GoFrame?的核心組件均實現(xiàn)了便捷的配置管理特性,僅需通過配置文件的修改即可實現(xiàn)組件的功能配置。大多數(shù)的場景中我們推薦使用配置文件來管理組件的配置。

平滑重啟

?Server?內(nèi)置支持平滑重啟特性。

HTTPS支持

?Server?支持?HTTPS?服務,并且也同時支持單進程提供?HTTP?&?HTTPS?服務。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號