Go 实现短链接服务
生活随笔
收集整理的這篇文章主要介紹了
Go 实现短链接服务
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Go 實(shí)現(xiàn)短鏈接服務(wù)
我們在推廣的時候,經(jīng)常會碰到鏈接或者二維碼的時候,這時候鏈接太長,看起來不太友好,生成的二維碼也是密密麻麻的,所以會用到短鏈接服務(wù)。
主要思路
直接生成短鏈接,短鏈接通過當(dāng)前時間戳轉(zhuǎn)換Base62
將長鏈接和短鏈接數(shù)據(jù)保存到數(shù)據(jù)庫
生成的時候,先查看下鏈接有沒有生成過,如果生成過,用之前生成的短鏈即可
生成之后,需要寫個中間件做預(yù)處理,當(dāng)前url是否為短鏈,如果是短鏈,直接重定向到 長鏈接去。
服務(wù)編寫好后,Nginx加一段配置 ,針對短鏈轉(zhuǎn)發(fā)到短鏈接服務(wù)。
使用到的技術(shù)
-
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 }請求預(yù)處理重定向:
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 就是短鏈接啦,訪問試一下吧!
項(xiàng)目地址:https://github.com/Fxuing/short-link
總結(jié)
以上是生活随笔為你收集整理的Go 实现短链接服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结一下Java中SQL的九种写法
- 下一篇: 2013 前瞻 + 技术牛