码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 使用Go语言开发一个短链接服务:一、基本原理


    章节

     使用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实现短链接服务,基础依赖和架构设计。

  • 相关阅读:
    嵌入式Qt-简易网络监控摄像头
    “华为杯”研究生数学建模竞赛2015年-【华为杯】B题:数据的多流形结构分析(附python代码实现)
    用CSS+SVG做一个优雅的环形进度条
    【go从入门到精通】常用标准库的用法
    lv4 嵌入式开发-2 Linux文件IO
    一个.Net开发的功能强大、易于使用的流媒体服务器和管理系统
    作为物联网技术最重要的数据采集入口,传感器将迎来巨大的发展良机?
    2022:图元文件转换为Xaml||Paste2Xaml & ReaderWmf
    WGS84坐标系-地心地固坐标系-东北天坐标系
    记我的 Windows Dev Kit 2023 使用体验
  • 原文地址:https://www.cnblogs.com/ALXPS/p/18066568
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号