Skip to content

JimouChen/shortlink-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

短链接系统(Shortlink System)

  • 一个基于Go Kitex + Redis + Vue 3构建的高并发、高可用的短链接微服务系统,支持前后端分离架构。
image

项目特点

后端特点

  • 高并发支持:基于Go Kitex微服务框架,高性能服务处理
  • 缓存优化
    • 防止缓存穿透:实现布隆过滤器(Bloom Filter)快速判断短链接是否存在
    • 防止缓存击穿:使用singleflight机制确保同一时间对同一个短链接的请求只查询一次后端
  • 限流保护:集成Redis Rate Limiter实现接口限流,保护系统稳定
  • 数据一致性:使用Redis事务确保数据一致性
  • 优雅退出:支持平滑关闭服务

前端特点

  • 现代化UI设计:采用圆角风格,美观大方的界面设计
  • 响应式布局:完全适配移动端和桌面端
  • 用户友好体验
    • 实时表单验证和反馈
    • 加载状态指示和动画效果
    • 操作成功/失败消息提示
    • 一键复制功能
  • 双页面设计:生成短链接页面和测试重定向页面

项目结构

shortlink-system/
├── backend/             # Go Kitex后端代码
│   ├── main.go          # 主入口文件
│   ├── go.mod           # Go模块定义
│   ├── idl/             # 接口定义文件
│   │   └── shortlink.thrift  # Thrift接口定义
│   └── service/         # 服务实现
│       └── shortlink_service.go  # 短链接服务实现
├── frontend/            # Vue 3前端代码
│   ├── package.json     # 前端依赖配置
│   ├── src/             # 前端源码
│   │   ├── App.vue      # 主应用组件
│   │   ├── main.js      # 前端入口
│   │   ├── style.css    # 全局样式
│   │   └── components/  # Vue组件
│   │       ├── GenerateShortlink.vue  # 生成短链接组件
│   │       └── RedirectTest.vue       # 测试重定向组件
│   └── dist/            # 构建输出目录
└── README.md            # 项目说明文档

核心功能

1. 生成短链接

  • API接口/api/generate?url=长链接
  • 功能描述:将长URL转换为6位字符的短链接码
  • 返回结果:包含短链接码、完整短链接URL和状态信息
  • 实现逻辑:使用MD5哈希算法结合随机数生成唯一短链接码,存储长链接与短链接的双向映射

2. 短链接重定向

  • 访问方式http://localhost:8080/r/短链接码
  • 功能描述:根据短链接码查询并跳转到原始长链接
  • 实现逻辑:优先通过布隆过滤器快速判断短链接是否存在,再使用singleflight机制并发查询Redis

3. 缓存策略

  • 布隆过滤器:用于快速判断短链接是否存在,有效防止缓存穿透
  • SingleFlight:合并并发请求,防止缓存击穿
  • Redis存储:高效的键值存储,支持设置过期时间

技术栈

后端

  • Go:高性能后端开发语言
  • Kitex:字节跳动开源的Go微服务框架
  • Thrift:接口定义语言
  • Redis:缓存数据库,用于存储短链接映射关系
  • go-redis:Redis客户端库
  • redis_rate:基于Redis的限流库

前端

  • Vue 3:渐进式JavaScript框架
  • Vite:现代前端构建工具
  • Axios:HTTP客户端,用于前后端通信
  • CSS3:现代化样式设计

快速开始

前置条件

  • Go 1.18+ 环境
  • Node.js 16+ 环境(用于前端开发)
  • Redis 6.0+ 服务

后端运行步骤

  1. 确保Redis服务正常运行
redis-server
  1. 进入backend目录
cd backend
  1. 安装依赖
go mod tidy
  1. 生成Kitex代码(首次运行需要)
kitex -module shortlink.backend idl/shortlink.thrift
  1. 运行后端服务

    • 默认方式(不启用布隆过滤器)
    go run main.go
    • 启用布隆过滤器
    go run main.go --bf_search=true

    服务将在8888端口启动Kitex服务,在8080端口启动HTTP重定向服务。

    参数说明:

    • --bf_search=true/false:控制是否启用布隆过滤器搜索短链接(默认:false)
    • 启用布隆过滤器可以防止缓存穿透,但可能增加查询响应时间
    • 禁用布隆过滤器可以获得更好的查询性能,适用于对响应速度要求高的场景

前端运行步骤

  1. 进入frontend目录
cd frontend
  1. 安装依赖
npm install
# 或使用cnpm(国内加速)
cnpm install
  1. 启动开发服务器
npm run dev
  1. 构建生产版本
npm run build

前端服务默认在5173端口启动。

系统架构

image

系统采用经典的前后端分离架构:

  • 用户层:通过浏览器访问前端页面或直接请求短链接
  • 前端层:Vue 3单页应用,负责用户交互和数据展示
  • 后端层:Go Kitex微服务,处理业务逻辑
  • 缓存层:Redis存储短链接映射关系,实现高性能访问

性能优化

  1. 布隆过滤器优化:在Redis中实现的布隆过滤器可以快速判断短链接是否存在,避免无效的数据库查询
  2. SingleFlight并发控制:合并同一时间的相同请求,减少Redis压力
  3. Redis事务:使用事务确保数据一致性
  4. URL过期机制:所有短链接默认有效期为30天,可自动清理过期数据
  5. 限流保护:对生成短链接接口进行限流,防止恶意请求

注意事项

  1. 请确保Redis服务正常运行,否则系统将无法存储和查询短链接
  2. 短链接生成算法使用MD5哈希结合随机数,理论上可能存在冲突,但概率极低
  3. 系统默认使用本地开发配置,生产环境需要调整相关配置
  4. 如需部署到生产环境,建议配置HTTPS和域名解析

扩展建议

  1. 添加用户认证和权限管理
  2. 实现短链接点击统计和分析功能
  3. 支持自定义短链接码
  4. 添加短链接有效期自定义选项
  5. 部署多实例并配置负载均衡
  6. 添加监控告警系统

License

MIT

About

一个基于go kitex微服务+redis+vue3实现的前后端分离的短链接系统

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published