Java教程
成都創(chuàng)新互聯(lián)專注于定遠企業(yè)網(wǎng)站建設,響應式網(wǎng)站設計,商城網(wǎng)站制作。定遠網(wǎng)站建設公司,為定遠等地區(qū)提供建站服務。全流程定制網(wǎng)站制作,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
Linux入門
更多
首頁
?
Go語言WEB框架(Gin)詳解
在 Go語言開發(fā)的 Web 框架中,有兩款著名 Web 框架分別是 Martini 和 Gin,兩款 Web 框架相比較的話,Gin 自己說它比 Martini 要強很多。
Gin 是 Go語言寫的一個 web 框架,它具有運行速度快,分組的路由器,良好的崩潰捕獲和錯誤處理,非常好的支持中間件和 json??傊?Go語言開發(fā)領域是一款值得好好研究的 Web 框架,開源網(wǎng)址:
首先下載安裝 gin 包:
go get -u github.com/gin-gonic/gin
一個簡單的例子:
package main
import "github.com/gin-gonic/gin"
func main() {
//Default返回一個默認的路由引擎
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
}
編譯運行程序,打開瀏覽器,訪問頁面顯示:
{"message":"pong"}
gin 的功能不只是簡單輸出 Json 數(shù)據(jù)。它是一個輕量級的 WEB 框架,支持 RestFull 風格 API,支持 GET,POST,PUT,PATCH,DELETE,OPTIONS 等 http 方法,支持文件上傳,分組路由,Multipart/Urlencoded FORM,以及支持 JsonP,參數(shù)處理等等功能,這些都和 WEB 緊密相關,通過提供這些功能,使開發(fā)人員更方便地處理 WEB 業(yè)務。
Gin 實際應用
接下來使用 Gin 作為框架來搭建一個擁有靜態(tài)資源站點,動態(tài) WEB 站點,以及 RESTFull API 接口站點(可專門作為手機 APP 應用提供服務使用)組成的,亦可根據(jù)情況分拆這套系統(tǒng),每種功能獨立出來單獨提供服務。
下面按照一套系統(tǒng)但采用分站點來說明,首先是整個系統(tǒng)的目錄結(jié)構(gòu),website 目錄下面 static 是資源類文件,為靜態(tài)資源站點專用;photo 目錄是 UGC 上傳圖片目錄,tpl 是動態(tài)站點的模板。
當然這個目錄結(jié)構(gòu)是一種約定,可以根據(jù)情況來修改。整個項目已經(jīng)開源,可以訪問來詳細了解:具體每個站點的功能怎么實現(xiàn)呢?請看下面有關每個功能的講述:
靜態(tài)資源站點
一般網(wǎng)站開發(fā)中,我們會考慮把 js,css,以及資源圖片放在一起,作為靜態(tài)站點部署在 CDN,提升響應速度。采用 Gin 實現(xiàn)起來非常簡單,當然也可以使用 net/http 包輕松實現(xiàn),但使用 Gin 會更方便。
不管怎么樣,使用 Go 開發(fā),我們可以不用花太多時間在 WEB 服務環(huán)境搭建上,程序啟動就直接可以提供 WEB 服務了。
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")
}
首先需要是生成一個 Engine,這是 gin 的核心,默認帶有 Logger 和 Recovery 兩個中間件。
router := gin.Default()
StaticFile 是加載單個文件,而 StaticFS 是加載一個完整的目錄資源:
func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes
func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes
這些目錄下資源是可以隨時更新,而不用重新啟動程序?,F(xiàn)在編譯運行程序,靜態(tài)站點就可以正常訪問了。
LiteIDE是一款專門為Go語言開發(fā)的跨平臺輕量級集成開發(fā)環(huán)境(IDE),由QT編寫。
LiteIDE主要特點: 支持主流操作系統(tǒng)
Windows
Linux
MacOS X Go編譯環(huán)境管理和切換
管理和切換多個Go編譯環(huán)境
支持Go語言交叉編譯 與Go標準一致的項目管理方式
基于GOPATH的包瀏覽器
基于GOPATH的編譯系統(tǒng)
基于GOPATH的Api文檔檢索 Go語言的編輯支持
類瀏覽器和大綱顯示
Gocode(代碼自動完成工具)的完美支持
Go語言文檔查看和Api快速檢索
代碼表達式信息顯示F1
源代碼定義跳轉(zhuǎn)支持F2
Gdb斷點和調(diào)試支持
gofmt自動格式化支持 其他特征
支持多國語言界面顯示
完全插件體系結(jié)構(gòu)
支持編輯器配色方案
基于Kate的語法顯示支持
基于全文的單詞自動完成
支持鍵盤快捷鍵綁定方案
Markdown文檔編輯支持
實時預覽和同步顯示
自定義CSS顯示
可導出HTML和PDF文檔
批量轉(zhuǎn)換/合并為HTML/PDF文檔 Sublime Text 2(以下簡稱Sublime)+ GoSublime + gocode + MarGo的組合。
其優(yōu)點有: 自動化提示代碼。 保存的時候自動格式化代碼,讓您編寫的代碼更加美觀,符合Go的標準。 支持項目管理 支持語法高亮 熟悉Java的讀者應該對于idea不陌生,idea是通過一個插件來支持go語言的高亮語法,代碼提示和重構(gòu)實現(xiàn)。
這個東西跟語言沒關系,你要搞清楚http的流程,在你這種情況下,go語言寫的程序是作為http server,jquery作為瀏覽器中運行的腳本,你可以使用jquery向服務器發(fā)送ajax請求,服務器返回json數(shù)據(jù)就可以了, http.Handle("/json", fooHandler)
http.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "這里寫上你的json數(shù)據(jù)就行了")
})
log.Fatal(http.ListenAndServe(":8080", nil))
對于jquery就
$.get("/test/json",function(m){alert(m);});
就可以了
rtsp流在主流瀏覽器并不支持直接播放。比如大華的視頻流:rtsp://admin:123456@
192.168.10.129/cam/realmonitor?channel=1subtype=0,用vlc可以直接播放。但在瀏覽器會報ERR_UNKNOWN_URL_SCHEME。那如何在瀏覽器中播放呢。
以下列出幾種方案。
1、安裝插件(chrome最新版基本都不支持)
類如:kurento,vlc插件(谷歌瀏覽器版本41以下),vgx插件(不支持高版本,chrome72.0版本可用)等。
2、安裝軟件(中間件,基本都付費)
類如:Appemit(調(diào)用vlc插件播放rtsp),可以免安裝的,目前只能windows,免費版會有提示。
猿大師中間件(底層調(diào)用VLC的ActiveX控件,實現(xiàn)在主流瀏覽器網(wǎng)頁中內(nèi)嵌播放多路RTSP的實時視頻流),中間件收費的。
PluginOK(牛插)中間件。底層調(diào)用ActiveX控件VlcOcx.dll。(商業(yè)用途需付費使用)
3、服務器拉流轉(zhuǎn)發(fā)及協(xié)議轉(zhuǎn)換
示意圖如下所示:
推流--------------服務器轉(zhuǎn)發(fā)--------------拉流
方法一覽:
a,vlc軟件串流到http協(xié)議 ,網(wǎng)頁顯示幾個視頻需啟動幾個vlc,只適合應急場景。
b,html5 + websocket_rtsp_proxy 實現(xiàn)視頻流直播 ,基于MSE(Media Source Extensions,W3C),擴展H5的功能。
步驟:服務器安裝streamedian服務器,客戶端通過video標簽播放。
原型圖:
價格:
c.基于nginx的rsmp轉(zhuǎn)發(fā)
基于nginx實現(xiàn)rtmp轉(zhuǎn)化,用flash實現(xiàn)播放。由于flash目前大多瀏覽器默認禁用,不推薦此方式。
步驟:安裝ffmpeg工具,安裝nginx。
另外nginx-rtmp-module也支持HLS協(xié)議,可以搭建基于hls的直播服務器。
d.rtsp轉(zhuǎn)hls播放,通過ffmpeg轉(zhuǎn)碼
步驟:安裝ffmpeg工具,ffmpeg轉(zhuǎn)碼。
形如:
ffmpeg -i "rtsp://admin:123456@192.168.10.129/cam/realmonitor?channel=1subtype=0" -c copy -f hls -hls_time 2.0 -hls_list_size 0 -hls_wrap 15 "D:/hls/test.m3u8"
缺點是直播流延時很大,對實時要求比較高的不滿足要求。
案例:基于EasyDarwin拾建轉(zhuǎn)碼服務器。參考地址:
通過存儲的m3u8去讀取。
e.websocket代理推送,F(xiàn)FMPEG轉(zhuǎn)碼
此方法與a,b類似。但更實用。
以下提供兩種方案:
(1)Gin+WebSocket+FFMPEG實現(xiàn)rtsp轉(zhuǎn)碼,參考:
通過FFMPEG把rstp轉(zhuǎn)成http,ginrtsp作為轉(zhuǎn)發(fā)服務器,但需要自己寫相應接口,需要了解go語言。
(2)node + ffmpeg + websocket + flv.js,參考:
步驟:在node服務中建立websocket;通過fluent-ffmpeg轉(zhuǎn)碼,將RTSP 流轉(zhuǎn)為flv格式;通過flv.js連接websocket,并對獲取的flv格式視頻數(shù)據(jù)進行渲染播放。
import WebSocket from 'ws'import webSocketStream from 'websocket-stream/stream'import ffmpeg from 'fluent-ffmpeg'// 建立WebSocket服務const wss = new WebSocket.Server({ port: 8888, perMessageDeflate: false })// 監(jiān)聽連接wss.on('connection', handleConnection)// 連接時觸發(fā)事件function handleConnection (ws, req) {? // 獲取前端請求的流地址(前端websocket連接時后面帶上流地址)? const url = req.url.slice(1)? // 傳入連接的ws客戶端 實例化一個流? const stream = webSocketStream(ws, { binary: true })? // 通過ffmpeg命令 對實時流進行格式轉(zhuǎn)換 輸出flv格式? const ffmpegCommand = ffmpeg(url)? ? .addInputOption('-analyzeduration', '100000', '-max_delay', '1000000')? ? .on('start', function () { console.log('Stream started.') })? ? .on('codecData', function () { console.log('Stream codecData.') })? ? .on('error', function (err) {? ? ? console.log('An error occured: ', err.message)? ? ? stream.end()? ? })? ? .on('end', function () {? ? ? console.log('Stream end!')? ? ? stream.end()? ? })? ? .outputFormat('flv').videoCodec('copy').noAudio()? stream.on('close', function () {? ? ffmpegCommand.kill('SIGKILL')? })? try {? ? // 執(zhí)行命令 傳輸?shù)綄嵗髦蟹祷亟o客戶端? ? ffmpegCommand.pipe(stream)? } catch (error) {? ? console.log(error)? }}
優(yōu)點全部基于js。前端即可搞定。
參考: