網(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。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、山陽網(wǎng)站維護(hù)、網(wǎng)站推廣。
這篇文章主要是講如何基于 golang 實(shí)現(xiàn)一個(gè)簡單的網(wǎng)關(guān)。
轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/
整理:go語言鐘文文檔:
啟動(dòng)兩個(gè)后端 web 服務(wù)(代碼)
這里使用命令行工具進(jìn)行測試
具體代碼
直接使用基礎(chǔ)庫 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對象實(shí)現(xiàn)了serveHttp方法,因此可以直接作為 handler。
具體代碼
director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請求,比如 host 是否向后傳遞,是否進(jìn)行 url 重寫,對于 header 的處理,后端 target 的選擇等,都可以在這里完成。
director在這里具體做了:
modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應(yīng)的信息,比如響應(yīng)的 Body,響應(yīng)的 Header 等信息。
最終依舊是返回一個(gè)ReverseProxy,然后將這個(gè)對象作為 handler 傳入即可。
參考 2.2 中的NewSingleHostReverseProxy,只需要實(shí)現(xiàn)一個(gè)類似的、支持多 targets 的方法即可,具體實(shí)現(xiàn)見后面。
作為一個(gè)網(wǎng)關(guān)服務(wù),在上面 2.3 的基礎(chǔ)上,需要支持必要的負(fù)載均衡策略,比如:
隨便 random 一個(gè)整數(shù)作為索引,然后取對應(yīng)的地址即可,實(shí)現(xiàn)比較簡單。
具體代碼
使用curIndex進(jìn)行累加計(jì)數(shù),一旦超過 rss 數(shù)組的長度,則重置。
具體代碼
輪詢帶權(quán)重,如果使用計(jì)數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會(huì)瞬間壓力過大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應(yīng)該稱之為平滑加權(quán)輪詢,思路是:
后端真實(shí)節(jié)點(diǎn)包含三個(gè)權(quán)重:
操作步驟:
具體代碼
一致性 hash 算法,主要是用于分布式 cache 熱點(diǎ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),中間件必不可少,這類包括請求響應(yīng)的模式,一般稱作洋蔥模式,每一層都是中間件,一層層進(jìn)去,然后一層層出來。
中間件的實(shí)現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計(jì)數(shù);一種是鏈?zhǔn)秸{(diào)用。
具體代碼
Go的三種安裝方式
Go有多種安裝方式,你可以選擇自己喜歡的。這里我們介紹三種最常見的安裝方式:
Go源碼安裝:這是一種標(biāo)準(zhǔn)的軟件安裝方式。對于經(jīng)常使用Unix類系統(tǒng)的用戶,尤其對于開發(fā)者來說,從源碼安裝可以自己定制。
Go標(biāo)準(zhǔn)包安裝:Go提供了方便的安裝包,支持Windows、Linux、Mac等系統(tǒng)。這種方式適合快速安裝,可根據(jù)自己的系統(tǒng)位數(shù)下載好相應(yīng)的安裝包,一路next就可以輕松安裝了。**推薦這種方式**
第三方工具安裝:目前有很多方便的第三方軟件包工具,例如Ubuntu的apt-get、Mac的homebrew等。這種安裝方式適合那些熟悉相應(yīng)系統(tǒng)的用戶。
最后,如果你想在同一個(gè)系統(tǒng)中安裝多個(gè)版本的Go,你可以參考第三方工具GVM,這是目前在這方面做得最好的工具,除非你知道怎么處理。
Go源碼安裝
在Go的源代碼中,有些部分是用Plan 9 C和ATT匯編寫的,因此假如你要想從源碼安裝,就必須安裝C的編譯工具。
在Mac系統(tǒng)中,只要你安裝了Xcode,就已經(jīng)包含了相應(yīng)的編譯工具。
在類Unix系統(tǒng)中,需要安裝gcc等工具。例如Ubuntu系統(tǒng)可通過在終端中執(zhí)行sudo apt-get install gcc
libc6-dev來安裝編譯工具。
在Windows系統(tǒng)中,你需要安裝MinGW,然后通過MinGW安裝gcc,并設(shè)置相應(yīng)的環(huán)境變量。
你可以直接去官網(wǎng)下載源碼,找相應(yīng)的goVERSION.src.tar.gz的文件下載,下載之后解壓縮到$HOME目錄,執(zhí)行如下代碼:
cd go/src
./all.bash
運(yùn)行all.bash后出現(xiàn)"ALL TESTS PASSED"字樣時(shí)才算安裝成功。
上面是Unix風(fēng)格的命令,Windows下的安裝方式類似,只不過是運(yùn)行all.bat,調(diào)用的編譯器是MinGW的gcc。
如果是Mac或者Unix用戶需要設(shè)置幾個(gè)環(huán)境變量,如果想重啟之后也能生效的話把下面的命令寫到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是寫入文件的,記得執(zhí)行bash .bashrc或者bash
.zshrc使得設(shè)置立馬生效。
如果是window系統(tǒng),就需要設(shè)置環(huán)境變量,在path里面增加相應(yīng)的go所在的目錄,設(shè)置gopath變量。
當(dāng)你設(shè)置完畢之后在命令行里面輸入go,看到如下圖片即說明你已經(jīng)安裝成功
圖1.1 源碼安裝之后執(zhí)行Go命令的圖
如果出現(xiàn)Go的Usage信息,那么說明Go已經(jīng)安裝成功了;如果出現(xiàn)該命令不存在,那么可以檢查一下自己的PATH環(huán)境變中是否包含了Go的安裝目錄。
關(guān)于上面的GOPATH將在下面小節(jié)詳細(xì)講解
Go標(biāo)準(zhǔn)包安裝
Go提供了每個(gè)平臺(tái)打好包的一鍵安裝,這些包默認(rèn)會(huì)安裝到如下目錄:/usr/local/go
(Windows系統(tǒng):c:\Go),當(dāng)然你可以改變他們的安裝位置,但是改變之后你必須在你的環(huán)境變量中設(shè)置如下信息:
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面這些命令對于Mac和Unix用戶來說最好是寫入.bashrc或者.zshrc文件,對于windows用戶來說當(dāng)然是寫入環(huán)境變量。
go語言作為google的一個(gè)主推語言,最近很多人都在研究,也花了一點(diǎn)時(shí)間對他的安裝進(jìn)行了測試,本人使用Sublime Text 2 + GoSublime + gocode
顧名思義首先是安裝Go,這里有很詳細(xì)的安裝說明, 或者(golang.org自己去找hosts),官方已經(jīng)支持Windows版本
下載解壓配置環(huán)境變量
“環(huán)境變量”(我的電腦-高級(jí)系統(tǒng)設(shè)置-環(huán)境變量),在系統(tǒng)變量的標(biāo)簽下,依次新建編輯如下幾個(gè)鍵值對:
(1). 新建 變量名:GOBIN 變量值 :c:\go\bin
(2). 新建 變量名:GOARCH 變量值:386
(3). 新建 變量名:GOOS 變量值:windows
(4). 新建 變量名: GOROOT 變量值:c:\go
(5). 編輯 Path 在Path的變量值的最后加上 %GOBIN%
1. 下載 Sublime Text 2,地址如下:
2. 解壓以后,雙擊 sublime_text,就可以使用 Sublime Text 2 了。
破解:
用 WinHex 編輯 sublime_text_backup.exe 文件, 跳到 000CBB70 那一行,將該行的 8A C3 修改為 B0 01 然后保存
破解注冊成功
3. 安裝 Package Control,在打開 Sublime Text 2以后,按下快捷鍵 Ctrl + `,打開命令窗行(具體在view——show Console),并回車:
import urllib2,os; pf=’Package Control.sublime-package’; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),’wb’).write(urllib2.urlopen(‘’+pf.replace(‘ ‘,’%20′)).read()); print ‘Please restart Sublime Text to finish installation’
4. 重啟Sublime Text 2后,就可以發(fā)現(xiàn)在 Preferences菜單下,多出一個(gè)菜單項(xiàng) Package Control。
5.現(xiàn)在安裝GoSublime插件了,按住Ctrl+Shilft+p會(huì)彈出一個(gè)對話框輸入install回車彈出一個(gè)安裝包的對話框
同上輸入GoSublime選擇GoSublime回車
本機(jī)已經(jīng)安裝所以沒有出現(xiàn)選項(xiàng),輸入Go build選中回車(這個(gè)屬于可選)
到此GoSublime安裝成功
6.下面安裝gocode,
首安裝 Git-1.7.11-preview20120710。
打開控制臺(tái),輸入以下內(nèi)容:
go get github.com/nsf/gocode
go install github.com/nsf/gocode
go get github.com/DisposaBoy/MarGo
go install github.com/DisposaBoy/MarGo
也可以去github下載(要安裝google的git版本管理工具)
安裝完成后,我們可以在 go/bin 目錄下,發(fā)現(xiàn)多出了個(gè) gocode 文件。(一定要放在bin目錄下)
7. 修改GoSublime配置:在 Preferences菜單下,找到Package Settings,然后找到 GoSublime,再往下找到 Settings – Default。再打開的文件中,添加如下配置,并保存:
"env": {"path":"c:/go/bin;" },
好了,到目前為止,開發(fā)環(huán)境搭建完成。
下面可以自由編程了。呵呵。
按下快捷鍵 Ctrl + b 界面下方會(huì)出現(xiàn)如下界面:
好了,到現(xiàn)在,開發(fā)環(huán)境就搭建完畢了。
如下是內(nèi)容我這邊沒有使用照樣可以使用:
sublime Text 2 編譯配置設(shè)置方法
tools-build system-new build system 新建一個(gè)配置文件 設(shè)置為
{
“cmd”: ["go", "run", "$file_name"],
“file_regex”: “^[ ]*File \”(…*?)\”, line ([0-9]*)”,
“working_dir”: “$file_path”,
“selector”: “source.go”
}
然后就可以用ctrl+b 編譯了
保存
首先需要下載下載go平臺(tái)安裝包
安裝程序 下載地址址h如果是您的系統(tǒng)是windows32 位系統(tǒng)請選擇go1.3.3.windows-386.msi即可,其他的,請按照自己所需版本來進(jìn)行下載,如下圖所示:
安裝以及配置環(huán)境變量
由于Windows下的的安裝包有兩種:msi和zip的;zip的是免安裝的,解壓在配置一些環(huán)境變量之后就可以使用,msi的則是安裝包版本的,安裝的時(shí)候會(huì)設(shè)置好對應(yīng)的環(huán)境變量。我的電腦是Win7 64位,因?yàn)榉奖?,就下載了下面的版本。下好安裝包后,安裝過程就很簡單了,一路“Next”就好了。 雖然msi會(huì)自動(dòng)配置一些環(huán)境變量,但是本人在安裝完之后還是自己配置了環(huán)境變量,所以在安裝完Go之后,我們最好還是檢查一些所有的環(huán)境變量是否正常。主要的環(huán)境變量有以下幾個(gè):
GOROOT:Go的安裝目錄
GOPATH:用于存放Go語言Package的目錄,這個(gè)目錄不能在Go的安裝目錄中
GOBIN:Go二進(jìn)制文件存放目錄,寫成%GOROOT%\bin就好
GOOS:操作系統(tǒng)
GOARCH:指定系統(tǒng)環(huán)境,i386表示x86,amd64表示x64
PATH:需要將%GOBIN%加在PATH變量的最后,方便在命令行下運(yùn)行Go
如下圖所示:
像我自己安裝的,下載完成之后解壓到任意目錄(所有目錄均不能使用中文):D:\Go;
然后是go環(huán)境變量的配置:
GOARCH:386(go安裝版本)
GOBIN:D:\Go\bin(exe執(zhí)行文件路徑)
GOOS:windows(go運(yùn)行的系統(tǒng))
GOROOT:D:\Go(go的解壓路徑)
GOPATH:E:\go\data(go的工具包路徑,隨意指定,后面會(huì)用到)
然后在path環(huán)境變量中追加:;%GOBIN%
完成之后在cmd窗口輸入:go version,如下圖所示: