Springboot集成ip2region离线IP地名映射-修订版
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源码地址

相关文章:
Springboot集成ip2region离线IP地名映射-修订版
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. 响应实例DataBlock2.4. 响应实例RegionAddress 3. 打开浏览器4. 源码地址&…...
智能驾驶系列报告之一:智能驾驶 ChatGPT时刻有望来临
原创 | 文 BFT机器人 L3 功能加速落地,政策标准有望明确 L2 发展日益成熟,L3 功能加速落地。根据市场监管总局发布的《汽车驾驶自动化分级》与 SAE发布的自动驾驶分级标准,自动驾驶主要分为 6 个级别(0 级到 5 级,L0 …...
设计HTML5文档结构
定义清晰、一致的文档结构不仅方便后期维护和拓展,同时也大大降低了CSS和JavaScript的应用难度。为了提高搜索引擎的检索率,适应智能化处理,设计符合语义的结构显得很重要。 1、头部结构 在HTML文档的头部区域,存储着各种网页元…...
vue echarts中按钮点击后修改值 watch数据变化后刷新图表
1 点击按钮 {feature: {myBtn1: {show: true,title: 反转Y轴,showTitle: true,icon: path://M512 0A512 512 0 1 0 512 1024A512 512 0 0 0 512 0M320 320V192h384v128zM128 416V288h256v128zM320 704V576h384v128zM128 800V672h256v128z,onclick: () > {dataSetting.rever…...
React antd tree树组件 - 父子节点没有自动关联情况下 - 显示半选、全选状态以及实现父子节点互动
实现的效果图如下: 如Ant Design Vue 中所示,并没有提供获取半选节点的方法,当设置checked和checkStrictly时,父子节点也不再自动关联了 前提:从后端可以获取的数据分别是完整的树型数据、所有选中的节点数据&#…...
优漫动游 大厂需要什么样的ui设计师呢?
通常来说大公司UI设计的流程主要是这样的:创意-头脑风暴-策划方案-交互设计&评审-美术设计&评审-开发实施,不过实际上大多数公司都有自己的一套流程,源于公司的基因、公司组织体系、公司领导风格。一起了解大厂需要什么样的ui设计师呢…...
TiDB Bot:用 Generative AI 构建企业专属的用户助手机器人
本文介绍了 PingCAP 是如何用 Generative AI 构建一个使用企业专属知识库的用户助手机器人。除了使用业界常用的基于知识库的回答方法外,还尝试使用模型在 few shot 方法下判断毒性。 最终,该机器人在用户使用后,点踩的比例低于 5%࿰…...
uniapp 使用canvas画海报(微信小程序)
效果展示: 项目要求:点击分享绘制海报,并实现分享到好友,朋友圈,并保存 先实现绘制海报 <view class"data_item" v-for"(item,index) in dataList" :key"index"click"goDet…...
TiDB 应急运维脚本,更加方便的管理TiDB集群
TiDB 应急运维脚本,更加方便的管理TiDB集群 使用方法 使用方法:[tidblocalhost ~]$ which tiup ~/.tiup/bin/tiup编辑脚本,MYSQL_PASSWD 和 PORT 根据实际替换 [tidblocalhost ~]$ vi ~/.tiup/bin/ti#version 1.1 #author guanguanglei ##…...
第二部分:AOP
一、AOP简介 AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。 AOP是OOP(面向对象编程)的进阶版。 作用:在不改变原始设计的基础上为其进行功能增强。 spring理念&#x…...
分享一组天气组件
先看效果: CSS部分代码(查看更多): <style>:root {--bg-color: #E9F5FA;--day-text-color: #4DB0D3;/* 多云 */--cloudy-background: #4DB0D3;--cloudy-temperature: #E6DF95;--cloudy-content: #D3EBF4;/* 晴 */--sunny-b…...
微服务中RestTemplate访问其他服务返回值转换问题
背景: 接收一个springcloud项目,UI模块访问其他服务的接口,返回数据统一都是使用fastjson进行转换,但是新开发了几个新模块之后发现fastjson很多bug(各种内存溢出),但是很多地方已经重度依赖fa…...
Centos7.9上(离线)安装Gitlab
1、下载Gitlab的rpm安装包Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm,如果依赖缺失,yum安装即可 3、vi /etc/gitlab/gitlab.rb 配置external_url&…...
pikachu中RCE出现乱码的解决的方案
exec “ping” 输入127.0.0.1 这种乱码的解决办法就是在pikachu/vul/rce/rce_ping.php目录里面的第18行代码 header("Content-type:text/html; charsetgbk");的注释打开即可。 BUT但是吧!又出现了其他的乱码!但是搞完这个再把它给注释掉就行了…...
airflow是什么
Airflow 简介 Airflow是一个基于有向无环图(DAG)的可编程、调度和监控的工作流平台,它可以定义一组有依赖的任务,按照依赖依次执行。airflow提供了丰富的命令行工具用于系统管控,而其web管理界面同样也可以方便的管控调度任务,并…...
训练用于序列分类任务的 RoBERTa 模型的适配器
介绍 NLP当前的趋势包括下载和微调具有数百万甚至数十亿参数的预训练模型。然而,存储和共享如此大的训练模型非常耗时、缓慢且昂贵。这些限制阻碍了 RoBERTa 模型开发更多用途和适应性更强的 NLP 技术,该模型可以从多个任务中学习并针对多个任务进行学习;在本文中,我们将重…...
Linux之awk判断和循环
echo zhaoy 70 72 74 76 74 72 >> score.txt echo wangl 70 81 84 82 90 88 >> score.txt echo qiane 60 62 64 66 65 62 >> score.txt echo sunw 80 83 84 85 84 85 >> score.txt echo lixi 96 80 90 95 89 87 >> score.txt把下边的内容写入到s…...
Django入门
Day1 django环境安装 创建虚拟环境 # step1 创建虚拟环境 python3 -m venv datawhale_django # step2 mac进入虚拟环境 source ./datawhale_django/bin/activate # step3 退出虚拟环境 deactivate安装包 pip3 install django pip3 install djangorestframework pip3 …...
uniapp 格式化时间刚刚,几分钟前,几小时前,几天前…
效果如图: 根目录下新建utils文件夹,文件夹下新增js文件,文件内容: export const filters {dateTimeSub(data) {if (data undefined) {return;}// 传进来的data必须是日期格式,不能是时间戳//将字符串转换成时间格式…...
JProfiler —CPU评测
当JProfiler测量方法调用的执行时间及其调用堆栈时,我们称之为“CPU评测”。这些数据以多种方式呈现。根据你试图解决的问题,其中一个或另一个演示将是最有帮助的。默认情况下不会记录CPU数据,您必须打开CPU记录才能捕获有趣的用例。 一、调…...
无机布防火卷帘门报价透明,包工包料,一次说清所有费用
很多客户在选购无机布防火卷帘门时,最关心实际成交价格,也担心报价不清晰,后期产生各类额外支出。行业内产品定价参差不齐,选材做工不同,最终价位自然存在差距,挑选时不能只看表面低价。 👉 点击…...
2026在线测评系统十大量表对比:信效度与场景全解析
【30s 核心摘要】2026 年在线测评成人才管理刚需,信效度与场景适配成选型核心。本文聚焦十大量表,从信度、效度、适配场景等维度深度对比,重点解析问卷星、北森、金数据等主流平台的量表能力与落地效果,为企业、高校及机构提供科学…...
从Gamma函数到泊松分布:一个概率论中的含参量积分实用案例解析
Gamma函数与泊松分布:概率论中的数学之美 在数据科学和机器学习的实践中,概率分布构成了建模的基石。当我们深入探究这些分布背后的数学原理时,Gamma函数以其优雅的性质和广泛的应用脱颖而出。它不仅连接了离散与连续概率世界,更在…...
BurpSuite 2025插件开发JDK版本兼容性实战指南
1. 为什么BurpSuite插件开发环境总在JDK版本上翻车?你是不是也经历过:下载好BurpSuite最新版2025.4,兴冲冲打开插件开发文档,照着官方示例写完第一个HelloWorld插件,一编译——java.lang.UnsupportedClassVersionError…...
2026论文降AI怎么挑?亲测好用工具附免费降AI指南
“您的论文AIGC率为42%,超出学校30%的合格线,请修改后重新提交。”赶毕业论文的同学这段时间估计没少收到这样的提醒。2026年知网、万方、维普等主流平台的AI检测算法持续迭代,把AI生成内容改到符合学校要求,已经成了毕业生的刚需…...
1901-2022年中国气温变化分析实战:用这份1km栅格数据我们能发现什么?
1901-2022年中国气温变化分析实战:如何从1km栅格数据中挖掘气候演变规律当一份覆盖122年、分辨率精确到1公里的气温栅格数据摆在面前时,我们看到的不仅是数字矩阵,更是一部写在经纬度坐标里的气候变迁史诗。这份由逐月数据聚合生成的逐年气温…...
随机森林算法在儿童出行方式预测中的实战应用与优化
1. 项目概述:用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候,你肯定想过一个问题:孩子们到底是怎么上学的?是走路、骑车、坐公交还是家长开车送?这个问题看似简单,背后却牵扯到城市规划…...
基于Arduino与nRF24L01+的无线传感器平台设计与部署指南
1. 项目概述与设计思路如果你和我一样,喜欢在阳台或者小院子里种点蔬菜瓜果,那你肯定也遇到过这样的烦恼:出门几天,心里总惦记着家里的番茄苗是不是缺水了,小温室里的温度会不会太高。传统的温湿度计只能让你在现场读数…...
破解材料数据荒:合成数据与随机森林预测聚合物阻燃性能
1. 项目概述与核心挑战在材料研发领域,尤其是涉及公共安全的聚合物阻燃性研究,传统实验方法正面临巨大瓶颈。想象一下,你是一位材料工程师,需要设计一种用于高铁内饰或高层建筑电缆护套的新型聚合物,其阻燃性能必须满足…...
独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目 对于独立开发者或小型团队而言,启动一个集成…...
