<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>

          云原生 go-zero 微服務(wù)框架介紹

          共 2852字,需瀏覽 6分鐘

           ·

          2020-08-26 12:21

          0. go-zero 介紹

          go-zero 是一個集成了各種工程實(shí)踐的 web 和 rpc 框架。通過彈性設(shè)計(jì)保障了大并發(fā)服務(wù)端的穩(wěn)定性,經(jīng)受了充分的實(shí)戰(zhàn)檢驗(yàn)。

          go-zero 包含極簡的 API 定義和生成工具 goctl,可以根據(jù)定義的 api 文件一鍵生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代碼,并可直接運(yùn)行。

          使用 go-zero 的好處:

          • 輕松獲得支撐千萬日活服務(wù)的穩(wěn)定性

          • 內(nèi)建級聯(lián)超時控制、限流、自適應(yīng)熔斷、自適應(yīng)降載等微服務(wù)治理能力,無需配置和額外代碼

          • 微服務(wù)治理中間件可無縫集成到其它現(xiàn)有框架使用

          • 極簡的 API 描述,一鍵生成各端代碼

          • 自動校驗(yàn)客戶端請求參數(shù)合法性

          • 大量微服務(wù)治理和并發(fā)工具包



          1. go-zero 框架背景

          18 年初,曉黑板后端在經(jīng)過頻繁的宕機(jī)后,決定從Java+MongoDB的單體架構(gòu)遷移到微服務(wù)架構(gòu),經(jīng)過仔細(xì)思考和對比,我們決定:

          • 基于 Go 語言

            • 高效的性能

            • 簡潔的語法

            • 廣泛驗(yàn)證的工程效率

            • 極致的部署體驗(yàn)

            • 極低的服務(wù)端資源成本

          • 自研微服務(wù)框架

            • 個人有過很多微服務(wù)框架自研經(jīng)驗(yàn)

            • 需要有更快速的問題定位能力

            • 更便捷的增加新特性

          2. go-zero 框架設(shè)計(jì)思考

          對于微服務(wù)框架的設(shè)計(jì),我們期望保障微服務(wù)穩(wěn)定性的同時,也要特別注重研發(fā)效率。所以設(shè)計(jì)之初,我們就有如下一些準(zhǔn)則:

          • 保持簡單

          • 高可用

          • 高并發(fā)

          • 易擴(kuò)展

          • 彈性設(shè)計(jì),面向故障編程

          • 盡可能對業(yè)務(wù)開發(fā)友好,封裝復(fù)雜度

          • 盡可能約束做一件事只有一種方式

          我們經(jīng)歷不到半年時間,徹底完成了從Java+MongoDBGolang+MySQL為主的微服務(wù)體系遷移,并于 18 年 8 月底完全上線,穩(wěn)定保障了曉黑板后續(xù)增長,確保了整個服務(wù)的高可用。

          3. go-zero 項(xiàng)目實(shí)現(xiàn)和特點(diǎn)

          go-zero 是一個集成了各種工程實(shí)踐的包含 web 和 rpc 框架,有如下主要特點(diǎn):

          • 強(qiáng)大的工具支持,盡可能少的代碼編寫

          • 極簡的接口

          • 完全兼容 net/http

          • 支持中間件,方便擴(kuò)展

          • 高性能

          • 面向故障編程,彈性設(shè)計(jì)

          • 內(nèi)建服務(wù)發(fā)現(xiàn)、負(fù)載均衡

          • 內(nèi)建限流、熔斷、降載,且自動觸發(fā),自動恢復(fù)

          • API 參數(shù)自動校驗(yàn)

          • 超時級聯(lián)控制

          • 自動緩存控制

          • 鏈路跟蹤、統(tǒng)計(jì)報警等

          • 高并發(fā)支撐,穩(wěn)定保障了曉黑板疫情期間每天的流量洪峰

          如下圖,我們從多個層面保障了整體服務(wù)的高可用:



          4. go-zero 近期開發(fā)計(jì)劃

          • 自動生成 API mock server,便于客戶端開發(fā)

          • 自動生成服務(wù)端功能測試

          5. Installation

          在項(xiàng)目目錄下通過如下命令安裝:

          go get -u github.com/tal-tech/go-zero

          6. Quick Start

          1. 編譯 goctl 工具

          go build tools/goctl/goctl.go

          把 goctl 放到 $PATH 的目錄下,確保 goctl 可執(zhí)行

          1. 定義 API 文件,比如 greet.api,可以在 vs code 里安裝goctl插件,支持 api 語法

          type Request struct {
          Name string `path:"name,options=you|me"` // 框架自動驗(yàn)證請求參數(shù)是否合法
          }

          type Response struct {
          Message string `json:"message"`
          }

          service greet-api {
          @server(
          handler: GreetHandler
          )
          get /greet/from/:name(Request) returns (Response);
          }

          也可以通過 goctl 生成 api 模板文件,命令如下:

          goctl api -o greet.api
          1. 生成 go 服務(wù)端代碼

          goctl api go -api greet.api -dir greet

          生成的文件結(jié)構(gòu)如下:

          ├── greet
          │?? ├── etc
          │?? │?? └── greet-api.json // 配置文件
          │?? ├── greet.go // main文件
          │?? └── internal
          │?? ├── config
          │?? │?? └── config.go // 配置定義
          │?? ├── handler
          │?? │?? ├── greethandler.go // get/put/post/delete等路由定義文件
          │?? │?? └── routes.go // 路由列表
          │?? ├── logic
          │?? │?? └── greetlogic.go // 請求邏輯處理文件
          │?? ├── svc
          │?? │?? └── servicecontext.go // 請求上下文,可以傳入mysql, redis等依賴
          │?? └── types
          │?? └── types.go // 請求、返回等類型定義
          └── greet.api // api描述文件

          生成的代碼可以直接運(yùn)行:

          cd greet
          go run greet.go -f etc/greet-api.json

          默認(rèn)偵聽在 8888 端口(可以在配置文件里修改),可以通過 curl 請求:

          ?  go-zero git:(master) curl -w "\ncode: %{http_code}\n" http://localhost:8888/greet/from/kevin
          {"code":0}
          code: 200

          編寫業(yè)務(wù)代碼:

          • 可以在 servicecontext.go 里面?zhèn)鬟f依賴給 logic,比如 mysql, redis 等

            • 在 api 定義的 get/post/put/delete 等請求對應(yīng)的 logic 里增加業(yè)務(wù)處理邏輯

          1. 可以根據(jù) api 文件生成前端需要的 Java, TypeScript, Dart, JavaScript 代碼

          goctl api java -api greet.api -dir greet
          goctl api dart -api greet.api -dir greet
          ...

          7. Benchmark



          測試代碼見這里:https://github.com/smallnest/go-web-framework-benchmark

          8. 項(xiàng)目地址

          https://github.com/tal-tech/go-zero

          9. 微信交流群

          掃碼加入微信交流群
          瀏覽 62
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  波多野视频在线 | 人妻无码久久精品人妻成人 | 亚洲阿v天堂 | 中文字幕日本有码 | 98成人网 |