国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

Go-Zero 是如何做路由管理的?

來源: 責編: 時間:2023-08-09 23:03:50 395觀看
導讀go-zero 是一個微服務框架,包含了 web 和 rpc 兩大部分。而對于 web 框架來說,路由管理是必不可少的一部分,那么本文就來探討一下 go-zero 的路由管理是怎么做的,具體采用了哪種技術方案。路由管理方案路由管理方案有很多

7wg28資訊網——每日最新資訊28at.com

go-zero 是一個微服務框架,包含了 web 和 rpc 兩大部分。7wg28資訊網——每日最新資訊28at.com

而對于 web 框架來說,路由管理是必不可少的一部分,那么本文就來探討一下 go-zero 的路由管理是怎么做的,具體采用了哪種技術方案。7wg28資訊網——每日最新資訊28at.com

路由管理方案

路由管理方案有很多種,具體應該如何選擇,應該根據使用場景,以及實現的難易程度做綜合分析,下面介紹常見的三種方案。7wg28資訊網——每日最新資訊28at.com

注意這里只是做一個簡單的概括性對比。7wg28資訊網——每日最新資訊28at.com

標準庫方案

最簡單的方案就是直接使用 map[string]func() 作為路由的數據結構,鍵為具體的路由,值為具體的處理方法。7wg28資訊網——每日最新資訊28at.com

// 路由管理數據結構type ServeMux struct {    mu    sync.RWMutex          // 對象操作讀寫鎖    m     map[string]muxEntry   // 存儲路由映射關系}

這種方案優點就是實現簡單,性能較高;缺點也很明顯,占用內存更高,更重要的是不夠靈活。7wg28資訊網——每日最新資訊28at.com

Trie Tree

Trie Tree 也稱為字典樹或前綴樹,是一種用于高效存儲和檢索、用于從某個集合中查到某個特定 key 的數據結構。7wg28資訊網——每日最新資訊28at.com

圖片7wg28資訊網——每日最新資訊28at.com

Radix Tree 通過合并公共前綴來降低存儲空間的開銷,避免了 Trie Tree 字符串過長和字符集過大時導致的存儲空間過多問題,同時公共前綴優化了路徑層數,提升了插入、查詢、刪除等操作效率。7wg28資訊網——每日最新資訊28at.com

比如 Gin 框架使用的開源組件 HttpRouter 就是采用這個方案。7wg28資訊網——每日最新資訊28at.com

go-zero 路由規則

在使用 go-zero 開發項目時,定義路由需要遵守如下規則:7wg28資訊網——每日最新資訊28at.com

  1. 路由必須以 / 開頭
  2. 路由節點必須以 / 分隔
  3. 路由節點中可以包含 :,但是 : 必須是路由節點的第一個字符,: 后面的節點值必須要在結請求體中有 path tag 聲明,用于接收路由參數
  4. 路由節點可以包含字母、數字、下劃線、中劃線

接下來就讓我們深入到源碼層面,相信看過源碼之后,你就會更懂這些規則的意義了。7wg28資訊網——每日最新資訊28at.com

go-zero 源碼實現

首先需要說明的是,底層數據結構使用的是二叉搜索樹,還不是很了解的同學可以看這篇文章:使用 Go 語言實現二叉搜索樹。7wg28資訊網——每日最新資訊28at.com

節點定義

先看一下節點定義:7wg28資訊網——每日最新資訊28at.com

// core/search/tree.goconst (    colon = ':'    slash = '/')type (    // 節點    node struct {        item     interface{}        children [2]map[string]*node    }    // A Tree is a search tree.    Tree struct {        root *node    })

重點說一下 children,它是一個包含兩個元素的數組,元素 0 存正常路由鍵,元素 1 存以 : 開頭的路由鍵,這些是 url 中的變量,到時候需要替換成實際值。7wg28資訊網——每日最新資訊28at.com

舉一個例子,有這樣一個路由 /api/:user,那么 api 會存在 children[0],user 會存在 children[1]。7wg28資訊網——每日最新資訊28at.com

