title: Springboot集成ip2region離線IP地名映射
date: 2020-12-16 11:15:34
categories: springboot
description: Springboot集成ip2region離線IP地名映射
- 1. 背景
- 2. 集成
- 2.1. 步驟
- 2.2. 樣例
- 2.3. 響應實例DataBlock
- 2.4. 響應實例RegionAddress
- 3. 打開瀏覽器
- 4. 源碼地址,如果覺得對你有幫助,請Star
1. 背景
前段時間因業務需要,客戶提出根據每天外網訪問進來IP地址,分析出來所屬地區,并且針對一些熱點區域的IP訪問想做到事后預警與特殊處理。
目前主流根據IP地址翻譯地區的做法主要有:在線查詢和離線查詢。
-
在線處理地址全,而且跟新頻率快,準確性較高。目前國內提供在線主要有:淘寶IP地址庫、IPIP.NET、138IP。
-
離線的方式就是根據IP的定義,自動翻譯為所屬地區。
但是考慮我們實際服務器都運行在內網,根據觸及不到公網,而且就算開放公網,面臨的風險還是很大,所以這種方案就被拋棄掉了。
而且他們在線翻譯的還有一個弊端,就是可能會在高峰期對我們的請求進行限流。不利于我們業務處理。
最終只剩下于是想到用離線的方式來處理從網關發來的數據。找了下,看到個開源項目ip2region
官網上介紹,這是一個 離線IP
地址定位庫和 IP
定位數據管理框架,可以提供 10微秒
級別的查詢效率,并且提供眾多主流編程語言的 X-DB
數據生成和查詢客戶端實現。
X-DB
概述:
X-DB 是一種基于大數據云架構時數據庫,主要處理工業生產過程數據的數據庫,具有 “海量數據” 處理能力,它的架構靈活,易于數據的部署、管理、擴充以及業務數據的集成;其數據可以分布在不同網絡的服務器和磁盤上,可以根據需要對數據進行動態擴展以便支持更大的數據量和訪問量,并且完全沒有任何限制。
- Ip2region參考1
- ip2region參考2
- XDB
使用起來相對成本較低,本著先用滿足需求再說,雖然在性能上并不能滿足海量IP的分析,還有提升的空間。
看作者的例子,較為簡單,也不多說。先看下我的目錄結構吧
war3-infi
+---src
| +---main
| | +---java
| | \---resources
| | +---generator
| | +---ipdb
| | | | +---ip2region.xdb
| | +---mapper
| | +---application.yml
2. 集成
2.1. 步驟
在上述的樣例中,我們將項目 Clone
到本地。
-
ip2region.xdb
這是需要下載,下載地址,這里提供Csv
、Txt
、XDB
文件三種格式,根據需要自行選擇。 -
ipdb
這是我放db庫文件的路徑,當然可以自定義,只需要在application.yml
中配置即可。 -
application.yml
這個就不多說啦。
2.2. 樣例
因我引入 Redis 此處可以棄用,將 Redis 注釋即可。
server:port: 9090spring:redis:database: 0host: 127.0.0.1port: 6379ip2region:external: falseindex-block-size: 4096total-header-size: 8192location: classpath:ipdb/ip2region.xdb
例子如下,RegionAddress
、DataBlock
兩種結果返回封裝,我們提供三種方式供選擇性輸入:
- /convert/{ip}:
- /region/{ip}:
- /region/ip={ip}:
package xyz.wongs.drunkard.war3.web.controller;import com.github.hiwepy.ip2region.spring.boot.IP2regionTemplate;
import com.github.hiwepy.ip2region.spring.boot.ext.RegionAddress;
import lombok.extern.slf4j.Slf4j;
import org.nutz.plugins.ip2region.DataBlock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import xyz.wongs.drunkard.base.aop.annotion.ApplicationLog;
import xyz.wongs.drunkard.base.message.annoation.ResponseResult;
import xyz.wongs.drunkard.base.message.exception.DrunkardException;
import xyz.wongs.drunkard.war3.limit.RequestLimit;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;/*** @ClassName IndexController* @Description * @author WCNGS@QQ.COM* @Github <a>https://github.com/rothschil</a>* @date 20/11/18 11:00* @Version 1.0.0
*/
@Slf4j
@RestController
@ResponseResult
public class IndexController {@AutowiredIP2regionTemplate template;/** 根據輸入IP地址,返回解析后的地址* @Description* @param ip* @return xyz.wongs.drunkard.base.message.response.ResponseResult* @throws* @date 2020/8/17 18:26*/@GetMapping(value = "/convert/{ip}")public DataBlock convertDataBlock(@PathVariable String ip){DataBlock dataBlock = null;try {dataBlock = template.binarySearch(ip);} catch (IOException e) {e.printStackTrace();}return dataBlock;}/** 根據輸入IP地址,返回解析后的地址* @Description* @param ip* @return xyz.wongs.drunkard.base.message.response.ResponseResult* @throws* @date 2020/8/17 18:26*/@RequestLimit(maxCount=3)@GetMapping(value = "/region/{ip}")public RegionAddress convert(@PathVariable String ip){RegionAddress regionAddress = null;try {regionAddress = template.getRegionAddress(ip);} catch (IOException e) {e.printStackTrace();}return regionAddress;}/** 根據輸入IP地址,返回解析后的地址* @Description* @param ip* @return xyz.wongs.drunkard.base.message.response.ResponseResult* @throws* @date 2020/8/17 18:26*/@GetMapping(value = "/region/ip={ip}")public RegionAddress caseInsensitive(@PathVariable String ip){RegionAddress regionAddress = null;try {regionAddress = template.getRegionAddress(ip);} catch (IOException e) {e.printStackTrace();}return regionAddress;}}
2.3. 響應實例DataBlock
package org.lionsoul.ip2region;/*** data block class* * @author chenxin<chenxin619315@gmail.com>
*/
public class DataBlock
{/*** city id */private int city_id;/*** region address*/private String region;/*** region ptr in the db file*/private int dataPtr;}
2.4. 響應實例RegionAddress
public class RegionAddress {private String country;private String province;private String city;private String area;private String ISP;public RegionAddress() {}/*** Translate this string "中國|華東|江蘇省|南京市|電信" to location fields.* @param region location region address info array*/public RegionAddress(String[] region) {this(region[0], region[2], region[3], region[1], region[4]);}
3. 打開瀏覽器
訪問 http://localhost:9090/region/ip=109.27.45.12
這是我之前一個例子,用來解析IP地址,獲取地域信息的。
4. 源碼地址,如果覺得對你有幫助,請Star
Github源碼地址
Gitee源碼地址