Go 实现短链接服务

我们在推广的时候,经常会碰到链接或者二维码的时候,这时候链接太长,看起来不太友好,生成的二维码也是密密麻麻的,所以会用到短链接服务。

主要思路

  1. 直接生成短链接,短链接通过当前时间戳转换Base62

  2. 将长链接和短链接数据保存到数据库

  3. 生成的时候,先查看下链接有没有生成过,如果生成过,用之前生成的短链即可

  4. 生成之后,需要写个中间件做预处理,当前url是否为短链,如果是短链,直接重定向到 长链接去。

  5. 服务编写好后,Nginx加一段配置 ,针对短链转发到短链接服务。

使用到的技术

  • gin web框架

  • gorm orm框架

  • viper 读取配置https://github.com/catinello/base62

  • base62 生成base62的工具包

核心代码

生成短链:

func generateShort(longUrl string) string {var short ShortLinkshort.LongUrl = longUrlerr := DB.Find(&short, &short).Errorif err != nil {fmt.Println(err)}if short.ShortUrl != "" {return short.ShortUrl}rand.Seed(time.Now().UnixNano())var sb strings.Buildersb.WriteString("/")sb.WriteString(S_LINK)sb.WriteString("/")timestamp := time.Now().UnixNano() / 1e6sb.WriteString(base62.Encode(int(timestamp)))shortUrl := sb.String()shortInfo := ShortLink{ShortUrl: shortUrl,LongUrl:  longUrl,}DB.Create(&shortInfo)return shortUrl
}

请求预处理重定向:

router.Use(Redirect(), gin.Recovery())

func Redirect() gin.HandlerFunc {return func(context *gin.Context) {url := context.Request.URLvar short ShortLinkshort.ShortUrl = url.String()err := DB.Find(&short, &short).Errorif err != nil {fmt.Println(err)}if short.LongUrl != "" {context.Redirect(http.StatusMovedPermanently, short.LongUrl)}}
}

Nginx 配置:

location "~/slink/([a-z]|[A-Z]|[0-9]){7,8}$" {
¦   proxy_pass http://127.0.0.1:7788;
}
location /slink/short {
¦   proxy_pass http://127.0.0.1:7788/short;
¦   proxy_redirect off;
¦   proxy_set_header Host $host;
¦   proxy_set_header X-Real-IP $remote_addr;
¦   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
¦   proxy_set_header X-Forwarded-Proto $scheme;
¦   client_max_body_size 30m;
¦   client_body_buffer_size 256k;
¦   proxy_connect_timeout   90;
¦   proxy_send_timeout      180;
¦   proxy_read_timeout      180;
¦   proxy_buffer_size       256k;
¦   proxy_buffers           16 256k;
¦   proxy_busy_buffers_size 1024k;
¦   proxy_temp_file_write_size      1024k;
}

效果图

data.short 就是短链接啦,访问试一下吧!

项目地址:https://github.com/Fxuing/short-link

Go 实现短链接服务相关推荐

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

    Java 网址短链接服务原理及解决方案 参考文章: (1)Java 网址短链接服务原理及解决方案 (2)https://www.cnblogs.com/xuzhujack/p/11202364.htm ...

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

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

  3. 如何使用ASP.NET Core Web API实现短链接服务

    前言 在前面的文章中,我们介绍了hashids.net,可以将数值型Id加密成无意义的字符串. 今天,我们来利用这一特点,实现短链接服务. 原理 短链接,顾名思义就是在形式上比较短的链接网址.借助短链 ...

  4. php传递字符串给python,用PHP和Python生成短链接服务的字符串ID

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

  5. Docker部署自己的短链接服务

    Docker部署自己的短链接服务 Jump Jump 开箱即用,Go 语言开发的一个功能完善的短链接系统. 快速体验 功能与使用 短链接管理 本地启动 如何访问短链接? 设置短链接域名 获取完整短链接 ...

  6. java 短链接url_Java 网址短链接服务原理及解决方案

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

  7. 百度 谷歌 Twitter,这么多短链接服务(Short Url)到底哪家强?

    一.短链接是什么 短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串. 它的原理也非常简单,就是采用 Domain Redirect(域名重定向) ,将一个域名自动跳转 ...

  8. java短链接_Java 网址短链接服务原理及解决方案

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

  9. 短链接服务架构设计概览

    目录 一.为什么需要短链接 二.使用短链接的一些典型场景 2.1 字数限制场景 2.1.1 微博内容 2.1.2 用户短信 2.2 短链接二维码 2.3 无法识别长链接场景 三.短链接生成方案 四.短 ...

  10. 利用Python打造短链接服务

    有时候我们需要推广的链接太长不利于我们去推广,这时候我们就需要用到短链接服务. 目前国内有很多家网站提供网站缩短服务,比如腾讯家的http://t.im.微博家的http://t.cn.百度家的htt ...

最新文章

  1. Python学习笔记二:布尔表达式
  2. 【Live555】live555源码详解(六):FramedSource、RTPSource、RTPSink
  3. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
  4. ImportError: module ‘pip‘ has no attribute ‘main‘
  5. 如何加快按生产订单查找物料凭证的报表的速度
  6. php中数组生成下拉选项,php利用数组填充下拉列表框
  7. php分页排序不变化,php – 计算已排序分页的给定记录的跳过值
  8. linux下关于密码复杂度设置
  9. Cocos2d-x游戏开发之lua编辑器 Sublime 搭建,集成cocos2dLuaApi和自有类
  10. 设计师拥有一流导航,即是全世界
  11. java持久层用文件_Java持久层框架MyBatis简单实例
  12. [译]git fetch
  13. GandCrab4.0勒索病毒解密工具
  14. Flash制作标题出现动画
  15. 手持式频谱分析仪TFN FMT650频谱分析 干扰分析 干扰定位 地图覆盖
  16. 杭州第三大世界文化遗产--良渚古城遗址
  17. 模板引擎?看这一篇就懂了
  18. 【转】App应用内搜索:移动搜索的新入口
  19. java把一个对象赋值给另一个对象
  20. 安全运维 | 八大运维监控平台及选型推荐

热门文章

  1. Debian Squeez 安装 Gnome3
  2. 站点部署 廖雪峰的官方网站
  3. 在react里实现点击回车键执行事件
  4. 天阔服务器用户名密码,曙光天阔服务器远程控制手册.doc
  5. 关于今天参加学校ACM比赛的感想
  6. 2021-08-23 多模态反讽识别系列文章阅读(一)
  7. 计算机页面新建,电脑PS如何新建多个画布并使其显示在一个界面
  8. BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比
  9. Redis —— SpringBoot工程下的GeoHash工具类
  10. hyper graph 超图