使用 Vert.X 和 Redis 搭建一個短域名服務

一個簡單的短網址服務系統,可經過 RESTful API 來生成新短網址,短網址與原網址的映射存儲在 Redis 數據庫中,用戶請求短網址時會被重定向到原網址。html

後臺使用 Vert.X-Web 和異步編程,web服務和redis服務之間經過 EventBus 通訊。 短網址生成使用原網址到62進制映射的方案。前端

短網址服務原理可參考 短網址(short URL)系統的原理及其實現 | 思否java

在這裏插入圖片描述
在這裏插入圖片描述

Web 路由說明

  • GET /:shortUrlKey | 經過短網址,重定向到原網址python

  • GET /management | 管理中心,查看全部短網址映射和建立新短網址git

  • POST /api/create {'srcUrl': 'source url'} | 返回提交原網址的 短網址github

{"shortUrl": "xxx.xx/5Fdx6l", "date": "2020-4-28 16:22", "state": "success|fail"}
複製代碼
  • GET /api/list | 返回已建立的全部短網址
[ {"shortUrl": "short url", "srcUrl": "source url", "date": "create date" } ]
複製代碼

類/文件簡要說明

  • shorturl.common.Convertor 是一個工具類,主要用來把十進制整數轉62進制,和把一個字符串轉62進制。web

  • shorturl.verticle 包中都是各個 verticleRedisVerticle 用來建立和管理 Redis 數據庫,以及經過事件機制(異步)相應 Redis 的讀寫請求;RestVerticle 用來建立 web 服務,提供 RESTful API 管理接口和短域名的路由重定向,它會異步請求讀寫 Redis。redis

  • short.Server 部署和運行 Vert.X 服務。數據庫

  • webroot\management.html 基於 Vue 和 Bulma 構建的前端管理界面,用來查看已建立的 shorturl 和 建立新 shorturl。編程

  • auto.py 本身編寫的 python 自動化程序,自動完成 maven 打包 -> jar 部署服務器 -> 重啓 jar 應用。

其餘說明

  • 數據存儲爲何不用 ConcurrentHashMap 或 MySQL?

由於我想應用重啓後,以前建立的短域名能再次使用,所以必須使用外置的數據庫,放棄 ConcurrentHashMap。由於 Web 層已經使用了 Vert.X,一個異步的、高併發性能的框架(工具套件),再使用低性能的關係型數據庫確定不匹配,所以使用了 NOSQL 數據庫 Redis, 另外數據存儲內容也很簡單。

  • 有什麼須要改進的嗎?

固然不少,第一件容易改進的就是讓日誌系統打印出更詳細、具體的內容。另外一個,有些挑戰性的就是,當短域名建立的多時,如何處理62進制短網址的同名衝突,一個簡單的思路是生成短域名後,去檢測 Redis 裏是否已存在相同鍵(短域名),若是存在,則把短域名作個小修改(好比+1),而後再去 Redis 裏檢測是否有相同鍵,直到不存在相同鍵爲止。(歡迎大佬給建議)

運行

首先確保 Redis 數據庫已啓動,JDK version 11或以上

  1. IDE 直接運行 short.Server 的 main 方法;

  2. 或生成 jar 包,運行 java -jar short-url-**.jar

  3. 訪問 http://localhost:8081/management 進入管理中心界面;

  4. 訪問路徑 host/:short-url-key 測試短域名服務

源碼

相關文章
相關標籤/搜索