章节

使用Go语言开发一个短链接服务:一、基本原理  

使用Go语言开发一个短链接服务:二、架构设计

使用Go语言开发一个短链接服务:三、项目目录结构设计

使用Go语言开发一个短链接服务:四、生成code算法

使用Go语言开发一个短链接服务:五、添加和获取短链接

使用Go语言开发一个短链接服务:六、链接跳转

  源码:https://gitee.com/alxps/short_link

  通过这个项目,你可以学到:

  1. 短链接原理
  2. Golang后端项目分层
  3. 接口逻辑涉及数据库、缓存、http请求,如何进行单元测试
  4. 何为缓存穿透、缓存击穿,如何应对他们

应用场景

  假如我们正在运营一个在线课程网站,运营人员策划双11促销大降价!于是乎,产品经理鞭策研发对应的活动页面。我们的开发非常给力,经过数周007力度的劳作,解决无数bug后,活动页面不负众望开发完成。我们产品经理开心地把促销活动页面链接交给运营人员。运营人员早已准备好活动的短信、微博和微信文案模板,就等活动链接下锅了!但是当看到链接URL时,运营人员陷入了沉思……

https://www.mywebsite.com/courses/promotional-activities/date-1111/ac60ffe3-8ef0-4efa-81d1-edc626569ff0

  链接URL比预想的长几倍,加入URL后文案模板给运营人员描绘活动信息的文字空间所剩无几。接下来,产品运营、产品经理、技术研发三方,展开长达两年半年的激烈掰扯。不出意料,出了问题当然还是研发来解决。聪明的研发小伙小明提出了解决方案,在Nginx配置一个短的URL跳转到活动链接URL,问题解决、下班!

  运营人员拿到“修改后的”活动链接,得到此次活动的短信大致长下面这样。

  当然上面Nginx配置跳转只是硬编码方式的一种临时解决方案,将来有更多类似的活动,维护起来就像是“千层浆糊”,根本无从满足运营全链路深度营销、矩阵式打法。

  鲁迅曾经说过:“当软件设计上遇到问题时,解决方案就是,加一层。” 所以研发组决定开发一个短链接服务,用来维护短URL映射跳转到长URL。

原理

  短链接一般是通过映射关系,将长长的一串网址,映射到几个字符的短链接上,建立好这种映射关系之后保存到数据库里,用户每次访问短链接的时候,需要到数据库里查询这个短链接对应的源网址,然后给用户跳转到目标长链接。

  短链接从生成到使用分为以下几步:

  1. 申请者,请求短链接服务,申请将长链接B生成对应的短链接
  2. 短链接服务器生成对应的短链接A,并保存短链接和长链接的映射关系到数据库,并返回短链接A给申请者
  3. 把短链接A拼接到短信等的内容上发送。
  4. 用户点击短链接A,浏览器用301/302进行重定向,访问到对应的长链接B。
  5. 展示对应的内容。

  这里注意http重定向状态码301和302的区别:301 永久重定向,302 是临时重定向。浏览器接收到301重定向后会先请求短链接服务,由短链接服务再定向到目标长链接地址,后续浏览器再次访问短链接URL后,便不再经短链接服务跳转,而是直接访问目标长链接服务,302的话则每次要经过短链接服务重定向跳转。(HTTP 中的 301、302、303、307、308 响应状态码) 因此,如果要统计访问量,可以使用302;如果要减少短链接服务器压力,可以使用301。

代码实践

  鲁迅又说: "Talk is cheap, show me the code."

  接下来我们用Gin框架实现一个简单的短链接示例

package main

