dotweb——go语言的一个微型web框架(二)启动dotweb
以上的代碼截圖表示啟動(dòng)一個(gè)dotweb服務(wù),在瀏覽器里輸入127.0.0.1:8080,將會(huì)得到一個(gè)“index”的頁(yè)面。
app := dotweb.New()dotweb.New()函數(shù)表示創(chuàng)建一個(gè)新的dotweb對(duì)象,這個(gè)對(duì)象是dotwebapp。我們把dotweb稱之為web框架,實(shí)際上這只是一種叫法。dotweb它是一個(gè)application,如果您說(shuō)它是個(gè)web服務(wù)器那么這種說(shuō)法也是對(duì)的。dotweb.New()返回的dotweb對(duì)象通常我們叫做app,它負(fù)責(zé)日志、緩存、熱加載、加載httpserver等等工作。它是一個(gè)容器、一個(gè)宿主,httpserver就是在它的環(huán)境里運(yùn)行。
app.SetLogPath(file.GetCurrentDirectory())dotweb內(nèi)部實(shí)現(xiàn)了日志輸出,你只需要制定一個(gè)日志路徑就可以使用。這里只是指定了日志存放路徑,至于如何輸出日志這在后續(xù)的文章中會(huì)說(shuō)明,請(qǐng)放心它的使用非常簡(jiǎn)單。
app.SetCache(cache.NewRuntimeCache())//使用本地內(nèi)存當(dāng)作緩存 app.SetCache(cache.NewRedisCache("redis標(biāo)準(zhǔn)連接字符串"))//使用redis作為緩存dotweb對(duì)緩存有兩種支持,一種是本地內(nèi)存,一種是redis。在New()的時(shí)候,dotweb默認(rèn)是不創(chuàng)建緩存對(duì)象的,如果你需要可以自己用SetCache()函數(shù)設(shè)置。在兩種緩存策略中,你只能選擇一種來(lái)使用。如果你設(shè)置了兩種,dotweb將使用最后一個(gè)SetCache()。你可能對(duì)dotweb原生支持redis緩存表示欣喜,在你深入了解后會(huì)發(fā)現(xiàn)dotweb不只是cache支持redis。這正是出于對(duì)現(xiàn)代系統(tǒng)需要分布式部署的考慮。
app.Cache()你可以通過(guò)Cache()函數(shù)獲取緩存對(duì)象,在后續(xù)文章中我會(huì)介紹操作Cache對(duì)象的方法,如果你已經(jīng)迫不及待想使用它,你可以閱讀源碼,它非常簡(jiǎn)單很容易就可以理解。
app.RegisterModule(&dotweb.HttpModule{OnBeginRequest: func(ctx *dotweb.HttpContext) {fmt.Println(ctx.Url())},OnEndRequest: func(ctx*dotweb.HttpContext) {fmt.Println("離開",ctx.Url(),"頁(yè)面")},}) app.RegisterModule(&dotweb.HttpModule{OnBeginRequest: func(ctx *dotweb.HttpContext) {if strings.Split(ctx.Url(),"/")[1] == "subject"{fmt.Println(ctx.Session().Get("user"))if ctx.Session().Get("user") == nil {ctx.WriteString("請(qǐng)先登錄.")ctx.End()}}},
OnEndRequest: func(ctx*dotweb.HttpContext) {},})
Module在dotweb中被稱為中間件,RegisterModule函數(shù)接受一個(gè)HttpModule類型的參數(shù),HttpModule有兩個(gè)參數(shù)為*dotweb.HttpContext函數(shù)定義—OnBeginRequest和OnEndRequest,它們分別表示在UserHandler執(zhí)行前執(zhí)行和在UserHandler執(zhí)行后執(zhí)行。dotweb接受多個(gè)Module,它會(huì)按照注冊(cè)順序來(lái)執(zhí)行,在一些權(quán)限驗(yàn)證和日志處理中它非常有用。上述代碼第一個(gè)Module打印了請(qǐng)求的路由,第二個(gè)Module表示在subject的子路由下需要用戶登錄。有人表示希望能把Module綁定到UserHandler上以方便開發(fā),這條建議我們認(rèn)為很有用,我們會(huì)在以后的版本中增強(qiáng)Module的功能。
?
app.SetEnabledListDir(true)SetEnabledListDir用來(lái)設(shè)置是否允許目錄瀏覽,默認(rèn)是false。如果你的服務(wù)器上沒(méi)有任何靜態(tài)資源給客戶端訪問(wèn),那么就可以不用配置。關(guān)閉目錄瀏覽通常在數(shù)據(jù)接口服務(wù)器上非常有用。
app.SetEnabledDebug(true)SetEnabledDebug用來(lái)設(shè)置是否啟動(dòng)調(diào)試模式,在調(diào)試模式下如果出現(xiàn)異常dotweb將返回相關(guān)的錯(cuò)誤信息,方便追查問(wèn)題。這在開發(fā)和測(cè)試環(huán)境中非常有用,默認(rèn)值是false,所以在生產(chǎn)環(huán)境中你可以不用配置該值。
app.SetEnabledSession(true)SetEnavledSession用來(lái)設(shè)置是否啟用session,你可能會(huì)感到疑惑為什么dotweb默認(rèn)不啟用session呢?因?yàn)榫S持session會(huì)帶來(lái)性能損耗,在某些項(xiàng)目中不需要session,如果啟用可能會(huì)帶來(lái)不必要的性能損失。如果你需要你只需設(shè)置一下就好,就像示例一樣讓它為true。
app.SetSessionConfig(session.NewDefaultRuntimeConfig())//使用本地內(nèi)存 app.SetSessionConfig(session.NewDefaultRedisConfig("redis標(biāo)準(zhǔn)連接字符串"))//使用redisdotweb的session也是有兩種存儲(chǔ)策略,一種是本地的內(nèi)存,一種是redis。這點(diǎn)和緩存
app.SetEnabledGzip(true)SetEnabledGzip用來(lái)設(shè)置是否啟用Gzip壓縮,當(dāng)然默認(rèn)還是false。事實(shí)上Gzip不一定會(huì)帶來(lái)性能的提升,因?yàn)閷?duì)Response的緩沖區(qū)進(jìn)行壓縮會(huì)造成一些性能損耗,所以對(duì)于是否啟用Gzip壓縮你需要考慮到項(xiàng)目的實(shí)際情況。
?
app.SetExceptionHandle(func(ctx *dotweb.HttpContext,errinfo interface{}){//ctx表示請(qǐng)求上下文,errinfo表示錯(cuò)誤信息fmt.Println(ctx.Url(),"請(qǐng)求出現(xiàn)異常,錯(cuò)誤信息:",errinfo)})雖然dotweb提供了默認(rèn)的異常處理模塊,但是大部分情況下它不是你想要的那種方式。所以你可以根據(jù)自己的需要添加自己的異常處理模塊,如果你添加了自己的異常處理模塊,那么默認(rèn)異常處理模塊將會(huì)失效。
app.StartPProfServer(8081)PProf服務(wù)是用來(lái)監(jiān)控dotweb運(yùn)行狀態(tài)的,它目前提供了一些簡(jiǎn)單的查詢。不過(guò)我們有計(jì)劃在今后版本增強(qiáng)這部分功能,我們歡迎大家的建議。需要注意的是PProf服務(wù)端口不能和dotweb主服務(wù)端口沖突。
最重要的一步:
app.StartServer(8080)StartServer表示啟動(dòng)dotweb服務(wù),它會(huì)根據(jù)配置初始化相關(guān)資源并且裝載httpserver。啟動(dòng)之后,你就可以在瀏覽器里訪問(wèn)了。
當(dāng)然dotweb也有讀取配置文件啟動(dòng)的方法,在一些場(chǎng)景下它非常有用,我會(huì)在后續(xù)的文章中介紹如何使用配置文件啟動(dòng)dotweb。當(dāng)然,如果你已經(jīng)迫不及待也可以去閱讀源碼,項(xiàng)目地址:https://github.com/devfeel/dotweb,再次聲明:我們歡迎你對(duì)提出建議或者直接進(jìn)行源碼貢獻(xiàn),你可以通過(guò)github項(xiàng)目地址找到我們的QQ群。
總結(jié)
以上是生活随笔為你收集整理的dotweb——go语言的一个微型web框架(二)启动dotweb的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bzoj2720 [Violet 5]列
- 下一篇: 009_关闭linux的THP