首页 > 其他分享 >使用Go语言开发一个短链接服务:一、基本原理

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

时间:2024-03-26 12:25:12浏览次数:16  
标签:服务 URL 基本原理 跳转 Go gin 链接

章节

使用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)
	}
}

   代码逻辑比较简单,就不一一解释了

标签:服务,URL,基本原理,跳转,Go,gin,链接
From: https://www.cnblogs.com/ALXPS/p/18066568

相关文章

  • go--time 模块
    time模块获取当前的时间和月份packagemainimport("fmt""time")funcmain(){t:=time.Now()//获取当前时间fmt.Println(t)fmt.Println(t.Date())//获取日期fmt.Println(t.Year())//获取年份fmt.Println(t.M......
  • 使用Go语言开发一个短链接服务:四、生成code算法
    章节 使用Go语言开发一个短链接服务:一、基本原理 使用Go语言开发一个短链接服务:二、架构设计 使用Go语言开发一个短链接服务:三、项目目录结构设计 使用Go语言开发一个短链接服务:四、生成code算法 使用Go语言开发一个短链接服务:五、添加和获取短链接 使用Go语言开......
  • 使用Go语言开发一个短链接服务:五、添加和获取短链接
    章节 使用Go语言开发一个短链接服务:一、基本原理 使用Go语言开发一个短链接服务:二、架构设计 使用Go语言开发一个短链接服务:三、项目目录结构设计 使用Go语言开发一个短链接服务:四、生成code算法 使用Go语言开发一个短链接服务:五、添加和获取短链接 使用Go语言开......
  • 使用Go语言开发一个短链接服务:六、链接跳转
    章节 使用Go语言开发一个短链接服务:一、基本原理 使用Go语言开发一个短链接服务:二、架构设计 使用Go语言开发一个短链接服务:三、项目目录结构设计 使用Go语言开发一个短链接服务:四、生成code算法 使用Go语言开发一个短链接服务:五、添加和获取短链接 使用Go语言开......
  • 使用Go语言开发一个短链接服务:三、项目目录结构设计
    章节 使用Go语言开发一个短链接服务:一、基本原理 使用Go语言开发一个短链接服务:二、架构设计 使用Go语言开发一个短链接服务:三、项目目录结构设计 使用Go语言开发一个短链接服务:四、生成code算法 使用Go语言开发一个短链接服务:五、添加和获取短链接 使用Go语言开......
  • golang模板库之fasttemplate
    简介fasttemplate是一个比较简单、易用的小型模板库。fasttemplate的作者valyala另外还开源了不少优秀的库,如大名鼎鼎的fasthttp,前面介绍的bytebufferpool,还有一个重量级的模板库quicktemplate。quicktemplate比标准库中的text/template和html/template要灵活和易用很多,后面会专......
  • Go的可变参数函数
    可变函数是指可以接收可变数量的参数的函数。在Golang中,可以传递与函数签名中引用的类型相同的不同数量的参数。在声明可变函数时,最后一个参数的类型前会有一个省略号"...",这表明该函数可以用任意数量的该类型参数来调用,可以是0个、1个或者多个。这种类型的函数在不知道传递给......
  • Django之权限管理
    一,引入1.为什么要有权限?2.为什么要开发权限的组件?3.在web开发中,什么是权限?4.表结构的设计权限表IDURL1/user_list/2/customer_list/用户表IDUSER_NAME1root2root2角色/用户组表ID组1销售2开发用户与角色的......
  • CPPB 表中的TXN_CATEGORY
    cst_pac_period_balanceTXN_CATEGORY1    期初    2    成本更新:新成本或百分比变动    3    自有成本事务处理    4    非返工完成    5    成本更新:值变动    6    返工发放    7    返工完成    8    组......
  • 02、基本原理
    基本原理过滤器  访问控制列表(ACL)  地址前缀列表(IP-PrefixList)   AS路径过滤器(AS_Path-Filter)  团体属性过滤器(Community-Filter)  Large-community属性过滤器(Large-Community-Filter)  扩展团体属性过滤器(Extcommunity-Filter) RD属性过滤器(Ro......