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.pswp.cn/news/40140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40140.shtml
英文地址,請注明出處:http://en.pswp.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…

Java 中 List 集合排序方法

方式一&#xff1a; 調用List接口自己的sort方法排序 public static void main(String[] args) {List<Integer> numListnew ArrayList<>();numList.add(999);numList.add(123);numList.add(456);numList.add(66);numList.add(9);Collections.sort(numList); //使…

在一小時內構建您的深度學習應用程序

一、說明 我已經做了將近十年的數據分析。有時&#xff0c;我使用機器學習技術從數據中獲取見解&#xff0c;并且我習慣于使用經典 ML。 雖然我已經通過了神經網絡和深度學習的一些MOOC&#xff0c;但我從未在我的工作中使用過它們&#xff0c;這個領域對我來說似乎很有挑戰性。…

【Leetcode】91.解碼方法

一、題目 1、題目描述 一條包含字母 A-Z 的消息通過以下映射進行了 編碼 : A -> "1" B -> "2" ... Z -> "26"要 解碼 已編碼的消息,所有數字必須基于上述映射的方法,反向映射回字母(可能有多種方法)。例如,"11106" …

智能數據建模軟件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;一些開源網站…

node.js內置模塊fs,path,http使用方法

NodeJs中分為兩部分 一是V8引擎為了解析和執行JS代碼。 二是內置API&#xff0c;讓JS能調用這些API完成一些后端操作。 內置API模塊(fs、path、http等) 第三方API模塊(express、mysql等) fs模塊 fs.readFile()方法&#xff0c;用于讀取指定文件中的內容。 fs.writeFile()方…

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

全新重構,探尋 24 歲 QQ 大重構背后的思考

在瞬息萬變的互聯網行業中,年過二十四的 QQ 堪稱超長壽的產品,見證了中國互聯網崛起的完整歷程。然而,如今這個元老級產品經歷了一次從內到外徹底的重構。 在這次重構中,QQ 選擇了 Electron 作為 UI 跨平臺開發框架。盡管 Electron 被 Slack、Visual Studio Code 和 Disco…

[Go版]算法通關村第十一關青銅——理解位運算的規則

目錄 數字在計算機中的表示&#xff1a;機器數、真值對機器數進一步細化&#xff1a;原碼、反碼、補碼為何會有原碼、反碼和補碼為何計算機中的按位運算使用的是補碼&#xff1f;位運算規則與、或、異或和取反移位運算移位運算與乘除法的關系位運算常用技巧?? 操作某個位的數…

Unity用NPOI創建Exect表,保存數據,和修改刪除數據。以及打包后的坑——無法打開新創建的Exect表

先說坑花了一下午才找到解決方法解決&#xff0c; 在Unity編輯模式下點擊物體創建對應的表&#xff0c;獲取物體名字與在InputText填寫的注釋數據。然后保存。創建Exect表可以打開&#xff0c;打包PC后&#xff0c;點擊物體創建的表&#xff0c;打不開文件破損 解決方法&#…

大數據培訓前景怎么樣?企業需求量大嗎

大數據行業對大家來說并不陌生&#xff0c;大數據行業市場人才需求量大&#xff0c;越早入行越有優勢&#xff0c;發展機會和上升空間等大。不少人通過大數據培訓來提升自己的經驗和自身技術能力&#xff0c;以此來獲得更好的就業機會。 2023大數據培訓就業前景怎么樣呢?企業需…

ubuntu18 下更改 mysql 數據目錄

一、修改步驟 更改 MySQL 的數據目錄需要注意以下幾個步驟&#xff1a; 停止 MySQL 服務 在 Ubuntu 中&#xff0c;你可以使用以下命令停止 MySQL 服務&#xff1a; sudo systemctl stop mysql 復制現有數據 假設你的新的數據目錄是 /new/dir/mysql&#xff0c;你應該使用 rsy…

區間覆蓋 線段覆蓋 二分

4195. 線段覆蓋 - AcWing題庫 P2082 區間覆蓋&#xff08;加強版&#xff09; - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 做法&#xff1a; void solve() {int n; cin>>n;vector<array<LL,2>> seg(n);for(auto &t: seg) cin>>t[0]>>…