這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)caddy中怎么添加自定義插件,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
目前創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護、企業(yè)網(wǎng)站設(shè)計、五峰網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
首先為 caddy 創(chuàng)建一個 插件的 Go Package ,你可以新建一個文件夾達到這個效果。比如
├── caddy-plugin │ ├── gizmo.go │ └── setup.go
這里分為了兩個 Go 文件,接下來詳細講每一個 Go 文件的作用。
<a name="nmOnZ"></a>
首先我們看到 setup.go
<a name="HXIC2"></a>
創(chuàng)建 setup.go 文件并寫入以下信息
import "github.com/mholt/caddy" func init() { caddy.RegisterPlugin("gizmo", caddy.Plugin{ ServerType: "http", Action: setup, }) }
這里是 建立了一個新插件,caddy 包來做到插件的注冊。
注意到 “gizmo” 這是 插件的名字,同時也是指令的名字,請為你的插件取一個獨一無二的名字吧。(注意:名字需要是單詞小寫哦。)
因為是針對 HTTP 服務(wù)器的插件,所以 ServerType 字段值是 “http”
另一個設(shè)置的字段是 setup ,實際上,我們接下來會填充這個函數(shù)的邏輯。它的作用就是將我們插件的處理邏輯安裝到 Caddy 中。
<a name="6sJEa"></a>
現(xiàn)在我們來實現(xiàn) setup 函數(shù) <br /> <br />假如我們希望在Caddyfile中有一行這樣的行:
gizmo foobar
<br />我們可以得到剛才所說的 c.Next()
第一個參數(shù)(“foobar”)的值,如下所示:
for c.Next() { // skip the directive name if !c.NextArg() { // expect at least one value return c.ArgErr() // otherwise it's an error } value := c.Val() // use the value }
我們首先注意到, c.Next() 是真正我們讀取 caddyfile 邏輯的地方,caddyfile 就是配置服務(wù)器的配置文件的名字。我們注意到,這里的操作實際上是使用 caddy.Controller 來實現(xiàn)的。它的存在 讓編寫插件的開發(fā)者只需要關(guān)注如何使用它來執(zhí)行你的命令,這是一項優(yōu)秀的設(shè)計,有興趣可以看我的源碼閱讀部分關(guān)于 Plugin 的具體實現(xiàn)。
在 Caddy 解析了Caddyfile之后,它將迭代每個指令名(按照服務(wù)器類型規(guī)定的順序),并在每次遇到指令名時調(diào)用指令的setup函數(shù)。setup函數(shù)的職責(zé)是解析指令的標(biāo)識并配置自己。<br /> <br />您可以通過遍歷c.Next()
來解析為指令提供的標(biāo)識,只要有更多的標(biāo)識需要解析,那么c.Next()
就會返回true
。由于一個指令可能出現(xiàn)多次,你必須遍歷c.Next()
以獲得所有出現(xiàn)的指令并使用第一個標(biāo)識(即指令名)。<br />有關(guān)caddyfile包,請參閱godoc以了解如何更充分地使用分發(fā)器,并查看任何其他現(xiàn)有插件。
<a name="fzu7b"></a>
<a name="iyY6W"></a>
查看httpserver包的godoc。最重要的兩種類型是httpserver.Handler和httpserver.Middleware。
Handler
是一個處理HTTP請求的函數(shù)。
Middleware
是一種連接Handler
的方式。
Caddy將負責(zé)為你設(shè)置HTTP服務(wù)器的所有簿記(bookkeeping)工作,但是你需要實現(xiàn)這兩種類型。<br />
<a name="sPXzP"></a>
httpserver.Handler
是一個幾乎和http.Handler
完全一樣的接口,除了ServeHTTP
方法返回(int, error)
。<br />這個方法簽名遵循Go語言博客中關(guān)于與中間件相關(guān)的錯誤處理的建議。<br />int
是HTTP狀態(tài)碼,error
應(yīng)該被處理和/或記錄。有關(guān)這些返回值的詳細信息,請參閱godoc。<br /> <br />Handler
通常是一個結(jié)構(gòu)體,至少包含一個Next
字段,用來鏈接下一個Handler
:
type gizmoHandler struct { next httpserver.Handler }
<br />除了這些之外,可以添加一些自己使用的參數(shù),考慮 grpc 的 plugin 實現(xiàn),解釋放在代碼塊中的注釋中
type server struct { backendAddr string // 監(jiān)聽地址 next httpserver.Handler // 作為中間件必須有的字段 backendIsInsecure bool // 是否啟用 Insecure() 選項,是 grpc 的一項配置 backendTLS *tls.Config // 關(guān)于 TLS 的使用的證書文件 wrappedGrpc *grpcweb.WrappedGrpcServer // 通過 grpcweb 的 協(xié)議實現(xiàn) HTTP 請求等 }
這就是參考的一個 字段的使用。可以根據(jù)自己的需要,調(diào)整在 caddyfile 中讀取的指令應(yīng)該如何配置。
<a name="K5EDA"></a>
為了實現(xiàn)httpserver.Handler
接口,我們需要編寫一個名為ServeHTTP
的方法。這個方法是實際的處理程序函數(shù),除非它自己處理完畢請求,否則它應(yīng)該調(diào)用鏈中的下一個Handler
:即使用 g.next.ServeHTTP(w, r)
func (g gizmoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) { return g.next.ServeHTTP(w, r) }
這里只是框架,具體邏輯可以自行填充,可以參照已有的 Plugin 實現(xiàn)。<br />
<a name="RiOqc"></a>
然后我們可以進行第二步,將這個 handler 注冊到整個 caddy 的 http 調(diào)用鏈上。
我們需要回到 剛才的 setup.go 文件中,<br />回到設(shè)置函數(shù)。你剛剛解析了標(biāo)識并使用所有適當(dāng)?shù)呐渲迷O(shè)置了中間件處理程序:
func setup(c *caddy.Controller) error { g := gizmoHandler{} // 用來實現(xiàn) HTTPHandler 的 next 的結(jié)構(gòu),用來構(gòu)建 中間件。也可以加入一些自己的字段 for c.Next() { // 獲取配置文件,并處理 } // 現(xiàn)在開始注冊中間件 httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler { g.next = next return g }) return nil }
這樣,代碼部分就全部完成了。
下面我們查看需要注意的事項。實際上是關(guān)乎于怎樣將寫好的插件集成在 caddy 中。
<a name="WTOo3"></a>
要做的事情是告訴服務(wù)器類型在進程的什么地方執(zhí)行你的指令。這一點很重要,因為其他指令可能會設(shè)置你所依賴的更原始的配置,因此執(zhí)行指令的順序不能是隨意的。<br /> <br />每個服務(wù)器類型都有一個字符串列表,其中每個項都是一個指令的名稱。例如,查看HTTP服務(wù)器支持的指令列表。將指令添加到適當(dāng)?shù)奈恢谩?lt;br />
<a name="c75IF"></a>
最后,不要忘記導(dǎo)入你的插件包!Caddy必須導(dǎo)入插件來注冊并執(zhí)行它。這通常是在run.go的import
部分的尾部完成的:<br />
_ "your/plugin/package/here"
請注意:包名前的_
是必需的。
<a name="1aHEv"></a>
上述就是小編為大家分享的caddy中怎么添加自定義插件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:caddy中怎么添加自定義插件
網(wǎng)址分享:http://vcdvsql.cn/article2/pdspoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、營銷型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、面包屑導(dǎo)航、定制網(wǎng)站、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)