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

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