真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言開(kāi)發(fā)中間件 go語(yǔ)言數(shù)據(jù)庫(kù)中間件

如何實(shí)現(xiàn)Golang的http請(qǐng)求處理中間件

優(yōu)雅的Golang Web開(kāi)發(fā)框架:Martini

成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供紅古企業(yè)網(wǎng)站建設(shè),專(zhuān)注與做網(wǎng)站、成都網(wǎng)站制作、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為紅古眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

Martini 是一個(gè)非常新的 Go 語(yǔ)言的 Web 框架,使用 Go 的 net/http 借口開(kāi)發(fā),類(lèi)似 Sinatra 或者 Flask 之類(lèi)的框架,你可使用自己的 DB 層、會(huì)話管理和模板。

特性:

使用非常簡(jiǎn)單

無(wú)侵入設(shè)計(jì)

可與其他 Go 的包配合工作

超棒的路徑匹配和路由

模塊化設(shè)計(jì),可輕松添加工具

大量很好的處理器和中間件

很棒的開(kāi)箱即用特性

完全兼容 http.HandlerFunc 接口.

示例代碼:

01 package main

02

03 import "github.com/codegangsta/martini"

04

05 func main() {

06 m := martini.Classic()

07 m.Get("/", func() string {

08 return "Hello world!"

09 })

10 m.Run()

11 }

請(qǐng)求處理器:

查看源碼打印?

1 m.Get("/", func() {

2 println("hello world")

3 })

4

5 m.Get("/", func(res http.ResponseWriter, req *http.Request) { // res and req are injected by Martini

6 res.WriteHeader(200) // HTTP 200

7 })

本回答由提問(wèn)者推薦

go語(yǔ)言的webengine叫什么

Java教程

Linux入門(mén)

更多

首頁(yè)

?

Go語(yǔ)言WEB框架(Gin)詳解

在 Go語(yǔ)言開(kāi)發(fā)的 Web 框架中,有兩款著名 Web 框架分別是 Martini 和 Gin,兩款 Web 框架相比較的話,Gin 自己說(shuō)它比 Martini 要強(qiáng)很多。

Gin 是 Go語(yǔ)言寫(xiě)的一個(gè) web 框架,它具有運(yùn)行速度快,分組的路由器,良好的崩潰捕獲和錯(cuò)誤處理,非常好的支持中間件和 json??傊?Go語(yǔ)言開(kāi)發(fā)領(lǐng)域是一款值得好好研究的 Web 框架,開(kāi)源網(wǎng)址:

首先下載安裝 gin 包:

go get -u github.com/gin-gonic/gin

一個(gè)簡(jiǎn)單的例子:

package main

import "github.com/gin-gonic/gin"

func main() {

//Default返回一個(gè)默認(rèn)的路由引擎

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {

//輸出json結(jié)果給調(diào)用方

c.JSON(200, gin.H{

"message": "pong",

})

})

r.Run() // listen and serve on 0.0.0.0:8080

}

編譯運(yùn)行程序,打開(kāi)瀏覽器,訪問(wèn)頁(yè)面顯示:

{"message":"pong"}

gin 的功能不只是簡(jiǎn)單輸出 Json 數(shù)據(jù)。它是一個(gè)輕量級(jí)的 WEB 框架,支持 RestFull 風(fēng)格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上傳,分組路由,Multipart/Urlencoded FORM,以及支持 JsonP,參數(shù)處理等等功能,這些都和 WEB 緊密相關(guān),通過(guò)提供這些功能,使開(kāi)發(fā)人員更方便地處理 WEB 業(yè)務(wù)。

Gin 實(shí)際應(yīng)用

接下來(lái)使用 Gin 作為框架來(lái)搭建一個(gè)擁有靜態(tài)資源站點(diǎn),動(dòng)態(tài) WEB 站點(diǎn),以及 RESTFull API 接口站點(diǎn)(可專(zhuān)門(mén)作為手機(jī) APP 應(yīng)用提供服務(wù)使用)組成的,亦可根據(jù)情況分拆這套系統(tǒng),每種功能獨(dú)立出來(lái)單獨(dú)提供服務(wù)。

下面按照一套系統(tǒng)但采用分站點(diǎn)來(lái)說(shuō)明,首先是整個(gè)系統(tǒng)的目錄結(jié)構(gòu),website 目錄下面 static 是資源類(lèi)文件,為靜態(tài)資源站點(diǎn)專(zhuān)用;photo 目錄是 UGC 上傳圖片目錄,tpl 是動(dòng)態(tài)站點(diǎn)的模板。

