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.hqwc.cn/news/66420.html

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

相关文章

K8S系列一:概念入门

I. K8S概览 1.1 K8S是什么&#xff1f; K8S是Kubernetes的全称&#xff0c;官方称其是&#xff1a; Kubernetes is an open source system for managing containerized applications across multiple hosts. It provides basic mechanisms for deployment, maintenance, and …

uniapp开发小程序-分包(微信错误码:800051)

在使用uniapp开发小程序时&#xff0c;上传的时候因为文件过大&#xff0c;显示上传失败。 以下是开发过程中遇到的问题及解决方法&#xff1a; 1. 问题一&#xff1a;因为文件过大&#xff0c;显示上传失败 ①尝试过把本地使用的图片压缩到最小&#xff1b; ②把图片转换为网…

【Vue-Router】路由入门

路由&#xff08;Routing&#xff09;是指确定网站或应用程序中特定页面的方式。在Web开发中&#xff0c;路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 npm init vuelatest //或者 npm init vitelatest安装依赖和路由 npm install npm instal…

Python学习 -- 常用函数与实例详解

在Python编程中&#xff0c;数据转换是一项关键任务&#xff0c;它允许我们在不同数据类型之间自由流动&#xff0c;从而提高代码的灵活性和效率。本篇博客将深入探讨常用的数据转换函数&#xff0c;并通过实际案例为你展示如何巧妙地在不同数据类型之间转换。 数据类型转换函…

ROSpider机器人评测报告

ROSpider机器人评测报告 最近入手了一款ROSpider六足仿生机器人&#xff0c;ROSpider是一款基于ROS 操作系统开发的智能视觉六足机器人。 外观 外观上ROSpider六足机器人如同名字一样有六只机械腿&#xff0c;整体来看像一只六腿的蜘蛛。腿上的关节处用了明亮的橙黄色很是显…

大数据-玩转数据-Flink RedisSink

一、添加Redis Connector依赖 具体版本根据实际情况确定 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-redis_2.11</artifactId><version>1.1.5</version> </dependency>二、启动redis 参…

Java代理模式——静态代理与动态代理

代理模式 代理模式允许你为其他对象提供一个代理&#xff0c;以控制对这个对象的访问。代理模式在不改变实际对象的情况下&#xff0c;可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身&#xff0c;调用者可以通过这个替身去实现这个被代理对…

UGUI事件系统EventSystem

一. 事件系统概述 Unity的事件系统具有通过鼠标、键盘、游戏控制柄、触摸操作等输入方式&#xff0c;将事件发送给对象的功能。事件系统通过场景中EventSystem对象的组件EventSystem和Standalone Input Module发挥功能。EventSystem对象通常实在创建画布的同时被创建的&#xf…

【报错】ModuleNotFoundError: No module named ‘websocket‘

1 报错 ModuleNotFoundError: No module named websocket 2 解决方法 pip install websocket 1 报错 AttributeError: module websocket has no attribute enableTrace 2 分析 一般是由于websocket的依赖包没有安装造成的。websocket.enableTrace()方法是在websocket-cli…

【校招VIP】前端JS语言考点之px rem等单位

考点介绍&#xff1a; rem vm等问题是前端面试里的高频题型。但是不少同学并不能很清楚的说明为什么在有px单位之后&#xff0c;还需要rem单位&#xff1f;往往会往不对的自适应方向回答。 作为基础性问题&#xff0c;只要回答不出来&#xff0c;面试就通过不了&#xff0c;需要…

学习SOLIDWORKS Simulation有限元分析就是如此简单

当工程师完成产品设计后&#xff0c;一般都会想验证一下设计是否满足要求&#xff0c;此时SOLIDWORKS Simulation有限元分析就是很好的工具&#xff0c; SOLIDWORKS 创新的将复杂的分析过程和术语进行“包装”&#xff0c;使其操作比较简单&#xff0c;同时功能比较强大&#x…

【NLP】训练LLM的不同方式

一、说明 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;有各种各样的 训练机制&#xff0c;具有不同的手段&#xff0c;要求和目标。由于它们服务于不同的目的&#xff0c;因此重要的是不要将它们相互混淆&#xff0c;并了解它们适用的不同场景。 在本文中&#…