具體可以看看這段代碼:7wg28資訊網——每日最新資訊28at.com

func (nd *node) getChildren(route string) map[string]*node {    // 判斷路由是不是以 : 開頭    if len(route) > 0 && route[0] == colon {        return nd.children[1]    }    return nd.children[0]}

路由添加

// Add adds item to associate with route.func (t *Tree) Add(route string, item interface{}) error {    // 需要路由以 / 開頭    if len(route) == 0 || route[0] != slash {        return errNotFromRoot    }    if item == nil {        return errEmptyItem    }    // 把去掉 / 的路由作為參數傳入    err := add(t.root, route[1:], item)    switch err {    case errDupItem:        return duplicatedItem(route)    case errDupSlash:        return duplicatedSlash(route)    default:        return err    }}func add(nd *node, route string, item interface{}) error {    if len(route) == 0 {        if nd.item != nil {            return errDupItem        }        nd.item = item        return nil    }    // 繼續判斷,看看是不是有多個 /    if route[0] == slash {        return errDupSlash    }    for i := range route {        // 判斷是不是 /,目的就是去處兩個 / 之間的內容        if route[i] != slash {            continue        }        token := route[:i]                // 看看有沒有子節點,如果有子節點,就在子節點下面繼續添加        children := nd.getChildren(token)        if child, ok := children[token]; ok {            if child != nil {                return add(child, route[i+1:], item)            }            return errInvalidState        }        // 沒有子節點,那么新建一個        child := newNode(nil)        children[token] = child        return add(child, route[i+1:], item)    }    children := nd.getChildren(route)    if child, ok := children[route]; ok {        if child.item != nil {            return errDupItem        }        child.item = item    } else {        children[route] = newNode(item)    }    return nil}

主要部分代碼都已經加了注釋,其實這個過程就是樹的構建,如果讀過之前那篇文章,那這里還是比較好理解的。7wg28資訊網——每日最新資訊28at.com

路由查找

先來看一段 match 代碼:7wg28資訊網——每日最新資訊28at.com

func match(pat, token string) innerResult {    if pat[0] == colon {        return innerResult{            key:   pat[1:],            value: token,            named: true,            found: true,        }    }    return innerResult{        found: pat == token,    }}

這里有兩個參數:7wg28資訊網——每日最新資訊28at.com

  • pat:路由樹中存儲的路由。
  • token:實際請求的路由,可能包含參數值。

還是剛才的例子 /api/:user,如果是 api,沒有以 : 開頭,那就不會走 if 邏輯。7wg28資訊網——每日最新資訊28at.com

接下來匹配 :user 部分,如果實際請求的 url 是 /api/zhangsan,那么會將 user 作為 key,zhangsan 作為 value 保存到結果中。7wg28資訊網——每日最新資訊28at.com

下面是搜索查找代碼:7wg28資訊網——每日最新資訊28at.com

// Search searches item that associates with given route.func (t *Tree) Search(route string) (Result, bool) {    // 第一步先判斷是不是 / 開頭    if len(route) == 0 || route[0] != slash {        return NotFound, false    }    var result Result    ok := t.next(t.root, route[1:], &result)    return result, ok}func (t *Tree) next(n *node, route string, result *Result) bool {    if len(route) == 0 && n.item != nil {        result.Item = n.item        return true    }    for i := range route {        // 和 add 里同樣的提取邏輯        if route[i] != slash {            continue        }        token := route[:i]        return n.forEach(func(k string, v *node) bool {            r := match(k, token)            if !r.found || !t.next(v, route[i+1:], result) {                return false            }            // 如果 url 中有參數,會把鍵值對保存到結果中            if r.named {                addParam(result, r.key, r.value)            }            return true        })    }    return n.forEach(func(k string, v *node) bool {        if r := match(k, route); r.found && v.item != nil {            result.Item = v.item            if r.named {                addParam(result, r.key, r.value)            }            return true        }        return false    })}

以上就是路由管理的大部分代碼,整個文件也就 200 多行,邏輯也并不復雜,通讀之后還是很有收獲的。7wg28資訊網——每日最新資訊28at.com

大家如果感興趣的話,可以找到項目更詳細地閱讀。也可以關注我,接下來還會分析其他模塊的源碼。7wg28資訊網——每日最新資訊28at.com

本文鏈接:http://m.rrqrq.com/showinfo-26-5196-0.htmlGo-Zero 是如何做路由管理的?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊抽象工廠模式(AbstractFactoty)

下一篇: 三言兩語說透webpack對vue的編譯

標簽:
  • 熱門焦點
  • 容量越大越不壞?24萬塊硬盤故障率報告公布 這些產品零故障

    8月5日消息,云存儲服務商Backblaze發布了最新的硬盤故障率報告,年故障率有所上升。Backblaze發布的硬盤季度統計數據,其中包括故障率等重要方面。這些結
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網聯合創
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • 蘋果公司要求三星和LG Display生產「無邊框」OLED iPhone顯示屏

    據 The Elec 報道,蘋果已要求其供應商為未來的 iPhone 型號開發「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發新的 OLED 顯示面
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
国产一区二区三区电影在线观看| 日韩亚洲欧美成人一区| 欧美日韩亚洲不卡| 精品久久免费看| 亚洲男人的天堂在线观看| 亚洲国产综合视频在线观看| 久久99久久精品| 午夜精品剧场| 日本韩国欧美一区二区三区| 久久夜色精品国产噜噜av| 一二三区精品视频| 国产成人av一区二区三区在线观看| 欧美另类专区| 欧美日韩免费观看一区二区三区| 久久亚洲精华国产精华液| 亚洲国产aⅴ天堂久久| 国产sm精品调教视频网站| 99riav国产精品| 欧美一级日韩不卡播放免费| 亚洲老司机在线| 国产精品123| 国产精品入口66mio| 欧美岛国在线观看| 亚洲成在人线在线播放| 成人aa视频在线观看| 久久精品系列| 中文久久乱码一区二区| 久久国产精品色婷婷| 91久久黄色| 精品成a人在线观看| 视频一区欧美精品| 一区二区视频欧美| 日韩欧美一区二区久久婷婷| 视频一区二区三区中文字幕| 欧美精品97| 日韩一区二区三区电影在线观看 | 国产激情一区二区三区| 国产精品一区二区a| 国产日产欧美精品一区二区三区| 毛片不卡一区二区| 国产精品永久入口久久久| 久久综合九色综合久久久精品综合 | 美美哒免费高清在线观看视频一区二区 | 亚洲一区二区精品在线观看| 中文字幕不卡在线观看| 福利一区在线观看| 欧美亚洲免费在线一区| 亚洲成av人片| 亚洲高清视频一区| 中文字幕av一区二区三区高| 成人免费毛片app| 制服丝袜中文字幕一区| 日本午夜一区二区| 亚洲欧美日韩一区在线观看| 亚洲欧美偷拍三级| 国产一区免费视频| 久久亚洲春色中文字幕久久久| 国产精品一区二区免费不卡| 91国偷自产一区二区三区观看| 亚洲午夜一区二区| 国产日韩综合| 亚洲日本中文字幕区| 亚洲私人影院| 国产精品久久久久天堂| 99精品黄色片免费大全| 欧美变态口味重另类| 国产高清久久久久| 在线综合亚洲欧美在线视频| 精品一区二区三区在线播放视频| 色综合久久六月婷婷中文字幕| 亚洲一区二区精品3399| 亚洲黑丝一区二区| 亚洲精品视频自拍| 亚洲日本久久| 亚洲成人av一区二区| 久久成人资源| 日韩电影免费在线| 日本丰满少妇一区二区三区| 麻豆高清免费国产一区| 欧美人伦禁忌dvd放荡欲情| 韩国女主播一区| 日韩一区二区精品| 色综合天天综合给合国产| 国产亚洲污的网站| 永久久久久久| 亚洲精品视频在线看| 免费h精品视频在线播放| 日产精品久久久久久久性色| 欧美日韩一区二区电影| 国产九九视频一区二区三区| 欧美va在线播放| 欧美久久影院| 一区二区在线观看av| 日本精品一区二区三区高清| 久88久久88久久久| 久久欧美一区二区| 最新日韩欧美| 亚洲电影中文字幕在线观看| 欧美性猛片aaaaaaa做受| 九九在线精品视频| 精品福利在线导航| 国产欧美一区二区三区另类精品| 午夜精品久久久久久久久久久 | 久久99国产精品久久99果冻传媒| 欧美不卡一区二区三区| 激情另类综合| 另类综合日韩欧美亚洲| 久久夜色精品国产噜噜av| 99热精品在线| 黄色日韩三级电影| 国产精品色哟哟| 玖玖国产精品视频| 99久久免费视频.com| 亚洲伦理在线免费看| 欧美精品xxxxbbbb| 激情综合自拍| 国产资源在线一区| 国产精品天美传媒| 欧美日韩中文字幕一区二区| 91免费观看国产| 亚洲无人区一区| 精品国产一区二区三区忘忧草| 亚洲精品1区2区| 国产精品中文有码| 一区二区免费看| 欧美电影精品一区二区| 亚洲欧美久久久| 99久久99久久综合| 亚洲国产一区二区三区青草影视| 日韩欧美在线1卡| 性色一区二区| 欧美国产另类| 激情综合一区二区三区| 自拍偷在线精品自拍偷无码专区| 欧美亚洲动漫制服丝袜| 黄色国产精品一区二区三区| 国产一区二区在线视频| 有坂深雪av一区二区精品| 在线不卡a资源高清| 国产精品日本欧美一区二区三区| 国产久卡久卡久卡久卡视频精品| 亚洲欧洲成人精品av97| 在线免费视频一区二区| 日本欧美久久久久免费播放网| 中文字幕av免费专区久久| 欧洲亚洲国产日韩| 欧美高清视频一区二区三区在线观看| 亚洲网友自拍偷拍| 国产精品久久久久影院亚瑟| 欧美精品一区二区三| 久久精品国产第一区二区三区最新章节 | 黄色在线成人| 国产福利一区二区三区视频在线| 最新中文字幕一区二区三区 | 亚洲午夜久久久久久久久电影网 | jizz一区二区| 午夜激情综合网| 国产清纯美女被跳蛋高潮一区二区久久w| 久久精品在线| 极品av少妇一区二区| 日本麻豆一区二区三区视频| 亚洲精品乱码久久久久久| 日韩久久免费av| 91国偷自产一区二区三区观看| 欧美日韩三级电影在线| 成人av动漫网站| 麻豆久久久久久| 亚洲成人精品在线观看| 日本一区二区免费在线| 久久精精品视频| 久久久久久久久久码影片| 极品日韩久久| 91亚洲精品一区二区乱码| 国产最新精品免费| 国产一区视频导航| 午夜伦欧美伦电影理论片| 国产精品二三区| 久久免费美女视频| 国产亚洲午夜高清国产拍精品 | 久久99精品国产91久久来源| 亚洲一区二区视频在线观看| 国产精品久久久久一区二区三区共| 日韩一区二区三区视频在线观看| 在线观看成人小视频| 欧美一级播放| 国产伦精品一区二区| 免费不卡在线视频| 日日摸夜夜添夜夜添国产精品 | 久久一区二区三区四区| 欧美男男青年gay1069videost| 合欧美一区二区三区| 99久久精品一区| 不卡区在线中文字幕| 成人高清在线视频| 成人免费观看av| 蜜桃av噜噜一区二区三区小说| 日韩电影在线免费观看| 亚洲狠狠丁香婷婷综合久久久| 国产精品久久毛片| 亚洲欧美综合另类在线卡通|