<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          高性能系統(tǒng)設(shè)計(jì):互聯(lián)網(wǎng)短鏈接服務(wù)

          共 3857字,需瀏覽 8分鐘

           ·

          2023-08-29 20:02

          什么是短鏈接服務(wù)

          短鏈接服務(wù)將原本較長(zhǎng)的網(wǎng)址轉(zhuǎn)化成較短的網(wǎng)址,從而便于用戶的記憶與社交軟件上的傳播。

          假設(shè),我們要做一次簡(jiǎn)單的營(yíng)銷活動(dòng),活動(dòng)流程大體如下:

          • 首先,將營(yíng)銷落地頁(yè),一個(gè)較長(zhǎng)的 URL ( https://www.glo.com/2021/09/15/ddd/tactics/introduction/#more ) 通過短鏈接服務(wù)轉(zhuǎn)化為一個(gè)比較短的 URL( http://glo.com/s );

          • 然后,通過營(yíng)銷渠道將短鏈接發(fā)送給目標(biāo)用戶(比如短信);

          • 在用戶獲得短鏈接后,通過鏈接訪問短鏈接服務(wù)。系統(tǒng)接受請(qǐng)求并將請(qǐng)求重定向到原始的長(zhǎng)鏈地址;

          • 最后,用戶使用長(zhǎng)鏈地址直接訪問目標(biāo)網(wǎng)站,從而獲得最終響應(yīng)結(jié)果。

          整體流程如下:

          短鏈接服務(wù)的核心流程主要包括 創(chuàng)建短鏈接 和 訪問短鏈接 。

          系統(tǒng)設(shè)計(jì)要點(diǎn)

          短鏈接服務(wù)的核心流程主要圍繞 Key 和 Map 進(jìn)行構(gòu)建的,如:

          • 創(chuàng)建短鏈接。首先,生成一個(gè) Key,將長(zhǎng)鏈地址作為 value 保存到 Map 中,然后將短鏈域名和 key 拼接成短鏈接,返回給調(diào)用方;

          • 訪問短鏈接。服務(wù)從 URL 中提取 key,然后在 Map 中查找目標(biāo)鏈接,對(duì)目標(biāo)地址做重定向處理。

          Map 結(jié)構(gòu)我們可以基于 MySQL 和 Cache 進(jìn)行構(gòu)建,那就剩下如下問題了:

          • Key 怎么來,又是怎么維護(hù)的?

          • 如何通過 Http 協(xié)議進(jìn)行請(qǐng)求重定向?

          2.1 Key 生成

          通常情況下,Key 的生成方式由很多。但對(duì)于短鏈接服務(wù)來說,生成 Key 的長(zhǎng)度是一個(gè)非常重要的指標(biāo)。

          首先,生成的 Key 不能重復(fù);其次,Key 要盡可能短。這樣才能使最終短鏈長(zhǎng)度盡可能的小。

          基于此,我們無法使用分布式 Key 生成算法,如 UUID。最佳的生成策略應(yīng)該是基于 Number 自增的方案。

          結(jié)論:我們需要一個(gè)基于 Number 自增的 Key 生成器。

          2.2 Key 編解碼

          如果我們使用 Number 作為 Key,那么還有沒有方案進(jìn)一步壓縮 Number 長(zhǎng)度呢?

          對(duì)于數(shù)字來說:

          • 8 進(jìn)制比 2 進(jìn)制短;

          • 10 進(jìn)制比 8 進(jìn)制短;

          • 16 進(jìn)制比 10 進(jìn)制短;

          • ......

          因此,我們可以使用高進(jìn)制對(duì)數(shù)字 Key 進(jìn)行編解碼,從而進(jìn)一步壓縮 Key 的長(zhǎng)度。

          2.3 請(qǐng)求重定向

          請(qǐng)求重定向是 HTTP 協(xié)議的一部分,JEE 的 HttpServletResponse 就提供重定向接口,同時(shí) Spring MVC 對(duì)其也提供了支持。

          基于 HttpServletResponse 的重定向:

          public void redirect(@PathVariable String code, HttpServletResponse response) throws IOException {    String url = getTargetUrl(code);    // 調(diào)用 sendRedirect 方法,進(jìn)行請(qǐng)求重定向    response.sendRedirect(url);}

          基于 Spring MVC 的重定向:

          public ModelAndView redirect(@PathVariable String code){    String url = getTargetUrl(code);    // 使用 RedirectView,進(jìn)行請(qǐng)求重定向    RedirectView redirectView = new RedirectView();    redirectView.setUrl(url);    return new ModelAndView(redirectView);}


          要點(diǎn)分析完成后,讓我們先把 maven 項(xiàng)目搭建起來。

          項(xiàng)目搭建

          該項(xiàng)目使用 Spring Boot 作為主要開發(fā)框架。

          項(xiàng)目依賴組件:

          組件 含義
          spring-boot-starter-web Web
          flyway 數(shù)據(jù)庫(kù)管理
          Junit 測(cè)試
          lombok 自動(dòng)生成getter、setter

          隨著功能的增加,將為項(xiàng)目添加更多依賴。

          3.1. 項(xiàng)目生成

          瀏覽器中輸入 https://start.spring.io/ ,打開 spring-boot 項(xiàng)目生成器,按照下列配置生成項(xiàng)目:

          名稱
          項(xiàng)目類型 maven
          語(yǔ)言 java
          Boot版本 2.1.1
          group com.geekhalo
          artifact tinyurl
          dependency web、flyway、lombok

          點(diǎn)擊“Generate Project”,生成并下載項(xiàng)目。將下載的項(xiàng)目解壓,得到一個(gè)完整的 maven 項(xiàng)目,打開熟悉的 IDE,將項(xiàng)目導(dǎo)入到 IDE 中。

          我們生成了一個(gè)空的 Spring Boot 項(xiàng)目,稍后的所有操作都會(huì)基于這個(gè)項(xiàng)目完成。

          項(xiàng)目成功生成后,讓我們對(duì)系統(tǒng)進(jìn)行進(jìn)一步分析。首先,需要對(duì)系統(tǒng)中的核心組件進(jìn)行梳理。

          核心組件

          基于設(shè)計(jì)分析,我們可以整理出系統(tǒng)所需的核心組件。

          4.1 NumberGenerator

          通過自增方式生成 Number 類型的 Key。

          其接口簽名如下:

          public interface NumberGenerator {    /**     * 生成自增 Key     * @return     */    Long nextNumber(NumberType type);}


          4.2 NumberEncoder

          對(duì) Number 進(jìn)行編解碼操作,以進(jìn)一步減少 Key 的長(zhǎng)度。

          其接口簽名如下:

          public interface NumberEncoder {    /**     * 對(duì) Number 進(jìn)行編碼     * @param id     * @return     */    String encode(Long id);
          /** * 對(duì) Number 進(jìn)行解密 * @param str * @return */ Long decode(String str);}


          4.3 TargetUrlRepository

          用于處理目標(biāo) 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)建短鏈接,主要服務(wù)于內(nèi)部系統(tǒng),將較長(zhǎng)的 URL 地址提交到短鏈接服務(wù),并獲取與之對(duì)應(yīng)的較短的 URL 地址。

          創(chuàng)建短鏈接流程大體如下:

          (版權(quán)歸原作者所有,侵刪)


          瀏覽 679
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情久久九九 | 日本A片免费在线观看 | 二月久久激情国产毛片 | 欧美三级片手机在线观看 | 99热这里只有精品9 |