目前,许多项目在用户发布言论时需要解析其 IP 地址,并且在账号管理中也有查看最近登录地的需求。然而,市面上的相关教程通常缺乏全面性,往往只提供一种简单的方法,导致在技术方案选型时难以进行有效的方案对比。本文旨在对常见的 IP 地址地理位置解析方案进行系统化分析和对比,以期为独立开发者或刚接触该领域的开发者提供指导与帮助。
文章目录
- 1.概述
- 2.使用场景
- 3.方案对比
- 3.1使用谁的库
- 3.1.1 免费库
- 3.1.2 商业库
- 3.2 在线还是离线
- 3.2.1 在线
- 3.2.2 离线
- 3.3 客户端还是服务端
- 3.3.1 服务端
- 3.3.2 客户端
- 3.4 完整方案对比
1.概述
需要明确的是,要想把 IP 地址解析为地理位置,没有什么取巧的方案,毫无例外都是拿一些比较权威的库来对比,从库中查找,有的厂商可能会自己收集 IP 地址与地理位置对应的库,有的厂商会采用保持高频率更新的三方库。对于独立开发者或者小微企业,如果想使用免费的方案,基本都是使用的市面上免费的开放库来比对。
关于这个方案的选型,其实核心就是三点:使用谁的库、在线还是离线、客户端还是服务端。
注:本文只做方案对比,并无代码实践,代码实践请看后续文章。
2.使用场景
最容易理解的场景,在抖音、知乎发表一些言论的时候,现在都会显示 IP 地址的归属地,如下图所示:
再比如,查看账号最近登陆地:
3.方案对比
使用开源的免费库,不可避免的会出现解析不到、准确率低等问题,因为免费库不会投入那么多人力去维护。
使用商业库一般就不会有这个问题,大都商业版本都会保持高频率的更新,且库本身非常的全面。
3.1使用谁的库
市面上使用最多的免费库就是纯真开源的免费库,且一般的工具大都是基于此免费库来进行。商业库有纯真的、
3.1.1 免费库
可以通过https://www.cz88.net/geo-public申请免费 IP 库的授权。很多 github 项目中也会有一些免费库,大部分都是基于纯真的库再加上用一些免费 API 接口更新部分数据得到的。
3.1.2 商业库
目前直接售卖库的比较少(估计倒卖是一个问题),且后期更新维护也是一个问题。纯真有精确到省级的离线库,需要付费购买,在阿里云上也有相关的入口:https://market.aliyun.com/apimarket/detail/cmapi00053387#sku=yuncode4738700005
3.2 在线还是离线
在线就是请求外部的 API 接口来获取地理位置,离线就是将库直接加载进项目里,本地查询。这二者最大的差别就是外部 API 耗时会长且具有不稳定性(虽然商业产品一般会保证其稳定性),离线的方式可以非常快速的做本地内存里的查询,但是要想定位准确,需要每隔一段时间更新一次库。
3.2.1 在线
提供此类 API 的厂商有很多,这里给出高德和纯真的例子:
高德:https://lbs.amap.com/api/webservice/guide/api-advanced/ip
纯真:https://www.cz88.net/geo
也有一些免费的方案,例如淘宝:https://ip.taobao.com/。
基本就是给个 IP 地址,它反给你一个地理位置信息。
3.2.2 离线
离线的话需要自己加载整个库到内存中,再基于此构造数据结构加快查询,目前市面上用的比较多的是 ip2region 的方案:https://github.com/lionsoul2014/ip2region,它定义了一套用于快速查询 ip 地址的数据结构,查询速度极快。如果自己有一个库,推荐依据项目中的说明转化成它的 xdb 数据格式,可以直接使用它封装的 java SDK,使用起来也非常便捷。
3.3 客户端还是服务端
关于放到使用客户端还是服务端,这里会有几种使用方式:
1(完全由服务端生成):服务端解析请求的 ip 地址(可采用同步或者异步的方式)。
2(客户端生成后再请求):客户端在发送请求之前先查询 ip 地址的地理信息,查询完后再请求接口。
3(客户端请求完再解析):客户端在查询展示时,接口返回了当时的 ip 地址,然后客户端再解析展示地理信息。这种只存在理论中的做法,一般不会使用,这样会造成客户端反复解析、暴露 ip 地址的问题。
所以一般默认服务端查询是使用方式 1,客户端查询是使用方式 2。
3.3.1 服务端
如果将查询放到服务端,那么需要考虑查询的效率的问题,如果是请求外部接口,最好采用异步的方式去查询,不影响接口本身。
3.3.2 客户端
如果将查询放到客户端,那么需要防止关键的 API key 被逆向后盗用。对于小程序场景可能还需要合理设计请求的时机,保证不影响主要业务的操作流程。
大部分厂商都有客户端解析 ip 地址的SDK。
纯真:https://www.cz88.net/sdk
3.4 完整方案对比
方案名称 | 是否付费 | 效率 | 稳定性 | 准确性 | 拓展性 |
---|---|---|---|---|---|
离线免费库+服务端查询 | 免费 | 本地查询,效率极高 | 稳定 | 低 | 低 |
离线商业库+服务端查询 | 付费 | 本地查询,效率极高 | 稳定 | 高 | 低 |
免费 API+服务端查询 | 免费 | 免费接口,效率低 | 不稳定 | 中(相对免费库来说准确率有所提升) | 中(一般来说不会怎么维护) |
商业 API+服务端查询 | 付费 | 付费接口,效率高,相对本地查询差距很大 | 稳定 | 极高(实时维护) | 高 |
商业 API+客户端查询 | 付费 | 付费接口,效率高,相对本地查询差距很大 | 稳定 | 极高(实时维护) | 中(涉及业务变更需要更改客户端逻辑) |
ATFWUS 2024-08-14