Golang獲取本地IP地址方法,目前了解兩種,記錄如下:
創(chuàng)新互聯(lián)公司公司2013年成立,先為臺前等服務建站,臺前等地企業(yè),進行企業(yè)商務咨詢服務。為臺前企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
方法1:
網(wǎng)關(guān)=反向代理+負載均衡+各種策略,技術(shù)實現(xiàn)也有多種多樣,有基于 nginx 使用 lua 的實現(xiàn),比如 openresty、kong;也有基于 zuul 的通用網(wǎng)關(guān);還有就是 golang 的網(wǎng)關(guān),比如 tyk。
這篇文章主要是講如何基于 golang 實現(xiàn)一個簡單的網(wǎng)關(guān)。
轉(zhuǎn)自: troy.wang/docs/golang/posts/golang-gateway/
整理:go語言鐘文文檔:
啟動兩個后端 web 服務(代碼)
這里使用命令行工具進行測試
具體代碼
直接使用基礎(chǔ)庫 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy對象實現(xiàn)了serveHttp方法,因此可以直接作為 handler。
具體代碼
director中定義回調(diào)函數(shù),入?yún)?http.Request,決定如何構(gòu)造向后端的請求,比如 host 是否向后傳遞,是否進行 url 重寫,對于 header 的處理,后端 target 的選擇等,都可以在這里完成。
director在這里具體做了:
modifyResponse中定義回調(diào)函數(shù),入?yún)?http.Response,用于修改響應的信息,比如響應的 Body,響應的 Header 等信息。
最終依舊是返回一個ReverseProxy,然后將這個對象作為 handler 傳入即可。
參考 2.2 中的NewSingleHostReverseProxy,只需要實現(xiàn)一個類似的、支持多 targets 的方法即可,具體實現(xiàn)見后面。
作為一個網(wǎng)關(guān)服務,在上面 2.3 的基礎(chǔ)上,需要支持必要的負載均衡策略,比如:
隨便 random 一個整數(shù)作為索引,然后取對應的地址即可,實現(xiàn)比較簡單。
具體代碼
使用curIndex進行累加計數(shù),一旦超過 rss 數(shù)組的長度,則重置。
具體代碼
輪詢帶權(quán)重,如果使用計數(shù)遞減的方式,如果權(quán)重是5,1,1那么后端 rs 依次為a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端會瞬間壓力過大;參考 nginx 內(nèi)部的加權(quán)輪詢,或者應該稱之為平滑加權(quán)輪詢,思路是:
后端真實節(jié)點包含三個權(quán)重:
操作步驟:
具體代碼
一致性 hash 算法,主要是用于分布式 cache 熱點/命中問題;這里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本滿足流量綁定,一旦后端目標節(jié)點故障,會自動平移到環(huán)上最近的那么個節(jié)點。
實現(xiàn):
具體代碼
每一種不同的負載均衡算法,只需要實現(xiàn)添加以及獲取的接口即可。
然后使用工廠方法,根據(jù)傳入的參數(shù),決定使用哪種負載均衡策略。
具體代碼
作為網(wǎng)關(guān),中間件必不可少,這類包括請求響應的模式,一般稱作洋蔥模式,每一層都是中間件,一層層進去,然后一層層出來。
中間件的實現(xiàn)一般有兩種,一種是使用數(shù)組,然后配合 index 計數(shù);一種是鏈式調(diào)用。
具體代碼
實際業(yè)務:go 二進制文件在私有化部署中,需要對客戶的服務器mac和ip進行綁定,系統(tǒng)只能運行在綁定的服務器上。把mac和ip地址配置到config中。
運行效果:系統(tǒng)可正常編譯,正常訪問,在用戶Auth接口進行核對。
//檢驗Mac和內(nèi)網(wǎng)IP,測試環(huán)境不做校驗
func (c *CommonBase)CheckMacAndIp()error {
ipCfg :=g.Cfg().GetString("machine.Ipaddr")
macCfg :=g.Cfg().GetString("machine.Macip")
if ipCfg =="127.0.0.1" {
return nil
}
macArray,_ :=gipv4.GetMacArray()
if len(macArray) ==0 {
return gerror.New("mac地址獲取失敗")
}
if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {
return gerror.New("示授權(quán)的應用MAC,請聯(lián)系")
}
ipArray,_ :=gipv4.GetIpArray()
ipIntranetArray,_ :=gipv4.GetIntranetIpArray()
if len(ipArray) ==0 len(ipIntranetArray) ==0 {
return gerror.New("ip地址獲取失敗")
}
if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {
return gerror.New("示授權(quán)的應用IP,請聯(lián)系")
}
return nil
}
項目使用GoFrame框架1.6??紤]到客戶可能會對內(nèi)存數(shù)據(jù)做分析破解,可以把mac和ip地址做AES加密。