當(dāng)然這個(gè)目錄結(jié)構(gòu)是一種約定,可以根據(jù)情況來(lái)修改。整個(gè)項(xiàng)目已經(jīng)開(kāi)源,可以訪問(wèn)來(lái)詳細(xì)了解:具體每個(gè)站點(diǎn)的功能怎么實(shí)現(xiàn)呢?請(qǐng)看下面有關(guān)每個(gè)功能的講述:

靜態(tài)資源站點(diǎn)

一般網(wǎng)站開(kāi)發(fā)中,我們會(huì)考慮把 js,css,以及資源圖片放在一起,作為靜態(tài)站點(diǎn)部署在 CDN,提升響應(yīng)速度。采用 Gin 實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,當(dāng)然也可以使用 net/http 包輕松實(shí)現(xiàn),但使用 Gin 會(huì)更方便。

不管怎么樣,使用 Go 開(kāi)發(fā),我們可以不用花太多時(shí)間在 WEB 服務(wù)環(huán)境搭建上,程序啟動(dòng)就直接可以提供 WEB 服務(wù)了。

package main

import (

"net/http"

"github.com/gin-gonic/gin"

)

func main() {

router := gin.Default()

// 靜態(tài)資源加載,本例為css,js以及資源圖片

router.StaticFS("/public", http.Dir("D:/goproject/src/github.com/ffhelicopter/tmm/website/static"))

router.StaticFile("/favicon.ico", "./resources/favicon.ico")

// Listen and serve on 0.0.0.0:80

router.Run(":80")

}

首先需要是生成一個(gè) Engine,這是 gin 的核心,默認(rèn)帶有 Logger 和 Recovery 兩個(gè)中間件。

router := gin.Default()

StaticFile 是加載單個(gè)文件,而 StaticFS 是加載一個(gè)完整的目錄資源:

func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes

func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes

這些目錄下資源是可以隨時(shí)更新,而不用重新啟動(dòng)程序。現(xiàn)在編譯運(yùn)行程序,靜態(tài)站點(diǎn)就可以正常訪問(wèn)了。

golang使用Nsq

1. 介紹

最近在研究一些消息中間件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一個(gè)基于Go語(yǔ)言的分布式實(shí)時(shí)消息平臺(tái),它基于MIT開(kāi)源協(xié)議發(fā)布,由bitly公司開(kāi)源出來(lái)的一款簡(jiǎn)單易用的消息中間件。

官方和第三方還為NSQ開(kāi)發(fā)了眾多客戶端功能庫(kù),如官方提供的基于HTTP的nsqd、Go客戶端go-nsq、Python客戶端pynsq、基于Node.js的JavaScript客戶端nsqjs、異步C客戶端libnsq、Java客戶端nsq-java以及基于各種語(yǔ)言的眾多第三方客戶端功能庫(kù)。

1.1 Features

1). Distributed

NSQ提供了分布式的,去中心化,且沒(méi)有單點(diǎn)故障的拓?fù)浣Y(jié)構(gòu),穩(wěn)定的消息傳輸發(fā)布保障,能夠具有高容錯(cuò)和HA(高可用)特性。

2). Scalable易于擴(kuò)展

NSQ支持水平擴(kuò)展,沒(méi)有中心化的brokers。內(nèi)置的發(fā)現(xiàn)服務(wù)簡(jiǎn)化了在集群中增加節(jié)點(diǎn)。同時(shí)支持pub-sub和load-balanced 的消息分發(fā)。

3). Ops Friendly

NSQ非常容易配置和部署,生來(lái)就綁定了一個(gè)管理界面。二進(jìn)制包沒(méi)有運(yùn)行時(shí)依賴。官方有Docker image。

4.Integrated高度集成

官方的 Go 和 Python庫(kù)都有提供。而且為大多數(shù)語(yǔ)言提供了庫(kù)。

1.2 組件

1.3 拓?fù)浣Y(jié)構(gòu)

NSQ推薦通過(guò)他們相應(yīng)的nsqd實(shí)例使用協(xié)同定位發(fā)布者,這意味著即使面對(duì)網(wǎng)絡(luò)分區(qū),消息也會(huì)被保存在本地,直到它們被一個(gè)消費(fèi)者讀取。更重要的是,發(fā)布者不必去發(fā)現(xiàn)其他的nsqd節(jié)點(diǎn),他們總是可以向本地實(shí)例發(fā)布消息。

