基于Go語(yǔ)言開(kāi)發(fā)一個(gè) IP 歸屬地查詢接口工具
在日常開(kāi)發(fā)中,IP 地址歸屬地查詢是一個(gè)常見(jiàn)需求:比如記錄用戶訪問(wèn)日志時(shí)展示用戶的地理位置,或在安全防護(hù)系統(tǒng)中分析異常登錄來(lái)源。本文將帶你用 Go 語(yǔ)言快速開(kāi)發(fā)一個(gè) IP 歸屬地查詢接口服務(wù)。
功能目標(biāo)
提供一個(gè) HTTP 接口,輸入 IP 地址返回歸屬地信息
支持查詢單個(gè) IP,也可擴(kuò)展成批量查詢
數(shù)據(jù)源可選擇:
- 本地離線 IP 數(shù)據(jù)庫(kù)(如 ip2region)
- 第三方 API(如 ip-api、ipinfo 等)
結(jié)果返回 JSON 格式
技術(shù)棧
Go 標(biāo)準(zhǔn)庫(kù):net/http、encoding/json
第三方庫(kù):
github.com/lionsoul2014/ip2region/binding/golang/xdb —— 離線 IP 數(shù)據(jù)庫(kù)解析
存儲(chǔ)方式:使用本地 ip2region.xdb 文件
項(xiàng)目結(jié)構(gòu)
ip-lookup/
├── main.go
├── ip2region.xdb # 離線數(shù)據(jù)庫(kù)文件
├── go.mod
核心代碼(main.go)
package main
import (
"encoding/json"
"log"
"net"
"net/http"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
)
// 響應(yīng)結(jié)構(gòu)
type IPInfo struct {
IP string `json:"ip"`
Region string `json:"region"`
Error string `json:"error,omitempty"`
}
var searcher *xdb.Searcher
func main() {
// 加載 ip2region 數(shù)據(jù)庫(kù)
var err error
searcher, err = xdb.NewWithFileOnly("ip2region.xdb")
if err != nil {
log.Fatalf("? 加載 ip2region.xdb 失敗: %v", err)
}
http.HandleFunc("/ip", queryIP)
log.Println("? IP 歸屬地查詢服務(wù)已啟動(dòng): http://localhost:8080/ip?addr=1.1.1.1")
http.ListenAndServe(":8080", nil)
}
func queryIP(w http.ResponseWriter, r *http.Request) {
addr := r.URL.Query().Get("addr")
if addr == "" {
writeJSON(w, IPInfo{Error: "缺少參數(shù) addr"})
return
}
if net.ParseIP(addr) == nil {
writeJSON(w, IPInfo{IP: addr, Error: "無(wú)效的 IP 地址"})
return
}
region, err := searcher.SearchByStr(addr)
if err != nil {
writeJSON(w, IPInfo{IP: addr, Error: err.Error()})
return
}
writeJSON(w, IPInfo{IP: addr, Region: region})
}
func writeJSON(w http.ResponseWriter, data IPInfo) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(data)
}
使用方法
1.初始化項(xiàng)目并安裝依賴
go mod init ip-lookup go get github.com/lionsoul2014/ip2region/binding/golang/xdb
2.下載 ip2region.xdb 數(shù)據(jù)庫(kù)文件,放到項(xiàng)目根目錄
3.運(yùn)行
go run main.go
4.請(qǐng)求示例
curl "http://localhost:8080/ip?addr=8.8.8.8"
返回結(jié)果示例:
{
"ip": "8.8.8.8",
"region": "美國(guó)|0|加利福尼亞|圣克拉拉|谷歌"
}
擴(kuò)展功能
- 批量查詢:支持上傳 IP 列表文件,返回批量結(jié)果
- 緩存機(jī)制:對(duì)高頻 IP 查詢做緩存,提升性能
- 前端展示:結(jié)合簡(jiǎn)單前端頁(yè)面展示查詢結(jié)果
- 多數(shù)據(jù)源支持:同時(shí)支持 ip2region 和第三方 API,作為備份
總結(jié)
通過(guò)本案例,我們實(shí)現(xiàn)了一個(gè) IP 歸屬地查詢接口,使用 ip2region 離線庫(kù)做到快速查詢,性能高效且無(wú)需依賴外部服務(wù)。這個(gè)小工具既能單獨(dú)運(yùn)行,也能嵌入到日志分析、Web 服務(wù)或安全監(jiān)控系統(tǒng)中使用,是 Go 項(xiàng)目開(kāi)發(fā)中的一個(gè)實(shí)用模塊。
到此這篇關(guān)于基于Go語(yǔ)言開(kāi)發(fā)一個(gè) IP 歸屬地查詢接口工具的文章就介紹到這了,更多相關(guān)Go查詢IP歸屬地內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用bcrypt實(shí)現(xiàn)密碼加密和校驗(yàn)的操作代碼
bcrypt可以用于數(shù)據(jù)庫(kù)中的用戶密碼保存,相比md5而言更加的安全可靠,這篇文章主要介紹了Golang使用bcrypt實(shí)現(xiàn)密碼加密和校驗(yàn)的操作代碼,需要的朋友可以參考下2024-05-05
golang簡(jiǎn)單獲取上傳文件大小的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang簡(jiǎn)單獲取上傳文件大小的方法,涉及Go語(yǔ)言文件傳輸及文件屬性操作的相關(guān)技巧,需要的朋友可以參考下2016-07-07
Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析
這篇文章主要為大家介紹了Golang?errgroup?設(shè)計(jì)及實(shí)現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
使用client-go工具調(diào)用kubernetes API接口的教程詳解(v1.17版本)
這篇文章主要介紹了使用client-go工具調(diào)kubernetes API接口(v1.17版本),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Go strconv包實(shí)現(xiàn)字符串與數(shù)值轉(zhuǎn)換的深度解析
在 Go 語(yǔ)言開(kāi)發(fā)中,字符串與基本數(shù)據(jù)類型之間的轉(zhuǎn)換非常常見(jiàn),Go 標(biāo)準(zhǔn)庫(kù)中的 strconv 包正是為這些場(chǎng)景設(shè)計(jì)的,下面小編就和大家詳細(xì)介紹一下它的具體應(yīng)用吧2026-03-03
golang程序?qū)觩rometheus過(guò)程
文章介紹了如何在Golang項(xiàng)目中集成Prometheus進(jìn)行監(jiān)控,包括安裝客戶端庫(kù)、定義和注冊(cè)指標(biāo)、暴露指標(biāo)端點(diǎn)、更新指標(biāo)值、配置標(biāo)簽和注冊(cè)表,以及生產(chǎn)環(huán)境的建議配置2025-10-10
Go語(yǔ)言實(shí)現(xiàn)配置熱加載的方法分享
web項(xiàng)目,經(jīng)常需要熱啟動(dòng)各種各樣的配置信息,一旦這些服務(wù)發(fā)生變更,我們需要重新啟動(dòng)web server,以使配置生效,實(shí)現(xiàn)配置熱加載,本文為大家整理了幾個(gè)方法實(shí)現(xiàn)這個(gè)需求,需要的可以參考下2023-05-05
Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法
本文主要介紹了Go實(shí)現(xiàn)分布式唯一ID的生成之雪花算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