import (
"fmt"
"log"
"net/http" "github.com/gin-gonic/gin"
) // shortLong 短链接ID和目标长链接映射关系,模拟数据库存储
var shortLong = map[string]string{
"bd": "https://baike.baidu.com/item/%E7%9F%AD%E9%93%BE%E6%8E%A5/7224556?fr=ge_ala",
"sg": "https://baike.sogou.com/v72514301.htm?fromTitle=%E7%9F%AD%E9%93%BE%E6%8E%A5",
} // redirectHandler 查找链接映射,跳转到目标长链接
func redirectHandler(c *gin.Context) {
shortCode := c.Param("code")
longUrl, ok := shortLong[shortCode] if !ok {
c.IndentedJSON(http.StatusNotFound, gin.H{
"detail": fmt.Sprintf("短链接(%s)无对应的长链接地址", shortCode),
})
return
} c.Redirect(http.StatusMovedPermanently, longUrl)
} func main() {
engine := gin.Default()
engine.GET("/:code", redirectHandler)
if err := engine.Run(":9999"); err != nil {
log.Fatalf("启动gin server失败:%v", err)
}
}

  代码逻辑比较简单,就不一一解释了。XX,启动!

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /:short --> main.redirectHandler (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9999

  在浏览器输入短链接URL:http://127.0.0.1:9999/bd。 我们就能访问到“长链接”(https://baike.baidu.com/item/%E7%9F%AD%E9%93%BE%E6%8E%A5/7224556?fr=ge_ala)了。

  Gin日志在terminal输入如下

[GIN] 2024/03/11 - 20:55:22 | 301 |      17.914µs |       127.0.0.1 | GET      "/bd"

总结

  自此,短链接服务的基本原理和最基本实现就算完成了。下一篇将继续补充基于Gin实现短链接服务,基础依赖和架构设计。

使用Go语言开发一个短链接服务:一、基本原理的更多相关文章

  1. 百度 谷歌 Twitter,这么多短链接服务(Short Url)究竟哪家强?

    一.短链接是什么 url=HPqdQ5VR3vA39x7ZWoWyNzwWnsDhTbh66BTpdzsJLroBDzFRm4JV-G818Zc027uZrwe7zxtxnD4H2FUahftpUK& ...

  2. 用PHP和Python生成短链接服务的字符串ID

    假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...

  3. Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

    短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...

  4. Java 网址短链接服务原理及解决方案

    一.背景 现在在各种圈的产品各种推广地址,由于URL地址过长,不美观.不方便收藏.发布.传播以及各种发文字数限制等问题,微信.微博都在使用短链接技术.最近由于使用的三方的生成.解析短链接服务开始限制使 ...

  5. 短链接服务Octopus的实现与源码开放

    前提 半年前(2020-06)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信.模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求.当时为了快速推广,使用了一些比较知名的 ...

  6. 最近做了一个短网址服务 di81.com

    最近做了一个短网址服务:   di81.com 项目中有一处需求,需要把长网址缩为短网址,把结果通过短信.微信等渠道推送给客户.刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一 ...

  7. 使用plv8+hashids生成短链接服务

    有写过一个集成npm plv8 以及shortid生成短链接id服务,实际上我们可以集成触发器自动生成url对应的短链接地址,hashids也是一个不错的选择. 以下是一个别人写的一个博客实现可以参考 ...

  8. 使用go语言开发一个后端gin框架的web项目

    用liteide来开发go的后端项目,需要注意的是环境变量要配置正确了 主要是GOROOT, GOPATH, GOBIN, PATH这几个, GOPATH主要用来存放要安的包,主要使用go get 来 ...

  9. ubuntu下使用C语言开发一个cgi程序

    主要步骤是: 1. 开发一个C程序(在标准输出中输出HTML字符串) 2. 复制到apache2的cgi-bin目录去 3. 在httpd.conf中开启cgi功能(我似乎没用到,也可以使用cgi) ...

  10. 用 Go 快速开发一个 RESTful API 服务

    何时使用单体 RESTful 服务 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,而单体服务具有架构简单,部署简单,开发成本低等优点,可以帮助我们快速实现产品需求.我们在使用单体服务 ...

随机推荐

  1. QT C++工程CI环境笔记

    开发环境 Ubuntu18.04 or Ubuntu20.04 Qt Creator 4.6.x (Based on Qt 5.11.x) APT list: apt-transport-https ...

  2. DVWA sqli

    level low 可以看到查询请求为 http://192.168.31.xxx/vulnerabilities/sqli/?id=1&Submit=Submit# ##### id 改为 ...

  3. 使用winsw将jar包注册成windows服务

    使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...

  4. 项目实战:Qt+OSG教育学科工具之地理三维星球

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. Flask遇到的坑及解决办法

    flask_script 在使用第三方包flask_script时,报一下错误 ModuleNotFoundError: No module named 'flask._compat' 问题时flas ...

  6. Spring使用注解方式进行事务管理

    目录 使用步骤: 步骤一.在spring配置文件中引入tx:命名空间 步骤二.具有@Transactional 注解的bean自动配置为声明式事务支持 步骤三.在接口或类的声明处 ,写一个@Trans ...

  7. Nebula Graph|信息图谱在携程酒店的应用

    本文首发于 Nebula Graph Community 公众号 对于用户的每一次查询,都能根据其意图做到相应的场景和产品的匹配",是携程酒店技术团队的目标,但实现这个目标他们遇到了三大问题 ...

  8. 一文读懂图数据库 Nebula Graph 访问控制实现原理

    摘要:数据库权限管理对大家都很熟悉,然而怎么做好数据库权限管理呢?在本文中将详细介绍 Nebula Graph 的用户管理和权限管理. 本文首发 Nebula Graph 博客:https://neb ...

  9. 树形dp套路

    我们知道dp也就是动态规划的思想就是先解决小问题,通过不断的解决小问题,最终解决大问题.那么能够应用树形dp套路的题目都应该符合一个条件,那就是通过解决每个子树的小问题,最终解决整棵树的大问题. 套路 ...

  10. 学习ASP.NET Core Razor 编程系列文章目录

    学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二--添加一个实体 学习ASP.NET Core Razor 编程系列三--创建数据表及创建项目 ...