NSQ

首先,一個(gè)發(fā)布者向它的本地nsqd發(fā)送消息,要做到這點(diǎn),首先要先打開(kāi)一個(gè)連接,然后發(fā)送一個(gè)包含topic和消息主體的發(fā)布命令,在這種情況下,我們將消息發(fā)布到事件topic上以分散到我們不同的worker中。

事件topic會(huì)復(fù)制這些消息并且在每一個(gè)連接topic的channel上進(jìn)行排隊(duì),在我們的案例中,有三個(gè)channel,它們其中之一作為檔案channel。消費(fèi)者會(huì)獲取這些消息并且上傳到S3。

nsqd

每個(gè)channel的消息都會(huì)進(jìn)行排隊(duì),直到一個(gè)worker把他們消費(fèi),如果此隊(duì)列超出了內(nèi)存限制,消息將會(huì)被寫(xiě)入到磁盤(pán)中。Nsqd節(jié)點(diǎn)首先會(huì)向nsqlookup廣播他們的位置信息,一旦它們注冊(cè)成功,worker將會(huì)從nsqlookup服務(wù)器節(jié)點(diǎn)上發(fā)現(xiàn)所有包含事件topic的nsqd節(jié)點(diǎn)。

nsqlookupd

2. Internals

2.1 消息傳遞擔(dān)保

1)客戶表示已經(jīng)準(zhǔn)備好接收消息

2)NSQ 發(fā)送一條消息,并暫時(shí)將數(shù)據(jù)存儲(chǔ)在本地(在 re-queue 或 timeout)

3)客戶端回復(fù) FIN(結(jié)束)或 REQ(重新排隊(duì))分別指示成功或失敗。如果客戶端沒(méi)有回復(fù), NSQ 會(huì)在設(shè)定的時(shí)間超時(shí),自動(dòng)重新排隊(duì)消息

這確保了消息丟失唯一可能的情況是不正常結(jié)束 nsqd 進(jìn)程。在這種情況下,這是在內(nèi)存中的任何信息(或任何緩沖未刷新到磁盤(pán))都將丟失。

如何防止消息丟失是最重要的,即使是這個(gè)意外情況可以得到緩解。一種解決方案是構(gòu)成冗余 nsqd對(duì)(在不同的主機(jī)上)接收消息的相同部分的副本。因?yàn)槟銓?shí)現(xiàn)的消費(fèi)者是冪等的,以兩倍時(shí)間處理這些消息不會(huì)對(duì)下游造成影響,并使得系統(tǒng)能夠承受任何單一節(jié)點(diǎn)故障而不會(huì)丟失信息。

2.2 簡(jiǎn)化配置和管理

單個(gè) nsqd 實(shí)例被設(shè)計(jì)成可以同時(shí)處理多個(gè)數(shù)據(jù)流。流被稱(chēng)為“話題”和話題有 1 個(gè)或多個(gè)“通道”。每個(gè)通道都接收到一個(gè)話題中所有消息的拷貝。在實(shí)踐中,一個(gè)通道映射到下行服務(wù)消費(fèi)一個(gè)話題。

在更底的層面,每個(gè) nsqd 有一個(gè)與 nsqlookupd 的長(zhǎng)期 TCP 連接,定期推動(dòng)其狀態(tài)。這個(gè)數(shù)據(jù)被 nsqlookupd 用于給消費(fèi)者通知 nsqd 地址。對(duì)于消費(fèi)者來(lái)說(shuō),一個(gè)暴露的 HTTP /lookup 接口用于輪詢。為話題引入一個(gè)新的消費(fèi)者,只需啟動(dòng)一個(gè)配置了 nsqlookup 實(shí)例地址的 NSQ 客戶端。無(wú)需為添加任何新的消費(fèi)者或生產(chǎn)者更改配置,大大降低了開(kāi)銷(xiāo)和復(fù)雜性。

2.3 消除單點(diǎn)故障

NSQ被設(shè)計(jì)以分布的方式被使用。nsqd 客戶端(通過(guò) TCP )連接到指定話題的所有生產(chǎn)者實(shí)例。沒(méi)有中間人,沒(méi)有消息代理,也沒(méi)有單點(diǎn)故障。

這種拓?fù)浣Y(jié)構(gòu)消除單鏈,聚合,反饋。相反,你的消費(fèi)者直接訪問(wèn)所有生產(chǎn)者。從技術(shù)上講,哪個(gè)客戶端連接到哪個(gè) NSQ 不重要,只要有足夠的消費(fèi)者連接到所有生產(chǎn)者,以滿足大量的消息,保證所有東西最終將被處理。對(duì)于 nsqlookupd,高可用性是通過(guò)運(yùn)行多個(gè)實(shí)例來(lái)實(shí)現(xiàn)。他們不直接相互通信和數(shù)據(jù)被認(rèn)為是最終一致。消費(fèi)者輪詢所有的配置的 nsqlookupd 實(shí)例和合并 response。失敗的,無(wú)法訪問(wèn)的,或以其他方式故障的節(jié)點(diǎn)不會(huì)讓系統(tǒng)陷于停頓。

2.4 效率

對(duì)于數(shù)據(jù)的協(xié)議,通過(guò)推送數(shù)據(jù)到客戶端最大限度地提高性能和吞吐量的,而不是等待客戶端拉數(shù)據(jù)。這個(gè)概念,稱(chēng)之為 RDY 狀態(tài),基本上是客戶端流量控制的一種形式。

efficiency

2.5 心跳和超時(shí)

組合應(yīng)用級(jí)別的心跳和 RDY 狀態(tài),避免頭阻塞現(xiàn)象,也可能使心跳無(wú)用(即,如果消費(fèi)者是在后面的處理消息流的接收緩沖區(qū)中,操作系統(tǒng)將被填滿,堵心跳)為了保證進(jìn)度,所有的網(wǎng)絡(luò) IO 時(shí)間上限勢(shì)必與配置的心跳間隔相關(guān)聯(lián)。這意味著,你可以從字面上拔掉之間的網(wǎng)絡(luò)連接 nsqd 和消費(fèi)者,它會(huì)檢測(cè)并正確處理錯(cuò)誤。當(dāng)檢測(cè)到一個(gè)致命錯(cuò)誤,客戶端連接被強(qiáng)制關(guān)閉。在傳輸中的消息會(huì)超時(shí)而重新排隊(duì)等待傳遞到另一個(gè)消費(fèi)者。最后,錯(cuò)誤會(huì)被記錄并累計(jì)到各種內(nèi)部指標(biāo)。

2.6 分布式

因?yàn)镹SQ沒(méi)有在守護(hù)程序之間共享信息,所以它從一開(kāi)始就是為了分布式操作而生。個(gè)別的機(jī)器可以隨便宕機(jī)隨便啟動(dòng)而不會(huì)影響到系統(tǒng)的其余部分,消息發(fā)布者可以在本地發(fā)布,即使面對(duì)網(wǎng)絡(luò)分區(qū)。

這種“分布式優(yōu)先”的設(shè)計(jì)理念意味著NSQ基本上可以永遠(yuǎn)不斷地?cái)U(kuò)展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享狀態(tài)就是保存在lookup節(jié)點(diǎn)上,甚至它們不需要全局視圖,配置某些nsqd注冊(cè)到某些lookup節(jié)點(diǎn)上這是很簡(jiǎn)單的配置,唯一關(guān)鍵的地方就是消費(fèi)者可以通過(guò)lookup節(jié)點(diǎn)獲取所有完整的節(jié)點(diǎn)集。清晰的故障事件——NSQ在組件內(nèi)建立了一套明確關(guān)于可能導(dǎo)致故障的的故障權(quán)衡機(jī)制,這對(duì)消息傳遞和恢復(fù)都有意義。雖然它們可能不像Kafka系統(tǒng)那樣提供嚴(yán)格的保證級(jí)別,但NSQ簡(jiǎn)單的操作使故障情況非常明顯。

2.7 no replication

不像其他的隊(duì)列組件,NSQ并沒(méi)有提供任何形式的復(fù)制和集群,也正是這點(diǎn)讓它能夠如此簡(jiǎn)單地運(yùn)行,但它確實(shí)對(duì)于一些高保證性高可靠性的消息發(fā)布沒(méi)有足夠的保證。我們可以通過(guò)降低文件同步的時(shí)間來(lái)部分避免,只需通過(guò)一個(gè)標(biāo)志配置,通過(guò)EBS支持我們的隊(duì)列。但是這樣仍然存在一個(gè)消息被發(fā)布后馬上死亡,丟失了有效的寫(xiě)入的情況。

