首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 根據 IP 地址獲取地理位置(新浪/騰訊/淘寶接口對比)

     編輯:Java 相關知識

三大免費接口對比

接口URL 示例返回格式性能(10萬次測試)穩定性
新浪https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=JS 變量~9萬/分鐘高
淘寶https://ip.taobao.com/service/getIpInfo.phpJSON~5萬/小時限流嚴格
騰訊需申請 KeyJSON較好需備案

新浪接口實現(推薦高併發場景)

public static String getIpInfoBySina(String ip) {
    String url = "https://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=" + ip;
    String js = HttpClientUtil.get(url); // 簡易 GET 請求
    if (js.contains("ret\":1")) {
        String province = extract(js, "province");
        String city = extract(js, "city");
        String district = extract(js, "district");
        String isp = extract(js, "isp");
        return province + city + district + isp;
    }
    return "";
}

// 從 JS 字符串提取字段值(處理 Unicode 轉義)
private static String extract(String js, String key) {
    String val = StringUtils.substringBetween(js, "\"" + key + "\":", ",");
    return val != null ? UnicodeUtils.decodeUnicode(val) : "";
}

淘寶接口實現(含 Unicode 解碼工具類)

public String getAddresses(String ip) {
    String url = "https://ip.taobao.com/service/getIpInfo.php";
    String param = "ip=" + ip;
    String json = HttpUtil.post(url, param, "utf-8");
    // 解析 JSON 並提取 country, area, region, city, county, isp
    // 附帶完整 decodeUnicode 實現
}

性能優化關鍵:本地緩存

// 簡單 Map 緩存,實際建議用 Guava Cache / Caffeine / Redis
private static final Map IP_CACHE = new ConcurrentHashMap<>();

public String getLocation(String ip) {
    return IP_CACHE.computeIfAbsent(ip, this::callRemoteApi);
}

實測:淘寶接口 5 萬次耗時 1 小時,加入本地緩存後重複查詢耗時 < 1ms。

百萬級日誌 IP 解析架構建議

  1. 離線批量處理:MapReduce / Spark 分布式調用接口,結果落地 HBase/ES。
  2. 接口限流應對:申請商業版 API、自建 IP 庫(如 MaxMind GeoIP2)、多接口輪詢降級。
  3. 異步非阻塞 IO:Netty / HttpClient 5.x 連接池 + CompletableFuture 提升吞吐。

總結

高併發實時查詢首選新浪接口 + 本地緩存;離線分析建議自建 IP 庫或購買商業服務;切勿直接在業務主流程同步調用遠程接口。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved