什么是短鏈接服務
短鏈接服務將原本較長的網(wǎng)址轉(zhuǎn)化成較短的網(wǎng)址,從而便于用戶的記憶與社交軟件上的傳播。
假設,我們要做一次簡單的營銷活動,活動流程大體如下:
首先,將營銷落地頁,一個較長的 URL通過短鏈接服務轉(zhuǎn)化為一個比較短的 URL;
然后,通過營銷渠道將短鏈接發(fā)送給目標用戶(比如短信);
在用戶獲得短鏈接后,通過鏈接訪問短鏈接服務。系統(tǒng)接受請求并將請求重定向到原始的長鏈地址;
最后,用戶使用長鏈地址直接訪問目標網(wǎng)站,從而獲得最終響應結(jié)果。
整體流程如下:
短鏈接服務的核心流程主要包括 創(chuàng)建短鏈接 和 訪問短鏈接 。
系統(tǒng)設計要點
短鏈接服務的核心流程主要圍繞 Key 和 Map 進行構建的,如:
創(chuàng)建短鏈接。首先,生成一個 Key,將長鏈地址作為 value 保存到 Map 中,然后將短鏈域名和 key 拼接成短鏈接,返回給調(diào)用方;
訪問短鏈接。服務從 URL 中提取 key,然后在 Map 中查找目標鏈接,對目標地址做重定向處理。
Map 結(jié)構我們可以基于 MySQL 和 Cache 進行構建,那就剩下如下問題了:
Key 怎么來,又是怎么維護的?
如何通過 Http 協(xié)議進行請求重定向?
2.1 Key 生成
通常情況下,Key 的生成方式由很多。但對于短鏈接服務來說,生成 Key 的長度是一個非常重要的指標。
首先,生成的 Key 不能重復;其次,Key 要盡可能短。這樣才能使最終短鏈長度盡可能的小。
基于此,我們無法使用分布式 Key 生成算法,如 UUID。最佳的生成策略應該是基于 Number 自增的方案。
結(jié)論:我們需要一個基于 Number 自增的 Key 生成器。
2.2 Key 編解碼
如果我們使用 Number 作為 Key,那么還有沒有方案進一步壓縮 Number 長度呢?
對于數(shù)字來說:
8 進制比 2 進制短;
10 進制比 8 進制短;
16 進制比 10 進制短;
......
因此,我們可以使用高進制對數(shù)字 Key 進行編解碼,從而進一步壓縮 Key 的長度。
2.3 請求重定向
請求重定向是 HTTP 協(xié)議的一部分,JEE 的 HttpServletResponse 就提供重定向接口,同時 Spring MVC 對其也提供了支持。
基于 HttpServletResponse 的重定向:
public void redirect(@PathVariable String code, HttpServletResponse response) throws IOException { String url = getTargetUrl(code); // 調(diào)用 sendRedirect 方法,進行請求重定向 response.sendRedirect(url); }
基于 Spring MVC 的重定向:
public ModelAndView redirect(@PathVariable String code){ String url = getTargetUrl(code); // 使用 RedirectView,進行請求重定向 RedirectView redirectView = new RedirectView(); redirectView.setUrl(url); return new ModelAndView(redirectView); }
要點分析完成后,讓我們先把 maven 項目搭建起來。
項目搭建
該項目使用 Spring Boot 作為主要開發(fā)框架。
項目依賴組件:
組件 | 含義 |
---|---|
spring-boot-starter-web | Web |
flyway | 數(shù)據(jù)庫管理 |
Junit | 測試 |
lombok | 自動生成getter、setter |
隨著功能的增加,將為項目添加更多依賴。
3.1. 項目生成
瀏覽器中輸入 https://start.spring.io/ ,打開 spring-boot 項目生成器,按照下列配置生成項目:
名稱 | 值 |
---|---|
項目類型 | maven |
語言 | java |
Boot版本 | 2.1.1 |
group | com.geekhalo |
artifact | tinyurl |
dependency | web、flyway、lombok |
點擊“Generate Project”,生成并下載項目。將下載的項目解壓,得到一個完整的 maven 項目,打開熟悉的 IDE,將項目導入到 IDE 中。
我們生成了一個空的 Spring Boot 項目,稍后的所有操作都會基于這個項目完成。
項目成功生成后,讓我們對系統(tǒng)進行進一步分析。首先,需要對系統(tǒng)中的核心組件進行梳理。
核心組件
基于設計分析,我們可以整理出系統(tǒng)所需的核心組件。
4.1 NumberGenerator
通過自增方式生成 Number 類型的 Key。
其接口簽名如下:
public interface NumberGenerator { /** * 生成自增 Key * @return */ Long nextNumber(NumberType type); }
4.2 NumberEncoder
對 Number 進行編解碼操作,以進一步減少 Key 的長度。
其接口簽名如下:
public interface NumberEncoder { /** * 對 Number 進行編碼 * @param id * @return */ String encode(Long id); /** * 對 Number 進行解密 * @param str * @return */ Long decode(String str); }
4.3 TargetUrlRepository
用于處理目標 URL 的持久化。
其接口定義如下:
public interface TargetUrlRepository { /** * 添加鏈接 * @param targetUrl */ void save(TargetUrl targetUrl); /** * 獲取連接 * @param id * @return */ TargetUrl getById(Long id); }
至此,系統(tǒng)核心組件就分析完了。接下來,讓我們看下核心流程。
核心流程
核心流程主要包括創(chuàng)建短鏈接和訪問短鏈接。
5.1 創(chuàng)建短鏈接
創(chuàng)建短鏈接,主要服務于內(nèi)部系統(tǒng),將較長的 URL 地址提交到短鏈接服務,并獲取與之對應的較短的 URL 地址。
創(chuàng)建短鏈接流程大體如下:
審核編輯:湯梓紅
-
互聯(lián)網(wǎng)
+關注
關注
54文章
11231瀏覽量
105581 -
系統(tǒng)設計
+關注
關注
0文章
163瀏覽量
21936 -
MySQL
+關注
關注
1文章
849瀏覽量
27518 -
key
+關注
關注
0文章
53瀏覽量
13027
原文標題:高性能系統(tǒng)設計:互聯(lián)網(wǎng)短鏈接服務
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論