一个简单的短网址服务系统,可经过 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
测试短域名服务