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

springboot

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 这是需要下载,下载地址,这里提供 CsvTxtXDB 文件三种格式,根据需要自行选择。

  • 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

例子如下,RegionAddressDataBlock 两种结果返回封装,我们提供三种方式供选择性输入:

  • /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源码地址

觉得对你有帮助,请Star

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenShift 4 - 基于 MinIO 安装 Red Hat Quay 镜像仓库

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.13 Quay 3.9 的环境中验证 本文适合在单机 OpenShift 环境安装 Red Hat Quay 镜像仓库。 另外《OpenShift 4 - 安装 ODF 并部署红帽 Quay (1 Worker)》也可以在单节点部署。 而《OpenShif…

前后端分离------后端创建笔记(11)用户删除

B站视频&#xff1a;30-用户删除&结束语_哔哩哔哩_bilibili 1、现在我们要做一个删除的功能 1.1 首先做一个删除的功能接口&#xff0c;第一步先来到后端&#xff0c;做一个删除的接口 2、删除我们用Delete请求 3、方法名我给他改一下 3.1这里给他调一下删除方法&#xf…

在一小时内构建您的深度学习应用程序

一、说明 我已经做了将近十年的数据分析。有时&#xff0c;我使用机器学习技术从数据中获取见解&#xff0c;并且我习惯于使用经典 ML。 虽然我已经通过了神经网络和深度学习的一些MOOC&#xff0c;但我从未在我的工作中使用过它们&#xff0c;这个领域对我来说似乎很有挑战性。…

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件&#xff0c;致力于帮助工程师及工科专业学生&#xff0c;利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析&#xff0c;建立高质量的数据模型&#xff0c;实现快速设计评估、实时仿真预测、系统参数预警、设…

机器学习深度学习——自注意力和位置编码(数学推导+代码实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——注意力分数&#xff08;详细数学推导代码实现&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习…

Cat(2):下载与安装

1 github源码下载 要安装CAT&#xff0c;首先需要从github上下载最新版本的源码。 官方给出的建议如下&#xff1a; 注意cat的3.0代码分支更新都发布在master上&#xff0c;包括最新文档也都是这个分支注意文档请用最新master里面的代码文档作为标准&#xff0c;一些开源网站…

MySQL— 基础语法大全及操作演示!!!(上)

MySQL—— 基础语法大全及操作演示&#xff08;上&#xff09; 一、MySQL概述1.1 、数据库相关概念1.1.1 MySQL启动和停止 1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.3.1 DDL — 数据库操作2.3.1 DDL — 表操作 2.4、DML2.4.1 DML—…

等保案例 5

用户简介 四川省人民代表大会常务委员会&#xff0c;作为省人民代表大会地常设机关&#xff0c;随着政府部门信息化程度地提高&#xff0c;对信息系统地依赖程度越来越高&#xff0c;同时由于网络安全形势日益严峻、新型攻击层出不穷&#xff0c;单位信息化所面临地各种风险也…

途乐证券-宁德时代发力超充赛道,高压快充概念强势拉升,泰永长征涨停

高压快充概念17日盘中强势拉升&#xff0c;到发稿&#xff0c;泰永长征涨停&#xff0c;万祥科技涨超9%&#xff0c;英可瑞涨逾8%&#xff0c;迦南智能涨超4%。 消息面上&#xff0c;8月16日&#xff0c;宁德时代举行线下新品发布会&#xff0c;正式发布全球首款磷酸铁锂4C超充…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例&#xff1a; 数据流的读取 一层一层的包装&#xff0c;进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

经过几天的乱搞,已经搞出来第一次stm32点灯程序

看吧那个灯泡已经亮了 stm32跟51不同的地方是这里引脚一组16个&#xff0c;如PA0,PA1,PA2,,,,,,PA15 51一组8个 例如P00,P01,P02,,,,P07

[Go版]算法通关村第十一关青铜——理解位运算的规则

目录 数字在计算机中的表示&#xff1a;机器数、真值对机器数进一步细化&#xff1a;原码、反码、补码为何会有原码、反码和补码为何计算机中的按位运算使用的是补码&#xff1f;位运算规则与、或、异或和取反移位运算移位运算与乘除法的关系位运算常用技巧⭐️ 操作某个位的数…

Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表

先说坑花了一下午才找到解决方法解决&#xff0c; 在Unity编辑模式下点击物体创建对应的表&#xff0c;获取物体名字与在InputText填写的注释数据。然后保存。创建Exect表可以打开&#xff0c;打包PC后&#xff0c;点击物体创建的表&#xff0c;打不开文件破损 解决方法&#…

大数据培训前景怎么样?企业需求量大吗

大数据行业对大家来说并不陌生&#xff0c;大数据行业市场人才需求量大&#xff0c;越早入行越有优势&#xff0c;发展机会和上升空间等大。不少人通过大数据培训来提升自己的经验和自身技术能力&#xff0c;以此来获得更好的就业机会。 2023大数据培训就业前景怎么样呢?企业需…

从视觉装备到智能驾驶,天准科技能否打造第二增长极?

智能网联汽车已经成为了上市公司跨界布局的热门赛道。 天准科技是工业视觉智能装备领域的龙头企业&#xff0c;主要客户包括苹果、三星等企业。招股说明书显示&#xff0c;2016年至2018年&#xff0c;天准科技来源于苹果公司及其供应商的收入合计占比达到49.98%、67.99%及76.0…

JVS开源基础框架:平台基本信息介绍

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

互联网账号被封禁解决办法,以qq为例

百度搜索&#xff1a;互联网信息服务投诉平台 电脑端浏览器&#xff1a;打开 ts.isc.org.cn 推荐使用360极速浏览器 谷歌浏览器 提交完成后&#xff0c;将投诉码保存&#xff0c;可以在“查询评价”处用投诉码查询进度

windows安装go,以及配置工作区,配置vscode开发环境

下载安装go 我安装在D:\go路径下配置环境变量 添加GOROOT value为D:\go修改path 添加%GOROOT%\bin添加GOPATH value为%USERPROFILE%\go 其中GOPATH 是我们自己开发的工作区&#xff0c;其中包含三个folder bin,pkg,以及src&#xff0c;其中src为我们编写代码的位置 配置vscod…

uniapp 使用 uni push 2.0 推送消息

因为之前使用uni push 1.0&#xff0c;开通账号和配置厂商就不写了。只说一点&#xff0c;配置厂商很重要&#xff0c;不然收不到离线推送的消息。那么就直接开始咯&#xff01;&#xff01;&#xff01; 一、创建并关联云服务空间 1.创建云服务空间&#xff0c;右键项目【创…

Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题

目录 引出手动实现ArrayList定义接口MyList<T>写ArrayList的实现类增加元素删除元素 写测试类进行测试数组插入数据? 总结 引出 1.ArrayList的结构分析&#xff0c;可迭代接口&#xff0c;是List的实现&#xff1b; 2.数组增加元素和删除元素的分析&#xff0c;何时扩容…