CoreDNS是使用go語言編寫的快速靈活的DNS服務(wù),采用鏈?zhǔn)讲寮J剑總€插件實現(xiàn)獨立的功能,底層協(xié)議可以是tcp/udp,也可以是TLS,gRPC等。默認(rèn)監(jiān)聽所有ip地址,可使用bind插件指定監(jiān)聽指定地址。

田陽網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),田陽網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為田陽上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的田陽做網(wǎng)站的公司定做!
格式如下
SCHEME是可選的,默認(rèn)值為dns://,也可以指定為tls://,grpc://或者h(yuǎn)ttps://。
ZONE是可選的,指定了此dnsserver可以服務(wù)的域名前綴,如果不指定,則默認(rèn)為root,表示可以接收所有的dns請求。
PORT是選項的,指定了監(jiān)聽端口號,默認(rèn)為53,如果這里指定了端口號,則不能通過參數(shù)-dns.port覆蓋。
一塊上面格式的配置表示一個dnsserver,稱為serverblock,可以配置多個serverblock表示多個dnsserver。
下面通過一個例子說明,如下配置文件指定了4個serverblock,即4個dnsserver,第一個監(jiān)聽端口5300,后面三個監(jiān)聽同一個端口53,每個dnsserver指定了特定的插件。
下圖為配置的簡略圖
a. 從圖中可看到插件執(zhí)行順序不是配置文件中的順序,這是因為插件執(zhí)行順序是在源碼目錄中的plugin.cfg指定的,一旦編譯后,順序就固定了。
b. .根serverblock雖然指定了health,但是圖中卻沒有,這是因為health插件不參與dns請求的處理。能處理dns請求的插件必須提供如下兩個接口函數(shù)。
dns請求處理流程
收到dns請求后,首先根據(jù)域名匹配zone找到對應(yīng)的dnsserver(最長匹配優(yōu)先),如果沒有匹配到,則使用默認(rèn)的root dnsserver。
找到dnsserver后,就要按照插件順序執(zhí)行其中配置的插件,當(dāng)然并不是配置的插件都會被執(zhí)行,如果某個插件成功找到記錄,則返回成功,否則根據(jù)插件是否配置了fallthrough等來決定是否執(zhí)行下一個插件。
plugin.cfg
源碼目錄下的plugin.cfg指定了插件執(zhí)行順序,如果想添加插件,可按格式添加到指定位置。
源碼目錄下的Makefile根據(jù)plugin.cfg生成了兩個go文件:zplugin.go和zdirectives.go。
core/dnsserver/zdirectives.go將所有插件名字放在一個數(shù)組中。
codedns 主函數(shù)
codedns.go 首先導(dǎo)入了包"github.com/coredns/coredns/core/plugin",此包內(nèi)只有一個文件zplugin.go,此文件為自動生成的,主要導(dǎo)入了所有的插件,執(zhí)行每個插件的init函數(shù)。
接著執(zhí)行 run.go Run
此文件又引入了包"github.com/coredns/coredns/core/dnsserver",其init函數(shù)在 dnsserver/register.go 文件中,如下所示,主要是注冊了serverType
剩下的就是解析參數(shù),解析配置文件后,執(zhí)行caddy.Start。
這里就是根據(jù)配置文件中指定的serverblock,執(zhí)行插件的setup進(jìn)行初始化,創(chuàng)建對應(yīng)的server,開始監(jiān)聽dns請求
tcp協(xié)議調(diào)用Serve,udp協(xié)議調(diào)用ServePacket
收到DNS請求后,調(diào)用ServeDNS,根據(jù)域名匹配dnsserver,如果沒有匹配不到則使用根dnsserver,然后執(zhí)行dnsserver中配置的插件
以k8s插件為例
參考
//如何寫coredns插件
//coredns源碼分析
//NodeLocal DNSCache
Go語言自亮相以來并沒有展示一個明確的方向,Google員工將Go語言稱為一個“試驗性語言”,稱其試圖融合Python等動態(tài)語言的開發(fā)速度和C或C++等編譯語言的性能和安全。一位Go語言的支持者概括而言Go語言如下:簡單、快速、安全、并發(fā)、快樂編程、開源;但Go語言缺乏方向以及其“集大成者”的嘗試很容易會導(dǎo)致其學(xué)貓不成學(xué)狗也不成,淪為四不像。盡管如此,編者仍然覺得Go語言有相當(dāng)大的潛力:很多開發(fā)者對它感興趣——不僅它的最初設(shè)計者陣容強大,而且在參與修改源代碼的人群中也不乏大牛級人物。這很有可能幫助Go語言找到適合自己的方向,開拓系統(tǒng)編程的新方向。
由于工作的契機,最近學(xué)習(xí)了下Gossip,以及go語言的實現(xiàn)版本HashiCorp/memberlist。網(wǎng)上有個最基本的memberlist使用的example,在下邊的鏈接中,感興趣可以按照文檔運行下感受感受。本文主要講解memberlist v0.1.5 的使用細(xì)節(jié)。
Gossip是最終一致性協(xié)議,是目前性能最好,容錯性最好的分布式協(xié)議。目前Prometheus的告警組件alertmanager、redis、s3、區(qū)塊鏈等項目都有使用Gossip。本文不介紹Gossip原理,大家自行谷歌。
簡單的幾步即可搭建gossip集群
感謝已經(jīng)有網(wǎng)友為我們實現(xiàn)了一個example(
)。
哪里有問題,還請大家多多指正
文章標(biāo)題:GO語言ip協(xié)議 GOIP設(shè)
當(dāng)前鏈接:http://www.chinadenli.net/article10/dooisgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、移動網(wǎng)站建設(shè)、手機網(wǎng)站建設(shè)、微信公眾號、自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(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)