為什么突然又繞到了apisix,其實(shí)是因?yàn)檎{(diào)研nginx-ingress就很容易聯(lián)想到是不是要替換為其他網(wǎng)關(guān)ingress實(shí)現(xiàn),比如apisix-ingress,進(jìn)而想到的肯定是apisix;
成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元資溪做網(wǎng)站,已為上家服務(wù),為資溪各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
這些概念到底有什么區(qū)別?
apisix 和 apisix-ingress-controller: apisix是一套體系,apisix-ingress-controller是k8s環(huán)境下基于go語(yǔ)言開發(fā)的一套自定義CRD,他負(fù)責(zé)響應(yīng)apisix自定義資源的創(chuàng)建,監(jiān)聽(tīng)k8s服務(wù)資源的創(chuàng)建變更,同步到apisix網(wǎng)關(guān),apisix網(wǎng)關(guān)本身由openresty、nginx組成,主要是由Lua語(yǔ)言在nginx執(zhí)行的各個(gè)階段插入鉤子,實(shí)現(xiàn)動(dòng)態(tài)化,且基于etcd+靈活的插件機(jī)制,讓變更更靈活且立即生效;
nginx-ingress和apisix-ingress-controller: nginx-ingress是k8s體系中目前使用最廣的路由網(wǎng)關(guān),比如阿里默認(rèn)的控制臺(tái)ingress創(chuàng)建就是使用的它;他集合了nginx+nginx-ingress-controller,拉代碼可以看出,nginx-ingress-controller完成了與k8sapiserver交互,獲取最新的服務(wù)配置變更,生成最新nginx配置,除此之外的通訊機(jī)制是通過(guò)Httppost請(qǐng)求將變更通知到到luanginx側(cè),ngx.timer在balancer中通過(guò)定時(shí)器進(jìn)行動(dòng)態(tài)化
apisix-ingress-controller監(jiān)控k8s服務(wù)變更、自定義CRD及資源創(chuàng)建、將配置同步到apisix;網(wǎng)絡(luò)請(qǐng)求通過(guò)apisix網(wǎng)關(guān)作為入口,通過(guò)apisix-ingress-controller同步k8s的上游變更
apisix比其他的有啥好?插件靈活,功能多,周邊
推薦一款專門為微服務(wù)架構(gòu)設(shè)計(jì)的開源 API 網(wǎng)關(guān)——Apinto,純 Go 語(yǔ)言開發(fā),沒(méi)有繁瑣的部署,沒(méi)有外部產(chǎn)品依賴,只需要下載并運(yùn)行即可,極為簡(jiǎn)單。
性能及穩(wěn)定性表現(xiàn)都不錯(cuò),并且可以自由擴(kuò)展幾乎所有功能模塊。 提供流量管理、數(shù)據(jù)處理、協(xié)議轉(zhuǎn)換等功能,例如動(dòng)態(tài)路由、負(fù)載均衡、服務(wù)發(fā)現(xiàn)、熔斷降級(jí)、身份認(rèn)證、監(jiān)控與告警等,優(yōu)勢(shì)明顯:
完全開源:Apinto 項(xiàng)目由 Eolinker 發(fā)起并長(zhǎng)期維護(hù),我們希望與全球開發(fā)者共同打造微服務(wù)生態(tài)的基礎(chǔ)設(shè)施。
優(yōu)異的性能表現(xiàn):相同環(huán)境下,Apinto比Nginx、Kong等產(chǎn)品快約50%,并且在穩(wěn)定性上也有所優(yōu)化。
豐富的功能:Apinto 提供了一個(gè)標(biāo)準(zhǔn)網(wǎng)關(guān)應(yīng)有的所有功能,并且你可以快速連接你的各個(gè)微服務(wù)以及管理網(wǎng)絡(luò)流量。
極低的使用和維護(hù)成本:Apinto 是純 Go 語(yǔ)言開發(fā)的開源網(wǎng)關(guān),沒(méi)有繁瑣的部署,沒(méi)有外部產(chǎn)品依賴,只需要下載并運(yùn)行即可,極為簡(jiǎn)單。
良好的擴(kuò)展性:Apinto 的絕大部分功能都是模塊化的,因此你可以很容易擴(kuò)展它的能力。
網(wǎng)關(guān)=反向代理+負(fù)載均衡+各種策略,技術(shù)實(shí)現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實(shí)現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。
這篇文章主要是講如何基于 golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)關(guān)。
轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/
整理:go語(yǔ)言鐘文文檔:
啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)
這里使用命令行工具進(jìn)行測(cè)試
具體代碼
直接使用基礎(chǔ)庫(kù) httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對(duì)象實(shí)現(xiàn)了serveHttp方法,因此可以直接作為 handler。
具體代碼
director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請(qǐng)求,比如 host 是否向后傳遞,是否進(jìn)行 url 重寫,對(duì)于 header 的處理,后端 target 的選擇等,都可以在這里完成。
director在這里具體做了:
modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。
最終依舊是返回一個(gè)ReverseProxy,然后將這個(gè)對(duì)象作為 handler 傳入即可。
參考 2.2 中的NewSingleHostReverseProxy,只需要實(shí)現(xiàn)一個(gè)類似的、支持多 targets 的方法即可,具體實(shí)現(xiàn)見(jiàn)后面。
作為一個(gè)網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:
隨便 random 一個(gè)整數(shù)作為索引,然后取對(duì)應(yīng)的地址即可,實(shí)現(xiàn)比較簡(jiǎn)單。
具體代碼
使用curIndex進(jìn)行累加計(jì)數(shù),一旦超過(guò) rss 數(shù)組的長(zhǎng)度,則重置。
具體代碼
輪詢帶權(quán)重,如果使用計(jì)數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會(huì)瞬間壓力過(guò)大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應(yīng)該稱之為平滑加權(quán)輪詢,思路是:
后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:
操作步驟:
具體代碼
一致性 hash 算法,主要是用于分布式 cache 熱點(diǎn)/命中問(wèn)題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿足流量綁定,一旦后端目標(biāo)節(jié)點(diǎn)故障,會(huì)自動(dòng)平移到環(huán)上最近的那么個(gè)節(jié)點(diǎn)。
實(shí)現(xiàn):
具體代碼
每一種不同的負(fù)載均衡算法,只需要實(shí)現(xiàn)添加以及獲取的接口即可。
然后使用工廠方法,根據(jù)傳入的參數(shù),決定使用哪種負(fù)載均衡策略。
具體代碼
作為網(wǎng)關(guān),中間件必不可少,這類包括請(qǐng)求響應(yīng)的模式,一般稱作洋蔥模式,每一層都是中間件,一層層進(jìn)去,然后一層層出來(lái)。
中間件的實(shí)現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計(jì)數(shù);一種是鏈?zhǔn)秸{(diào)用。
具體代碼
k8s是google公司使用go語(yǔ)言開發(fā),借鑒borg系統(tǒng)開發(fā)出來(lái)的。
k8s集群服務(wù)器主要分為兩類角色,分別為master和node。
api server: k8s網(wǎng)關(guān),所有指令請(qǐng)求都必須經(jīng)過(guò)apiserver。
scheduler: 調(diào)度器 根據(jù)調(diào)度算法,將請(qǐng)求資源調(diào)度到某一個(gè)node節(jié)點(diǎn)。
controller: 控制器,維護(hù)k8s資源對(duì)象。
etcd: 分布式存儲(chǔ)組件,用于存儲(chǔ)資源對(duì)象。
docker: 運(yùn)行容器的基礎(chǔ)環(huán)境,容器引擎。
kubelet: 每個(gè)node節(jié)點(diǎn)都存在一份,在node節(jié)點(diǎn)上的資源操作指令均由kubelet執(zhí)行,從etcd掃描相關(guān)請(qǐng)求,在節(jié)點(diǎn)上執(zhí)行請(qǐng)求。
kube-proxy: 代理服務(wù),負(fù)載均衡
fluentd: 日志收集服務(wù)
pod: 是k8s管理的基本單位(最小單元),pod 內(nèi)部是容器
k8s是用來(lái)管理容器的,但是不直接操作容器,最小操作單元為pod
特點(diǎn):
pod是一個(gè)虛擬化的分組(有自己的ip地址、主機(jī)名),pod相當(dāng)于獨(dú)立主機(jī),可以封裝一個(gè)或多個(gè)容器。通常情況下,一個(gè)pod中要么部署一個(gè)服務(wù),要么部署多個(gè)相關(guān)的服務(wù)
1、pod底層網(wǎng)絡(luò)和數(shù)據(jù)存儲(chǔ):
pod底層網(wǎng)絡(luò)和存儲(chǔ)主要依賴pause容器,該容器作用如下:
2、pod內(nèi)部容器使用localhost相互訪問(wèn)
3、pod內(nèi)部容器創(chuàng)建之前必須先創(chuàng)建pause
網(wǎng)站欄目:go語(yǔ)言開發(fā)網(wǎng)關(guān) go語(yǔ)言開源網(wǎng)關(guān)
文章URL:http://jinyejixie.com/article26/dohpicg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、、網(wǎng)站導(dǎo)航、App開發(fā)、搜索引擎優(yōu)化、網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)