成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Golang開(kāi)發(fā)的全功能單文件Web服務(wù)器

2024-01-16    分類(lèi): 網(wǎng)站建設(shè)

最新HTTP/2標(biāo)準(zhǔn)已經(jīng)發(fā)布,是基于谷歌QUIC的技術(shù)升級(jí)而成。雖然標(biāo)準(zhǔn)已經(jīng)發(fā)布,但是目前還鮮有應(yīng)用支持,那么有沒(méi)有方法進(jìn)行技術(shù)嘗鮮呢?答案是肯定的。本文蟲(chóng)蟲(chóng)給大家介紹一個(gè)Golang Web服務(wù)器應(yīng)用Algernon,作為一個(gè)單文件的Golang應(yīng)用內(nèi)置了HTTP/2,Lua,Markdown,Pongo2,HyperApp,Amber,Sass(SCSS),GCSS,JSX,BoltDB的功能,支持 Redis,PostgreSQL,MariaDB / MySQL數(shù)據(jù)庫(kù)。支持限速,插件,用戶和權(quán)限等各種功能。所有這些都包含在一個(gè)自包含可執(zhí)行文件中,麻雀雖小五臟俱全。

技術(shù)架構(gòu)

使用Golang開(kāi)發(fā),后端數(shù)據(jù)庫(kù)可以使用Bolt(內(nèi)置),MySQL,PostgreSQL或Redis(推薦)。對(duì)各種功能支持總共使用了下面的類(lèi)庫(kù):

permissions2用于處理用戶和權(quán)限;gopher-lua用于解釋和運(yùn)行Lua;http2用于服務(wù)HTTP/2,QUIC用于服務(wù)QUIC;blackfriday用于Markdown渲染;amber用于Amber模板;Pongo2用于Pongo2模板;Sass(SCSS)和GCSS用于CSS預(yù)處理;logrus用于日志記錄;goja-babel用于從JSX轉(zhuǎn)換為JavaScript;tollbooth用于速率限制;pie用于插件支持;graceful用于優(yōu)雅關(guān)閉。

設(shè)計(jì)思想

該項(xiàng)目源于用Markdown,Pongo2,Amber,HTML或JSX(+ React)等編寫(xiě)應(yīng)用,并用CSS樣式支持和設(shè)計(jì)。數(shù)據(jù)使用Lua腳本與Redis,BoltDB,PostgreSQL或MariaDB/MySQL鏈接操作。

Pongo2,Sass和Lua也是很好的一個(gè)選擇,而且Pongo2比Amber更靈活。

Bolt是一個(gè)純粹的key/value存儲(chǔ),使用Golang編寫(xiě)。Bolt無(wú)需預(yù)先安裝設(shè)置數(shù)據(jù)庫(kù),內(nèi)置在Algernon中使用。也支持廣泛使用的數(shù)據(jù)庫(kù),比如MariaDB/MySQL和PostgreSQL。

Algernon以下文件進(jìn)行特殊渲染和解析以下文件(后綴),按優(yōu)先順序排列:

index.lua是Lua代碼,動(dòng)態(tài)lua腳本處理。

index.html HTML默認(rèn)頁(yè)面。

index.md 渲染為HTML下的Markdown代碼。

index.txt 純文本文件。

index.pongo2,index.po2或index.tmpl渲染為HTML的Pongo2代碼。

index.amber渲染為HTML的Amber代碼。

index.hyper.js或index.hyper.jsx渲染為HTML的JSX + HyperApp代碼

data.lua是Lua代碼,其中函數(shù)和變量可用于同一目錄中的Pongo2、Amber和Markdown頁(yè)面。

如果將單個(gè)Lua腳本作為命令行參數(shù)提供,用于獨(dú)立服務(wù)器。它可用于設(shè)置處理程序或?yàn)樘囟║RL前綴提供文件和目錄。

style.gcss是GCSS代碼,支持對(duì)同目錄下的Pongo2,Amber和Markdown頁(yè)面的樣式。

總之,Algernon支持對(duì)以下文件擴(kuò)展名的處理??:

Markdown:.md(渲染為HTML)

Pongo2:.po2,.pongo2或.tpl(渲染為任何文本,通常為HTML)

琥珀色:.amber(渲染為HTML)

Sass:.scss(渲染為CSS)

GCSS:.gcss(渲染為CSS)

JSX:.jsx(渲染為JavaScript / ECMAScript)

Lua:.lua(提供自己的輸出和內(nèi)容類(lèi)型的腳本)

HyperApp:.hyper.js或.hyper.jsx(渲染為HTML)

根據(jù)擴(kuò)展名為其他文件指定mimetype。

沒(méi)有索引文件的目錄顯示為目錄列表。

盡可能使用UTF-8。

可以通過(guò)命令行或lua腳本配置服務(wù)器,但是配置是非必須的,默認(rèn)無(wú)需配置既可以使用。

技術(shù)特點(diǎn)

支持HTTP,HTTP/2,默認(rèn)啟動(dòng)HTTPS(HTTP/2需要瀏覽器支持)。

支持Lua動(dòng)態(tài)程序,可以使用Lua腳本處理程序。

Algernon可執(zhí)行文件為本機(jī)靜態(tài)編譯編,速度相當(dāng)快。

適用于Linux,OS X和64位Windows。

Lua解釋器被編譯為可執(zhí)行文件。

支持熱部署自動(dòng)刷新功能,實(shí)時(shí)編輯/實(shí)時(shí)預(yù)覽。

自包含的Algernon應(yīng)用程序可以壓縮到存檔(以.zip或.alg結(jié)尾),支持子啟動(dòng)時(shí)加載。

內(nèi)置支持Markdown,Pongo2,Amber,Sass(SCSS),GCSS和JSX。

默認(rèn)情況下,使用Redis作為數(shù)據(jù)庫(kù)后端,如果沒(méi)有可用的Redis服務(wù)器,Algernon將使用內(nèi)置的Bolt數(shù)據(jù)庫(kù)。

可以對(duì)Markdown渲染的HTML頁(yè)面指定以MultiMarkdown語(yǔ)法的標(biāo)題:

title: Title內(nèi)容。

后臺(tái)無(wú)需要文件轉(zhuǎn)換器(如SASS)即可進(jìn)行文件轉(zhuǎn)化。

如果設(shè)置了autorefresh,源文件時(shí)自動(dòng)刷新頁(yè)面。

交互式REPL。

如果Markdown文件名作為第一個(gè)參數(shù),則它將在端口3000上提供預(yù)覽,無(wú)需任何數(shù)據(jù)庫(kù)。方便在本地查看README.md文件。

完全多線程。將使用所有可用的CPU。

支持通過(guò)tollbooth進(jìn)行速率限制。

Lua REPL提供了幫助命令,可快速瀏覽可用的Lua功能。

可以加載用任何語(yǔ)言編寫(xiě)的插件。插件必須提供Lua.Code和Lua.Help函數(shù),并通過(guò)stderr + stdin來(lái)交互JSON-RPC。

內(nèi)置線程安全文件緩存,具有多種可用緩存模式(例如,僅用于緩存圖像)。

可以讀取并保存到JSON文檔。支持簡(jiǎn)單的JSON路徑表達(dá)式(如簡(jiǎn)單版本的XPath,但對(duì)于JSON)。

支持緩存壓縮,可以將緩存中存儲(chǔ)的文件直接從緩存發(fā)送到客戶端,無(wú)需解壓縮。

對(duì)大于4096B的文件發(fā)送到客戶端的文件默認(rèn)使用gzip壓縮。

使用PostgreSQL作為后端數(shù)據(jù)庫(kù)時(shí)候,默認(rèn)使用HSTORE鍵/值類(lèi)型(PostgreSQL 9.1或更高版本)。

沒(méi)有外部依賴(lài),純Golang程序。

需要Go 1.12或更高版本。另外用于QUIC支持的包不支持使用gccgo(GCC)構(gòu)建。

安裝OS X

蘋(píng)果OS X系統(tǒng)可以使用包管理器直接安裝:

brew install algernon

如果沒(méi)有安裝Homebrew包管理器,請(qǐng)先安裝。

Arch Linux

可以使用AUR源安裝:

pacman -S algernon

二進(jìn)制包

其他系統(tǒng)請(qǐng)下載對(duì)應(yīng)二進(jìn)制包即可使用。

源碼安裝

從源碼編譯安裝,適用于任何系統(tǒng)。用get命令從官方主分支下載最新源碼

get -u github/xyproto/algernon

使用該方法安裝,需要先設(shè)置GOPATH, 并將$GOPATH/bin添加到執(zhí)行PATH中

export GOPATH =~/go

export PATH = $PATH:$GOPATH/bin

也可以先git clone到本地然后編譯安裝

Golang 1.12版本

早期Golang版本

docker容器Algernon基本使用運(yùn)行Algernon:以開(kāi)發(fā)者模式運(yùn)行

algernon -e

該命令啟用調(diào)試模式,以內(nèi)置的Bolt數(shù)據(jù)庫(kù),以HTTP形式啟動(dòng),并對(duì)除了以下類(lèi)型的其他文件啟用緩存,這些類(lèi)型包括Pongo2,Amber,Lua,Sass,GCSS,Markdown和JSX。

新建一個(gè)簡(jiǎn)單的hello lua文件index.lua:

瀏覽器訪問(wèn),結(jié)果如下:

自定義Algernon應(yīng)用程序

創(chuàng)建應(yīng)用目錄:

mkdir mypage && cd mypage

創(chuàng)建名為index.lua的文件,其中包含以下內(nèi)容和上面一樣。

啟動(dòng):

algernon --httponly --autorefresh .

啟動(dòng)增加參數(shù)autorefresh,使得文件編輯后可以熱加載實(shí)時(shí)生效??梢栽囍庉嬒耰ndex.lua并刷新瀏覽器以查看新結(jié)果。

注意—autorefresh對(duì)Markdown,Pongo2和Amber頁(yè)面也生效,比如我新建一個(gè)chongchong.md頁(yè)面:

然后瀏覽器訪問(wèn):

HTTP/2 和HTTPS支持應(yīng)用

利用openssl創(chuàng)建創(chuàng)建自簽名證書(shū),僅用于測(cè)試:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 3000 -nodes

結(jié)果中,按照提示中按Return鍵,在Common Name時(shí)候輸入任意名稱(chēng),我們輸入的是CC,就會(huì)在本目錄生成cert.pem和key.pem兩個(gè)證書(shū)文件

啟動(dòng)

algernon .

然后通過(guò)瀏覽器以https訪問(wèn):

https://localhost:3000

由于使用子簽名證書(shū),沒(méi)有添加根域證書(shū),需要在瀏覽器添加信息才能訪問(wèn)。

注意https頭信息,確實(shí)是HTTP/2。

Lua支持基本的Lua功能

//返回服務(wù)器的版本字符串。

version() -> string

//睡眠給定的秒數(shù)(可以是浮點(diǎn)數(shù))。

sleep(number)

//將給定的字符串記錄為信息。采用可變數(shù)量的字符串。

log(...)

//將給定的字符串記錄為警告。采用可變數(shù)量的字符串。

warn(...)

//將給定的字符串記錄為錯(cuò)誤。采用可變數(shù)量的字符串。

err(...)

//返回1970年的納秒數(shù)(Unix時(shí)間)

unixnano() -> number

//將Markdown轉(zhuǎn)換為HTML

markdown(string) -> string

//返回運(yùn)行REPL或腳本的目錄。如果給出了文件名(可選),則返回腳本運(yùn)行的路徑,使用路徑分隔符和給定的文件名連接。

scriptdir([string]) -> string

//返回運(yùn)行服務(wù)器的目錄。如果給出了文件名(可選),則返回服務(wù)器運(yùn)行的路徑,使用路徑分隔符和給定的文件名連接。

serverdir([string]) -> string

Lua插件

//在給定可執(zhí)行文件路徑的情況下加載插件。成功時(shí)返回true。如果在Lua提示符上調(diào)用,將返回插件幫助文本。

Plugin(string)

//給定一個(gè)插件路徑,返回插件中Lua.Code函數(shù)返回的Lua代碼。可能會(huì)返回一個(gè)空字符串。

PluginCode(string) -> string

//獲取插件路徑,函數(shù)名稱(chēng)和參數(shù)。如果函數(shù)調(diào)用失敗,則返回空字符串;如果成功,則返回結(jié)果為JSON字符串。

CallPlugin(string, string, ...) -> string

Lua代碼庫(kù)函數(shù)

這些函數(shù)可以與插件函數(shù)結(jié)合使用,用于存儲(chǔ)加載serverconf.lua時(shí)插件返回的Lua代碼,然后在處理請(qǐng)求時(shí)檢索Lua代碼。

//創(chuàng)建或使用代碼庫(kù)對(duì)象。 (可選)將數(shù)據(jù)結(jié)構(gòu)名稱(chēng)作為第一個(gè)參數(shù)。

CodeLib([string]) -> userdata

//給定命名空間和Lua代碼,將給定代碼添加到命名空間。成功時(shí)返回true。

codelib:add(string, string) -> bool

//給定命名空間和Lua代碼,將給定代碼設(shè)置為命名空間中的唯一代碼。成功時(shí)返回true。

codelib:set(string, string) -> bool

//給定命名空間,返回Lua代碼或空字符串。

codelib:get(string) -> string

//將給定命名空間中的(eval)代碼導(dǎo)入當(dāng)前的Lua狀態(tài)。成功時(shí)返回true。

codelib:import(string) -> bool

//完全清除代碼庫(kù)。成功時(shí)返回true。

codelib:clear() -> bool

Lua文件上傳函數(shù)

//創(chuàng)建文件上傳對(duì)象。采用表單ID(來(lái)自POST請(qǐng)求)作為第一個(gè)參數(shù)。將可選的大上載大小(以MiB為單位)作為第二個(gè)參數(shù)。

//失敗時(shí)返回nil和錯(cuò)誤字符串,成功時(shí)返回userdata和空字符串。

UploadedFile(string[, number]) -> userdata, string

//返回客戶端指定的上傳文件名

uploadedfile:filename() -> string

//返回已接收數(shù)據(jù)的大小

uploadedfile:size() -> number

Lua處理請(qǐng)求函數(shù)

//設(shè)置頁(yè)面的Content-Type。

content(string)

//返回請(qǐng)求的HTTP方法(GET,POST等)。

method() -> string

//將文本輸出到瀏覽器/客戶端。采用可變數(shù)量的字符串。

print(...)

//返回請(qǐng)求的URL路徑。

urlpath() -> string

//返回請(qǐng)求中的HTTP標(biāo)頭,給定鍵或空字符串。

header(string) -> string

//在給定鍵和值的情況下設(shè)置HTTP標(biāo)頭。

setheader(string, string)

更多函數(shù)支持請(qǐng)參考官方文檔,此處略。

Markdown支持

Algernon實(shí)現(xiàn)對(duì)Markdown的快速瀏覽,實(shí)現(xiàn)在線webMarkdown查看器。-m標(biāo)志用來(lái)啟動(dòng):

algernon -m README.md在瀏覽器中查看README.md。

除了常規(guī)的Markdown語(yǔ)法之外,Algernon還支持在Markdown文件的頂部設(shè)置頁(yè)眉標(biāo)題和語(yǔ)法高亮樣式,如下所示:

該代碼將使用highlight.js突出顯示代碼,并提供多種樣式。

replace_with_theme后面的字符串將用于替換當(dāng)前主題字符串與給定字符串。這使得可以為一個(gè)主題使用一個(gè)圖像(如logo_default_theme.png)。主題可以是light,dark,redbox,bw,github,wing,material,neon,default,werc或CSS文件的路徑?;蛘咄荒夸浵碌膕tyle.gcss文件自定義的樣式。

范例和截圖

官方提供了大量的范例可以供使用,可以在官方倉(cāng)下載samplepack.zip安裝包,解壓到web目錄更目錄然后通過(guò)瀏覽器就可以訪問(wèn)。

bootstrap小應(yīng)用hyperapp計(jì)數(shù)

這是在啟用調(diào)試模式時(shí)處理Lua腳本中的錯(cuò)誤的方法。

three.js

Algernon Charles Swinburne的一首詩(shī),背景中有三個(gè)旋轉(zhuǎn)的圓環(huán)。使用CSS3高斯模糊,使用three.js作為3D圖形。

prettify代碼美化

美化樣本的屏幕截圖,由單個(gè)Lua腳本提供。

todo小程序

使用Alact和Algernon交互使用

tiles圖片拼圖小游戲

非常感謝您讀完創(chuàng)新互聯(lián)的這篇文章:"Golang開(kāi)發(fā)的全功能單文件Web服務(wù)器",僅為提供更多信息供用戶參考使用或?yàn)閷W(xué)習(xí)交流的方便。我們公司提供:網(wǎng)站建設(shè)、網(wǎng)站制作、官網(wǎng)建設(shè)、SEO優(yōu)化、小程序制作等服務(wù),歡迎聯(lián)系我們提供您的需求。

標(biāo)題名稱(chēng):Golang開(kāi)發(fā)的全功能單文件Web服務(wù)器
當(dāng)前路徑:http://jinyejixie.com/news43/313893.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版ChatGPT、建站公司網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
阳春市| 华坪县| 华蓥市| 甘泉县| 仁怀市| 平泉县| 额尔古纳市| 辽宁省| 无锡市| 合江县| 阳西县| 百色市| 临沂市| 浮山县| 甘肃省| 古丈县| 平泉县| 米易县| 宜阳县| 成武县| 南通市| 阜宁县| 盐山县| 美姑县| 乌兰浩特市| 康平县| 襄城县| 永寿县| 林西县| 揭阳市| 榆林市| 藁城市| 政和县| 永年县| 高淳县| 乐昌市| 天峨县| 积石山| 阿瓦提县| 肥西县| 泰宁县|