真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

從源碼開始分析go語言 go語言開源嗎

coredns源碼分析

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)聽指定地址。

創(chuàng)新新互聯(lián),憑借十多年的做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),本著真心·誠心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有近千家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)。

格式如下

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指定了特定的插件。

下圖為配置的簡略圖

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

Golang database/sql源碼分析

Gorm是Go語言開發(fā)用的比較多的一個(gè)ORM。它的功能比較全:

但是這篇文章中并不會(huì)直接看Gorm的源碼,我們會(huì)先從database/sql分析。原因是Gorm也是基于這個(gè)包來封裝的一些功能。所以只有先了解了database/sql包才能更加好的理解Gorm源碼。

database/sql 其實(shí)也是一個(gè)對(duì)于mysql驅(qū)動(dòng)的上層封裝?!眊ithub.com/go-sql-driver/mysql”就是一個(gè)對(duì)于mysql的驅(qū)動(dòng),database/sql 就是在這個(gè)基礎(chǔ)上做的基本封裝包含連接池的使用

下面這個(gè)是最基本的增刪改查操作

操作分下面幾個(gè)步驟:

因?yàn)镚orm的連接池就是使用database/sql包中的連接池,所以這里我們需要學(xué)習(xí)一下包里的連接池的源碼實(shí)現(xiàn)。其實(shí)所有連接池最重要的就是連接池對(duì)象、獲取函數(shù)、釋放函數(shù)下面來看一下database/sql中的連接池。

DB對(duì)象

獲取方法

釋放連接方法

連接池的實(shí)現(xiàn)有很多方法,在database/sql包中使用的是chan阻塞 使用map記錄等待列表,等到有連接釋放的時(shí)候再把連接傳入等待列表中的chan 不在阻塞返回連接。

之前我們看到的Redigo是使用一個(gè)chan 來阻塞,然后釋放的時(shí)候放入空閑列表,在往這一個(gè)chan中傳入struct{}{},讓程序繼續(xù) 獲取的時(shí)候再從空閑列表中獲取。并且使用的是鏈表的結(jié)構(gòu)來存儲(chǔ)空閑列表。

database/sql 是對(duì)于mysql驅(qū)動(dòng)的封裝,然而Gorm則是對(duì)于database/sql的再次封裝。讓我們可以更加簡單的實(shí)現(xiàn)對(duì)于mysql數(shù)據(jù)庫的操作。

Go語言的開源項(xiàng)目

1.Docker項(xiàng)目

網(wǎng)址為 。

介紹:Docker是一種操作系統(tǒng)層面的虛擬化技術(shù),可以在操作系統(tǒng)和應(yīng)用程序之間進(jìn)行隔離,也可以稱之為容器。Docker可以在一臺(tái)物理服務(wù)器上快速運(yùn)行一個(gè)或多個(gè)實(shí)例。例如,啟動(dòng)一個(gè)Cent OS操作系統(tǒng),并在其內(nèi)部命令行執(zhí)行指令后結(jié)束,整個(gè)過程就像自己在操作系統(tǒng)一樣高效。

2.golang項(xiàng)目

網(wǎng)址為 。

介紹:Go語言的早期源碼使用C語言和匯編語言寫成。從Go 1.5版本自舉后,完全使用Go語言自身進(jìn)行編寫。Go語言的源碼對(duì)了解Go語言的底層調(diào)度有極大的參考意義,建議希望對(duì)Go語言有深入了解的讀者讀一讀。

3.Kubernetes項(xiàng)目

網(wǎng)址為 。

介紹:Google公司開發(fā)的構(gòu)建于Docker之上的容器調(diào)度服務(wù),用戶可以通過Kubernetes集群進(jìn)行云端容器集群管理。

4.etcd項(xiàng)目

網(wǎng)址為 。

介紹:一款分布式、可靠的KV存儲(chǔ)系統(tǒng),可以快速進(jìn)行云配置。

5.beego項(xiàng)目

網(wǎng)址為 。

介紹:beego是一個(gè)類似Python的Tornado框架,采用了RESTFul的設(shè)計(jì)思路,使用Go語言編寫的一個(gè)極輕量級(jí)、高可伸縮性和高性能的Web應(yīng)用框架。

6.martini項(xiàng)目

網(wǎng)址為 。

介紹:一款快速構(gòu)建模塊化的Web應(yīng)用的Web框架。

7.codis項(xiàng)目

網(wǎng)址為 Labs/codis。

介紹:國產(chǎn)的優(yōu)秀分布式Redis解決方案。

8.delve項(xiàng)目

網(wǎng)址為 。

介紹:Go語言強(qiáng)大的調(diào)試器,被很多集成環(huán)境和編輯器整合。


標(biāo)題名稱:從源碼開始分析go語言 go語言開源嗎
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/ddooodj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部