Golang結(jié)合ip2region實(shí)現(xiàn)ip歸屬地查詢
背景
最近公司做了一些營(yíng)銷(xiāo)活動(dòng),投入資金進(jìn)行了流量推廣,pv、UV都做了統(tǒng)計(jì)。老板說(shuō),我要看下用戶的區(qū)域分布的數(shù)據(jù)。
以前的文章我講過(guò),pv、UV如何統(tǒng)計(jì)?我們是基于ip進(jìn)行統(tǒng)計(jì)的。用的ip能獲取到,那通過(guò)ip查詢歸屬地就ok了。
思維擴(kuò)展下,ip 查詢歸屬地的的場(chǎng)景還蠻多的,我列舉一些:
場(chǎng)景
- 網(wǎng)絡(luò)安全調(diào)查:當(dāng)發(fā)生網(wǎng)絡(luò)攻擊或惡意行為時(shí),通過(guò)查詢IP地址的歸屬地可以幫助調(diào)查人員追蹤攻擊者的位置和身份,進(jìn)而采取相應(yīng)的應(yīng)對(duì)措施。
- 電商網(wǎng)站反欺詐:電商平臺(tái)可以通過(guò)查詢IP的歸屬地來(lái)檢測(cè)是否有異常行為,如異地登錄或使用虛假身份信息下單,從而防止欺詐行為發(fā)生。
- 廣告定向投放:在在線廣告市場(chǎng)中,根據(jù)用戶所在地區(qū)進(jìn)行IP歸屬地查詢可以幫助廣告主精準(zhǔn)定位目標(biāo)受眾,提高廣告投放效果和ROI。
- 地理位置服務(wù):地圖應(yīng)用、天氣預(yù)報(bào)和周邊生活服務(wù)等可以利用IP歸屬地查詢來(lái)確定用戶的大概地理位置,提供個(gè)性化的地理服務(wù)和信息。
- 網(wǎng)站流量分析:網(wǎng)站管理員可以利用IP歸屬地查詢來(lái)分析網(wǎng)站訪問(wèn)的地域分布情況,評(píng)估市場(chǎng)覆蓋范圍,制定針對(duì)性的營(yíng)銷(xiāo)策略和內(nèi)容優(yōu)化計(jì)劃。
這些具體的使用場(chǎng)景說(shuō)明了IP歸屬地查詢?cè)诰W(wǎng)絡(luò)安全、營(yíng)銷(xiāo)推廣、個(gè)性化服務(wù)等方面的重要作用,能夠幫助用戶更好地理解用戶行為和優(yōu)化業(yè)務(wù)流程。
谷歌搜索了下,第三方提供的ip查詢歸屬地服務(wù),挺多的,但是收費(fèi)、收費(fèi)、收費(fèi)?。?!免費(fèi)也有些,但是怕不穩(wěn)定。
無(wú)意間找到了ip2region這個(gè)項(xiàng)目,一直持續(xù)維護(hù)更新,試用后,效果杠桿的。那我們?cè)趺从玫?,繼續(xù)往下看
ip2region
Ip2region 是什么
ip2region - 是一個(gè)離線IP地址定位庫(kù)和IP定位數(shù)據(jù)管理框架,10微秒級(jí)別的查詢效率,提供了眾多主流編程語(yǔ)言的 xdb 數(shù)據(jù)生成和查詢客戶端實(shí)現(xiàn)。
Ip2region 特性
1、IP 數(shù)據(jù)管理框架
xdb 支持億級(jí)別的 IP 數(shù)據(jù)段行數(shù),默認(rèn)的 region 信息都固定了格式:國(guó)家|區(qū)域|省份|城市|ISP,缺省的地域信息默認(rèn)是0。 region 信息支持完全自定義,例如:你可以在 region 中追加特定業(yè)務(wù)需求的數(shù)據(jù),例如:GPS信息/國(guó)際統(tǒng)一地域信息編碼/郵編等。也就是你完全可以使用 ip2region 來(lái)管理你自己的 IP 定位數(shù)據(jù)。
2、數(shù)據(jù)去重和壓縮
xdb 格式生成程序會(huì)自動(dòng)去重和壓縮部分?jǐn)?shù)據(jù),默認(rèn)的全部 IP 數(shù)據(jù),生成的 ip2region.xdb 數(shù)據(jù)庫(kù)是 11MiB,隨著數(shù)據(jù)的詳細(xì)度增加數(shù)據(jù)庫(kù)的大小也慢慢增大。
3、極速查詢響應(yīng)
即使是完全基于 xdb 文件的查詢,單次查詢響應(yīng)時(shí)間在十微秒級(jí)別,可通過(guò)如下兩種方式開(kāi)啟內(nèi)存加速查詢:
- vIndex 索引緩存 :使用固定的 512KiB 的內(nèi)存空間緩存 vector index 數(shù)據(jù),減少一次 IO 磁盤(pán)操作,保持平均查詢效率穩(wěn)定在10-20微秒之間。
- xdb 整個(gè)文件緩存:將整個(gè) xdb 文件全部加載到內(nèi)存,內(nèi)存占用等同于 xdb 文件大小,無(wú)磁盤(pán) IO 操作,保持微秒級(jí)別的查詢效率。
Ip2region 支持那些語(yǔ)言
Ip2region大部分主流語(yǔ)言都支持,支持的語(yǔ)言如下:
Ip2region怎么用
在這里,我以golang語(yǔ)言作為演示,其他語(yǔ)言,可以看下官方文檔
例子:我需要查詢ip為:218.63.140.248 的歸屬地
下載ip2region.xdb包
訪問(wèn)ip2region 項(xiàng)目,ip的庫(kù)文件在data目錄下,點(diǎn)擊下載即可
package 獲取
go get github.com/lionsoul2014/ip2region/binding/golang
完全基于文件的查詢
package main import ( "fmt" "github.com/lionsoul2014/ip2region/binding/golang/xdb" "time" ) func main() { //dbPath寫(xiě)入你下載的ip2region.xdb文件的路徑,我這里放在了當(dāng)前目錄下 var dbPath = "ip2region.xdb" searcher, err := xdb.NewWithFileOnly(dbPath) if err != nil { fmt.Printf("failed to create searcher: %s\n", err.Error()) return } defer searcher.Close() // 查詢218.63.140.248對(duì)應(yīng)的地址 var ip = "218.63.140.248" var tStart = time.Now() region, err := searcher.SearchByStr(ip) if err != nil { fmt.Printf("failed to SearchIP(%s): %s\n", ip, err) return } fmt.Printf("{region: %s, took: %s}\n", region, time.Since(tStart)) // 備注:并發(fā)使用,每個(gè) goroutine 需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的 searcher 對(duì)象。 }
查詢結(jié)果
此ip的歸屬地為: 中國(guó)云南省昆明市電信
緩存整個(gè) xdb 數(shù)據(jù)
可以預(yù)先加載整個(gè) ip2region.xdb 到內(nèi)存,完全基于內(nèi)存查詢,類(lèi)似于之前的 memory search 查詢。
package main import ( "fmt" "github.com/lionsoul2014/ip2region/binding/golang/xdb" "time" ) func main() { //dbPath寫(xiě)入你下載的ip2region.xdb文件的路徑,我這里放在了當(dāng)前目錄下 var dbPath = "ip2region.xdb" // 1、從 dbPath 加載整個(gè) xdb 到內(nèi)存 cBuff, err := xdb.LoadContentFromFile(dbPath) if err != nil { fmt.Printf("failed to load content from `%s`: %s\n", dbPath, err) return } // 2、用全局的 cBuff 創(chuàng)建完全基于內(nèi)存的查詢對(duì)象。 searcher, err := xdb.NewWithBuffer(cBuff) if err != nil { fmt.Printf("failed to create searcher with vector index: %s\n", err) return } defer searcher.Close() // 查詢218.63.140.248對(duì)應(yīng)的地址 var ip = "218.63.140.248" var tStart = time.Now() region, err := searcher.SearchByStr(ip) if err != nil { fmt.Printf("failed to SearchIP(%s): %s\n", ip, err) return } fmt.Printf("{region: %s, took: %s}\n", region, time.Since(tStart)) // 備注:并發(fā)使用,每個(gè) goroutine 需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的 searcher 對(duì)象。 }
查詢結(jié)果:
方案比對(duì)
- 基于文件的查詢,響應(yīng)時(shí)間:38us
- 基于緩存的查詢,響應(yīng)時(shí)間:10.29µs
生成環(huán)境使用建議使用方式為:基于緩存的查詢
生產(chǎn)如何使用
以上的演示,只是個(gè)demo,如果要放在線上如何使用呢?
- 以sdk的形式嵌入到項(xiàng)目,使用基于緩存的查詢方式。
- ip查詢的場(chǎng)景很多,可以單獨(dú)構(gòu)建一個(gè)ip查詢的公共服務(wù),提高給各個(gè)業(yè)務(wù)線使用
sdk接入的方式,用到的業(yè)務(wù)線都需要對(duì)接一次,ip2region.xdb如果有更新,所有用到的項(xiàng)目都要自己去更新升級(jí)db文件,維護(hù)成本太高。如果你的項(xiàng)目比較單一,sdk接入也是不錯(cuò)的
我們的方案:因?yàn)槲覙I(yè)務(wù)線相對(duì)太多,如果各個(gè)業(yè)務(wù)線自己接,維護(hù)的成本太高。我們決定構(gòu)建IP查詢歸屬地公共服務(wù),往外提供查詢的能力。后續(xù)服務(wù)的升級(jí)、維護(hù)等,統(tǒng)一在公共服務(wù)里面來(lái)做。
以上就是Golang結(jié)合ip2region實(shí)現(xiàn)ip歸屬地查詢的詳細(xì)內(nèi)容,更多關(guān)于Go ip2region查詢ip歸屬地的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API實(shí)戰(zhàn)示例詳解
這篇文章主要為大家介紹了Gin與Mysql實(shí)現(xiàn)簡(jiǎn)單Restful風(fēng)格API示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11通過(guò)案例簡(jiǎn)單聊聊為什么說(shuō)Go中的字符串是不能被修改的
在接觸Go這么語(yǔ)言,可能你經(jīng)常會(huì)聽(tīng)到這樣一句話,對(duì)于字符串不能修改,可能你很納悶,日常開(kāi)發(fā)中我們對(duì)字符串進(jìn)行修改也是很正常的,為什么又說(shuō)Go中的字符串不能進(jìn)行修改呢,本文就來(lái)通過(guò)實(shí)際案例給大家演示,為什么Go中的字符串不能進(jìn)行修改2023-07-07Go語(yǔ)言實(shí)現(xiàn)開(kāi)發(fā)一個(gè)簡(jiǎn)單的gRPC Demo
這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)開(kāi)發(fā)一個(gè)簡(jiǎn)單的gRPC Demo,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-07-07深入了解Golang?哈希算法之MD5、SHA-1和SHA-256
哈希算法是計(jì)算機(jī)科學(xué)領(lǐng)域中一種重要的技術(shù),它將任意長(zhǎng)度的輸入數(shù)據(jù)映射為固定長(zhǎng)度的哈希值,在本篇文章中,我們將深入探討Golang中的哈希算法,從多個(gè)方面介紹其詳細(xì)內(nèi)容,希望通過(guò)本文的閱讀你將對(duì)?Golang哈希算法有更全面的理解2023-05-05Golang語(yǔ)言使用像JAVA?Spring注解一樣的DI和AOP依賴(lài)注入實(shí)例
這篇文章主要為大家介紹了Golang語(yǔ)言使用像JAVA?Spring注解一樣的DI和AOP依賴(lài)注入實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10深入解析Go語(yǔ)言中上下文超時(shí)與子進(jìn)程管理
這篇文章小編將通過(guò)一個(gè)實(shí)際問(wèn)題的案例,和大家深入探討一下Go語(yǔ)言中的上下文超時(shí)和子進(jìn)程管理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10使用client go實(shí)現(xiàn)自定義控制器的方法
本文我們來(lái)使用client-go實(shí)現(xiàn)一個(gè)自定義控制器,通過(guò)判斷service的Annotations屬性是否包含ingress/http,如果包含則創(chuàng)建ingress,如果不包含則不創(chuàng)建,對(duì)client go自定義控制器相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05Go高級(jí)特性探究之處理1分鐘百萬(wàn)請(qǐng)求詳解
對(duì)于大型的互聯(lián)網(wǎng)應(yīng)用程序,如電商平臺(tái)、社交網(wǎng)絡(luò)、金融交易平臺(tái)等,每秒鐘都會(huì)收到大量的請(qǐng)求,那么Go是如何處理這些百萬(wàn)請(qǐng)求的呢,下面就來(lái)和大家詳細(xì)講講2023-06-06Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05