Go语言实战案例-项目实战篇:开发一个 IP 归属地查询接口

在日常开发中,IP 地址归属地查询 是一个常见需求:比如记录用户访问日志时展示用户的地理位置,或在安全防护系统中分析异常登录来源。本文将带你用 Go 语言 快速开发一个 IP 归属地查询接口服务。


功能目标

  1. 提供一个 HTTP 接口,输入 IP 地址返回归属地信息

  2. 支持查询单个 IP,也可扩展成批量查询

  3. 数据源可选择:

    • 本地离线 IP 数据库(如 ip2region)
    • 第三方 API(如 ip-api、ipinfo 等)
  4. 结果返回 JSON 格式


技术栈

  • Go 标准库 :net/http、encoding/json

  • 第三方库:

    • github.com/lionsoul2014/ip2region/binding/golang/xdb ------ 离线 IP 数据库解析
  • 存储方式 :使用本地 ip2region.xdb 文件


项目结构

go 复制代码
ip-lookup/
├── main.go
├── ip2region.xdb   # 离线数据库文件
├── go.mod

核心代码(main.go)

go 复制代码
package main

import (
	"encoding/json"
	"log"
	"net"
	"net/http"

	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
)

// 响应结构
type IPInfo struct {
	IP      string `json:"ip"`
	Region  string `json:"region"`
	Error   string `json:"error,omitempty"`
}

var searcher *xdb.Searcher

func main() {
	// 加载 ip2region 数据库
	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 归属地查询服务已启动: 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: "缺少参数 addr"})
		return
	}

	if net.ParseIP(addr) == nil {
		writeJSON(w, IPInfo{IP: addr, Error: "无效的 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. 初始化项目并安装依赖
bash 复制代码
go mod init ip-lookup
go get github.com/lionsoul2014/ip2region/binding/golang/xdb
  1. 下载 ip2region.xdb 数据库文件,放到项目根目录

  2. 运行

bash 复制代码
go run main.go
  1. 请求示例
bash 复制代码
curl "http://localhost:8080/ip?addr=8.8.8.8"

返回结果示例:

json 复制代码
{
  "ip": "8.8.8.8",
  "region": "美国|0|加利福尼亚|圣克拉拉|谷歌"
}

扩展功能

  1. 批量查询:支持上传 IP 列表文件,返回批量结果
  2. 缓存机制:对高频 IP 查询做缓存,提升性能
  3. 前端展示:结合简单前端页面展示查询结果
  4. 多数据源支持:同时支持 ip2region 和第三方 API,作为备份

总结

通过本案例,我们实现了一个 IP 归属地查询接口 ,使用 ip2region 离线库做到快速查询,性能高效且无需依赖外部服务。这个小工具既能单独运行,也能嵌入到日志分析、Web 服务或安全监控系统中使用,是 Go 项目开发中的一个实用模块。

相关推荐
tachibana236 分钟前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
蜗牛互联网10 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
Zhou14113611 小时前
SpringBoot_02_自动配置原理
java·spring boot·后端
子兮曰12 小时前
Node.js 50个优势场景盘点:一个人单干,为啥我多数时候只用它
前端·后端
IT_陈寒12 小时前
我花3小时debug,就因为JavaScript这个隐式转换坑
前端·人工智能·后端
程序猿阿越13 小时前
containerd如何拉取镜像
后端·kubernetes·源码阅读
一条小小yu13 小时前
为什么使用springboot
java·spring boot·后端
香瓜子rd13 小时前
MySQL InnoDB 并发控制核心原理:事务、隔离级别、MVCC 与锁机制
数据库·后端
RISCV_Explorer13 小时前
RISC-V RVV向量编程模型机制解析——vsetvl配置、掩码与尾元素策略及长度无关编程
后端·risc-v
对象存储与RustFS13 小时前
升级 RustFS 二进制不停机:一条一条换,留一条退路
后端·rust·开源