最近有个需求是将ip地址转换为对应的行政区划,存入数据库,在网上查阅相关资料,有ip2Region实现方案,记录下来,方便备查。
一、知识介绍
ip2region.xdb 即离线 IP 数据管理框架和定位库,免费。
数据格式:城市Id|国家|区域|省份|城市|ISP
特点:
1)官方称99.9%数据准确率,数据聚合自淘宝/纯真/GeoIP的开放API或者数, 只有中国的数据精确到了城市。
2)毫秒级响应,支持多种方式调用,可内网使用。
缺点:
1)没有第三级县级的区划。
2)转换出来省有的是简称,如内蒙古,而非内蒙古自治区。
3)数据更新速度,db或xdb数据包形式,未对外提供自定义更新方案。
二、程序调用
第一步、引入依赖
本次使用的版本是 2.7.0
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.7.0</version>
</dependency>
第二步、定义结果bean
定义结果bean对象,存放结果集,即IpRegionCommon
@Data
public class IpRegionCommon {
/**
* 国家
*/
private String country;
/**
* 地区
*/
private String region;
/**
* 省
*/
private String province;
/**
* 市
*/
private String city;
/**
* 运营商
*/
private String isp;
}
第三步、测试调用
简单的读取文件,主要分为三步
1)创建 searcher 对象
2)调用方法查询
3)关闭资源
单元测试的代码如下所示,仅供参考。
@Test
public void testIp2Region() {
// 数据文件路径
String dbPath = "/home/admin/ip2region.xdb";
// 1、创建 searcher 对象
Searcher searcher = null;
try {
searcher = Searcher.newWithFileOnly(dbPath);
} catch (IOException e) {
System.out.printf("创建对象失败,错误信息为: %s\n", e);
return;
}
// 2、调用方法查询
try {
String ip = "1.202.176.226";
long sTime = System.nanoTime();
String region = searcher.search(ip);
long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
System.out.printf("{region: %s}\n", JsonUtils.parseObject(this.getReginResult(region)));
} catch (Exception e) {
System.out.printf("调用程序出错,错误信息为: %s\n", e);
}
// 3、关闭资源
try {
searcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 功能:转换结果
* @param region
* @return
*/
public IpRegionCommon getReginResult(String region) {
IpRegionCommon info = new IpRegionCommon();
// 国家|区域|省份|城市|ISP
String[] split = StringUtils.split(region, "|");
info.setCountry(split[0]);
info.setRegion(split[1]);
info.setProvince(split[2]);
info.setCity(split[3]);
info.setIsp(split[4]);
return info;
}
执行结果,如下图所示。
在参考文档 gitee 中提供三种实现方式,写的很好,推荐!
1)完全基于文件的查询
2)缓存 VectorIndex 索引
3)缓存整个 xdb 数据
参考文档
【1】https://gitee.com/lionsoul/ip2region/tree/master/binding/java