2.8 沒(méi)有嚴(yán)格的順序

雖然Kafka由一個(gè)有序的日志構(gòu)成,但NSQ不是。消息可以在任何時(shí)間以任何順序進(jìn)入隊(duì)列。在我們使用的案例中,這通常沒(méi)有關(guān)系,因?yàn)樗械臄?shù)據(jù)都被加上了時(shí)間戳,但它并不適合需要嚴(yán)格順序的情況。

2.9 無(wú)數(shù)據(jù)重復(fù)刪除功能

NSQ對(duì)于超時(shí)系統(tǒng),它使用了心跳檢測(cè)機(jī)制去測(cè)試消費(fèi)者是否存活還是死亡。很多原因會(huì)導(dǎo)致我們的consumer無(wú)法完成心跳檢測(cè),所以在consumer中必須有一個(gè)單獨(dú)的步驟確保冪等性。

3. 實(shí)踐安裝過(guò)程

本文將nsq集群具體的安裝過(guò)程略去,大家可以自行參考官網(wǎng),比較簡(jiǎn)單。這部分介紹下筆者實(shí)驗(yàn)的拓?fù)洌约皀sqadmin的相關(guān)信息。

3.1 拓?fù)浣Y(jié)構(gòu)

topology

實(shí)驗(yàn)采用3臺(tái)NSQD服務(wù),2臺(tái)LOOKUPD服務(wù)。

采用官方推薦的拓?fù)?,消息發(fā)布的服務(wù)和NSQD在一臺(tái)主機(jī)。一共5臺(tái)機(jī)器。

NSQ基本沒(méi)有配置文件,配置通過(guò)命令行指定參數(shù)。

主要命令如下:

LOOKUPD命令

NSQD命令

工具類(lèi),消費(fèi)后存儲(chǔ)到本地文件。

發(fā)布一條消息

3.2 nsqadmin

對(duì)Streams的詳細(xì)信息進(jìn)行查看,包括NSQD節(jié)點(diǎn),具體的channel,隊(duì)列中的消息數(shù),連接數(shù)等信息。

nsqadmin

channel

列出所有的NSQD節(jié)點(diǎn):

nodes

消息的統(tǒng)計(jì):

msgs

lookup主機(jī)的列表:

hosts

4. 總結(jié)

NSQ基本核心就是簡(jiǎn)單性,是一個(gè)簡(jiǎn)單的隊(duì)列,這意味著它很容易進(jìn)行故障推理和很容易發(fā)現(xiàn)bug。消費(fèi)者可以自行處理故障事件而不會(huì)影響系統(tǒng)剩下的其余部分。

事實(shí)上,簡(jiǎn)單性是我們決定使用NSQ的首要因素,這方便與我們的許多其他軟件一起維護(hù),通過(guò)引入隊(duì)列使我們得到了堪稱(chēng)完美的表現(xiàn),通過(guò)隊(duì)列甚至讓我們?cè)黾恿藥讉€(gè)數(shù)量級(jí)的吞吐量。越來(lái)越多的consumer需要一套嚴(yán)格可靠性和順序性保障,這已經(jīng)超過(guò)了NSQ提供的簡(jiǎn)單功能。

結(jié)合我們的業(yè)務(wù)系統(tǒng)來(lái)看,對(duì)于我們所需要傳輸?shù)陌l(fā)票消息,相對(duì)比較敏感,無(wú)法容忍某個(gè)nsqd宕機(jī),或者磁盤(pán)無(wú)法使用的情況,該節(jié)點(diǎn)堆積的消息無(wú)法找回。這是我們沒(méi)有選擇該消息中間件的主要原因。簡(jiǎn)單性和可靠性似乎并不能完全滿足。相比Kafka,ops肩負(fù)起更多負(fù)責(zé)的運(yùn)營(yíng)。另一方面,它擁有一個(gè)可復(fù)制的、有序的日志可以提供給我們更好的服務(wù)。但對(duì)于其他適合NSQ的consumer,它為我們服務(wù)的相當(dāng)好,我們期待著繼續(xù)鞏固它的堅(jiān)實(shí)的基礎(chǔ)。


網(wǎng)站標(biāo)題:go語(yǔ)言開(kāi)發(fā)中間件 go語(yǔ)言數(shù)據(jù)庫(kù)中間件
文章鏈接:http://weahome.cn/article/dodejsj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部