ShortLink 支持 SaaS 部署的高性能短链系统
短链接(Short Link)是指将一个原始的长 URL(统一资源定位符)通过特定的算法或服务转化为一个更短且易于记忆的 URL。通常,短链接仅包含几个字符,而原始的长 URL 可能会相当长。
短链接的原理十分简单,即通过一个原始链接生成一个相对较短的链接,然后当访问短链接时,会跳转至原始链接。
如果更细节一些的话,那就是:
- 生成唯一标识符:当用户输入或提交一个长 URL 时,短链接服务会生成一个唯一的标识符或者短码。
- 将标识符与长 URL 关联:短链接服务将这个唯一标识符与用户提供的长 URL 关联起来,并将其保存在数据库或者其他持久化存储中。
- 创建短链接:将生成的唯一标识符加上短链接服务的域名(例如:http://nurl.ink )作为前缀,构成一个短链接。
- 重定向:当用户访问该短链接时,短链接服务接收到请求后会根据唯一标识符查找关联的长 URL,然后将用户重定向到这个长 URL。
- 跟踪统计:一些短链接服务还会提供访问统计和分析功能,记录访问量、来源、地理位置等信息。
短链接在我们的日常生活中随处可见。大家应该都有过这样的经历,在各类活动节日期间,总是会收到各种各样的营销短信,而这些短信里常常会出现短链接。
它们可不是简单的链接缩短服务哦,实际上,对于企业而言,短链接发挥着至关重要的作用。在开展营销活动时,企业可以通过短链接来实现对用户行为的识别,比如用户是否点击了该链接、点击的频率如何等。
同时,短链接还能够帮助企业进行关键信息的监控,像是统计不同短链接的点击率,分析用户的偏好和参与度,进而为企业优化营销策略提供有力的数据支持,使企业能够更精准地把握市场动态,更好地满足用户需求,实现营销效果的最大化。
主要作用包括但不限于以下几个方面:
- 提升用户体验:用户更容易记忆和分享短链接,增强了用户的体验。
- 节省空间:短链接相对于长 URL 更短,可以节省字符空间,特别是在一些限制字符数的场合,如微博、短信等。
- 美化:短链接通常更美观、简洁,不会包含一大串字符。
- 统计和分析:可以追踪短链接的访问情况,了解用户的行为和喜好。
官方文档
- 什么是 SaaS 短链接系统:https://nageoffer.com/shortlink
- 🔥SaaS 短链接视频教程:https://nageoffer.com/shortlink/video
在线体验地址:SaaS短链接演示环境
受限于网络安全规则,短链接跳转的目标网址仅支持 拿个offer、知乎、掘金、博客园 域名下所属链接。
技术架构
在系统设计中,采用最新 JDK17 + SpringBoot3&SpringCloud 微服务架构,构建高并发、大数据量下仍然能提供高效可靠的短链接生成服务。
通过学习短链接项目,不仅能了解其运作机制,还能接触最新技术体系带来的新特性,从而拓展技术视野并提升自身技术水平。
应用场景
短链生成技术在日常生活中有着广泛的应用场景,以下是一些典型例子:
- 社交媒体分享:将长链接转换为短链,便于在朋友圈、微博等社交平台分享。
- 广告推广:缩短广告链接,提高点击率。
- 短信发送:减少短信字数,降低通信成本。
- 二维码生成:缩短链接,生成更清晰的二维码。
- 社交媒体分享:在社交媒体上分享长链接时,使用
nageoffer/shortlink
可以生成短链接,提高帖子的整洁度和专业性。 - 邮件营销:在邮件中插入短链接,提高点击率,增加用户的互动和参与度。
- SEO优化:短链接可以提高网站的SEO排名,因为它可以减少URL的长度,使得搜索引擎更容易抓取和索引。
- 个人项目管理:对于需要管理多个项目链接的个人或团队,使用短链接可以简化链接管理流程。
安装配置
数据库初始化
安装MySQL 5.7
启动 MySQL 实例,复制对应的配置文件。
docker run --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
# ~/docker/software/mysql/conf 是本地目录,没有的话需要创建
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf ~/docker/software/mysql/conf
-d
:以后台的方式运行。--name mysql
:指定容器的名称为 mysql。-p3306:3306
:将容器的 3306 端口挂载到宿主机的 3306 端口上。-e MYSQL_ROOT_PASSWORD=root
:指定 root 的密码为 root。
打开 ~/docker/software/mysql/conf mysqld.cnf
文件,增加以下内容。
# 配置文件中添加如下内容,注意是在在[mysqld]目录中
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server-id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
为了后续 Canal 对接,这里直接开启 BinLog 相关配置。
删除原 MySQL 容器,通过新配置创建新的容器。
# 删除运行中的 MySQL 容器
docker rm -f mysql
# 运行 Docker 容器命令
# /etc/localtime 时间同步
# /docker/software/mysql/conf 同步配置文件,上面配置的内容就会覆盖容器中的配置文件
# /docker/software/mysql/log 同步日志目录
# /docker/software/mysql/data 同步 MySQL 的一些文件内容(对数据进行备份)
# MYSQL_ROOT_PASSWORD=root 默认 root 的密码是 root
docker run --name mysql \
-p 3306:3306 \
-v /etc/localtime:/etc/localtime \
-v ~/docker/software/mysql/conf:/etc/mysql/mysql.conf.d \
-v ~/docker/software/mysql/log:/var/log/mysql \
-v ~/docker/software/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.36
进入到 MySQL 的命令行模式来给 root 账号授权所有 ip 能够访问。
# 使用 MySQL 容器中的命令行
docker exec -it mysql /bin/bash
# 使用 MySQL 命令打开客户端:
mysql -uroot -proot --default-character-set=utf8
# 接着创建一个账户,该账号所有 IP 都能够访问
grant all privileges on *.* to 'root' @'%' identified by 'root';
# 刷新生效
FLUSH PRIVILEGES;
查看 binlog 日志是否已经开启。
# 查看 binlog 日志是否开启
show variables like 'log_%';
# 查看主结点当前状态
show master status;
如果 log_bin 为 ON,即为开启状态。
导入数据库文件:
- 1)初始化数据库。
执行数据库&建表语句初始化 SQL 语句,文件地址:/resources/database/link.sql
,数据库后续变动比较少。
- 2)初始化建表语句&初始化数据。
执行数据库初始化 SQL 文件,文件夹地址:/resources/database/link-data.sql
,如果后续遇到代码中关于数据库相关的报错,重新执行下对应库的 SQL 文件。
安装 Redis
docker run -p 6379:6379 --name redis -d redis redis-server --requirepass "123456"
安装 Nacos
docker run \
-d -p 8848:8848 \
-p 9848:9848 \
--name nacos2 \
-e MODE=standalone \
-e TIME_ZONE='Asia/Shanghai' \
nacos/nacos-server:v2.1.1
运行成功,稍等几秒启动时间,浏览器输入 http://localhost:8848/nacos/index.html
查看控制台。
编译后端项目
克隆项目
打开 Gitee 项目地址:https://gitee.com/nageoffer/shortlink 复制对应的 SSH 或 HTTP 克隆地址。
不要图省事选择下载 ZIP,因为下载后的项目是没办法通过 Git 去更新远程仓库最新代码的。短链接现在的代码还在不断更新迭代,每次打开项目都可以选择 Pull 下最新代码。
打开 IntelliJ IDEA,菜单栏顶部找到 Git -> Clone 选项。不同电脑 Windows 或者 Mac 的位置可能有所不同,找到 Clone 这个按钮即可。
URL 文本框填写短链接项目的 HTTP 或 SSH 地址,比如 HTTP 的地址:https://gitee.com/nageoffer/shortlink.git
,Directory 填写项目存储在本地的目录地址。
等待克隆及 Maven 初始化即可。
拉下来后,可在项目根目录执行 mvn clean install 测试是否具备运行环境。
项目更新
建议大家在打开项目时,都执行下 Update Project 流程,因为代码目前还在快速迭代中,避免错过新功能。
因为不同版本的 IntelliJ IDEA Git 操作为止也不同,所以大家可以使用快捷键操作。Mac 是 Command+T,Windows 应该是 Control + T。
服务启动
短链接系统框架底层依赖 SpringBoot3,而这个版本对 JDK 的要求最低是 17。所以,我们需要将项目的 JDK 修改为 17 版本,避免项目编译或运行报错。
IntelliJ IDEA 右上角点击齿轮设置图标,点击 Project Structure… 打开设置页面。
检查项目 SDK 的版本是否为 JDK17,如果不是请选择电脑上的 JDK 版本。
当把 JDK 版本、前置中间件环境以及数据库初始化完成后,就可以跟据你的学习想法直接启动对应服务,配合前端界面操作短链接系统的功能。
启动前端项目
进入到短链接项目 shortlink/console-vue
目录后,依次执行下述命令。
Windows 用户通过 cmd 工具进入 shortlink/console-vue
目录执行,Mac 用户通过终端工具。
npm install
npm run dev
启动成功后,出现下图的链接,访问链接就可以打开短链接前端页面。
项目质量怎么样?
短链接项目采用 SaaS 方式开发。”SaaS”代表“软件即服务”(Software as a Service),与传统的软件模型不同,SaaS 不需要用户在本地安装和维护软件,而是通过互联网直接访问在线应用程序。
既然是 SaaS 系统,那势必会带来 N 多个问题。在我看来,问题即项目亮点。一起来看下:
- 海量并发:可能会面对大量用户同时访问的情况,尤其在高峰期,这会对系统的性能和响应速度提出很高的要求。
- 海量存储:可能需要存储大量的用户数据,包括数据库、缓存等,需要足够的存储空间和高效的存储管理方案。
- 多租户场景:通常支持多个租户共享同一套系统,需要保证租户间的数据隔离、安全性和性能。
- 数据安全性:需要保证用户数据的安全性和隐私,防止未经授权的访问和数据泄露。
- 扩展性&可伸缩性:需要具备良好的扩展性,以应对用户数量和业务规模的增长。
项目实现过程中会充分考虑以上问题,最终实现高可用、可扩展、支持海并发以及存储的 SaaS 短链接系统。另外,会额外交付精美前端控制台页面,学生可用于校招、毕设等场景。
可谓是出门面试,必备好项目!