高性能 Rust 实现 GeoIP REST API 服务发布

本文介绍了 geoip 0.1.0 的发布,这是一个使用 Rust 编写的 REST API 服务,用于通过 IP 地址确定地理位置。服务支持自动更新 MaxMind 数据库、提供 OpenAPI 文档、Docker 部署,并包含为嵌入式系统转换时区等独特功能。

项目发布

geoip 0.1.0 项目已发布首个版本。该项目实现了一个通过 REST API 获取 IP 地址地理位置信息的服务。其目标是简化 GeoIP 功能在各种应用程序中的集成,使开发人员无需自行管理数据库更新和处理 MMDB 格式。代码使用 Rust 语言编写,以 MIT 许可证分发。支持在 Linux、macOS 及其他类 UNIX 系统上运行。

主要功能

  • 高性能与低内存占用:得益于使用编译为机器码且无垃圾回收器的语言。
  • 全面的地理位置信息:通过 REST API 提供 IP 地址信息(国家、城市、邮政编码、坐标、网络运营商等),数据基于 MaxMind GeoLite2(免费)和 MaxMind GeoIP2(付费)。
  • 便捷的端点设计
    • 可获取请求用户的当前 IP 地址(通过独立端点实现;主端点的 ip 参数为可选)。
    • 支持通过可选 API 密钥保护端点。
  • 灵活的数据库更新
    • 可配置的自动数据库更新(可从使用 Account ID 和 Licence Key 的 MaxMind 官方资源更新,也可从支持身份验证的自定义 URL 更新;可指定更新检查间隔)。
    • 支持通过 HTTP 直接从服务获取最新的数据库存档(允许将一个实例用作其他实例的代理源,从而减少 MaxMind 配额消耗)。
  • 独特的时区功能
    • 为所有包含 timezone 字段的结果自动生成额外的 posix_timezone 字段(例如,将 Europe/Paris 转换为 CET-1CEST,M3.5.0,M10.5.0/3)。这确保了在嵌入式设备(如 ESP32 及其他没有内置 tzdata 的 newlib 目标)上自动配置时区。此功能是同类解决方案中所不具备的。
    • 自动更新时区数据库(可配置间隔、来源和身份验证;默认使用 IANA 官方网站)。若禁用更新,则使用系统数据库。
  • 开发者友好工具
    • 提供用于手动发送请求的 Web 界面,包括可选的 OpenStreetMap 地图显示。
    • 提供 OpenAPI 规范和内置的 Swagger UI,便于与自有项目集成。
  • 快速部署:提供现成的 Docker 镜像以便快速部署。

Docker 部署示例

1
2
3
4
5
6
7
docker run \
    -e MAXMIND_ACCOUNT_ID=XXXX \
    -e MAXMIND_LICENCE_KEY=YYYY \
    -e OSM_TILES_URL="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" \  # 可选
    -v geoip_data:/data \
    -p 8080:8080 \
    ghcr.io/quoi-dev/geoip:latest

相关讨论摘要

发布新闻后,用户社区围绕技术细节、数据源和应用场景展开了讨论:

  1. 技术实现与数据源

    • 有用户询问技术细节,特别是仅需 CIDR 和国家信息的实现方式。
    • 讨论指出 MaxMind 是流行选择,但其免费和付费数据库对某些地区(如俄罗斯)的支持有限。提到了替代数据源,如 ip-location-dbipapi.is 以及俄罗斯联邦通信、信息技术和大众传媒监督局 (RKN) 分发的 MaxMind 格式数据库。
    • 关于 RKN 数据库来源的讨论,推测可能来自 Yandex 或自行收集,并指出所有 GeoIP 数据库都存在不准确之处(如 IP 归属地与注册地不符)。最佳的收集方式被认为需要像大型搜索引擎那样拥有海量用户数据。
  2. 项目性质与隐私

    • 有评论将此类开源项目与“监视”关联,但被其他用户反驳,指出开源项目本身并不意味着用于监视。
  3. 实际应用场景

    • 针对“VPN 时代是否需要 GeoIP”的疑问,讨论指出并非所有用户都使用 VPN,且 GeoIP 在地区性软件分发、内容分段等方面仍有实际用途。
    • 有用户提出了关于在代理服务器后方运行、信任特定 HTTP 头(如 X-Real-IP)以获取真实客户端 IP 的功能需求,并与现有解决方案(如 echoip)进行了对比。
  4. 网络环境差异

    • 讨论了不同地区 ISP 在分配公网 IPv4/IPv6 地址策略上的差异,反映了全球网络基础设施的不均衡性。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计