一個簡單的短網址服務系統,可經過 RESTful API 來生成新短網址,短網址與原網址的映射存儲在 Redis 數據庫中,用戶請求短網址時會被重定向到原網址。html
後臺使用 Vert.X-Web 和異步編程,web服務和redis服務之間經過 EventBus 通訊。 短網址生成使用原網址到62進制映射的方案。前端
短網址服務原理可參考 短網址(short URL)系統的原理及其實現 | 思否java
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
包中都是各個 verticle
。 RedisVerticle
用來建立和管理 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。由於 Web 層已經使用了 Vert.X,一個異步的、高併發性能的框架(工具套件),再使用低性能的關係型數據庫確定不匹配,所以使用了 NOSQL 數據庫 Redis, 另外數據存儲內容也很簡單。
固然不少,第一件容易改進的就是讓日誌系統打印出更詳細、具體的內容。另外一個,有些挑戰性的就是,當短域名建立的多時,如何處理62進制短網址的同名衝突,一個簡單的思路是生成短域名後,去檢測 Redis 裏是否已存在相同鍵(短域名),若是存在,則把短域名作個小修改(好比+1),而後再去 Redis 裏檢測是否有相同鍵,直到不存在相同鍵爲止。(歡迎大佬給建議)
首先確保 Redis 數據庫已啓動,JDK version 11或以上
IDE 直接運行 short.Server
的 main 方法;
或生成 jar 包,運行 java -jar short-url-**.jar
;
訪問 http://localhost:8081/management
進入管理中心界面;
訪問路徑 host/:short-url-key
測試短域名服務