在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

“逃離”單體,GitHub的微服務架構實踐

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-01-31 10:33 ? 次閱讀

1、旅程開啟

GitHub 創建于 2008 年,其宗旨是為開發人員托管和分享代碼提供便利。GitHub 的創建者也是開源貢獻者,他們在 Ruby 社區非常有影響力。正因為如此,GitHub 的架構深深地扎根于 Ruby on Rails。在公司的整個發展歷程中,我們雇傭了世界上最好的 Ruby 開發人員,幫助我們擴展和優化代碼庫。如今,我們的平臺上已經有超過 5000 萬名開發人員,每年有超過 8000 萬個 pull 請求合并,全球各大洲有超過 1 億個代碼存儲庫。如你所見,這個單體架構已經帶我們走得很遠。一個演進了 12 年的代碼庫,每天要協調多次部署。我們有一個規模很大的平臺,每天處理 10 億次 API 調用,我們還提供了一個高性能的用戶界面,專注于完成這項工作。

2、內部快速增長

在過去 18 個月中,GitHub 內部經歷了快速增長。我們已經有超過 2000 名員工,為代碼庫做貢獻的工程師數量已經是以前的兩倍多。這種增長既包括自身的逐步發展,也包括收購,如 Semmle、npm、Dependabot 和 Pull Panda。此外,GitHub 是一個高度分散的團隊,在疫情發生前,我們就有超過 70% 的員工是在舊金山總部以外的地方辦公。GitHub 的員工和承包商要跨六大洲展開協作,他們工作的時區各不相同。我們有 1000 多名內部開發人員,他們有各種各樣的開發技能,涉及到許多不同的技術。顯然,我們需要從根本上重新考慮下 GitHub 的軟件開發工作。讓每個人在參與開發之前都學習 Ruby,讓所有人都在同一個單體代碼庫上進行開發,不再是擴展 GitHub 最高效、最優化的方法。根據康威定律,任何組織設計的系統,其結構都是對組織溝通結構的復制。反之亦然,單體架構會導致更大規模的涉眾會議,更復雜的決策過程,因為交織的邏輯和共享的數據會影響所有團隊。

3、單體 vs. 微服務

因此我們就想,是不是該從 Ruby on Rails 單體遷出,轉向一種微服務架構了?如果是這樣的話,我們該如何進行?單體架構和微服務架構各有所長。在單體環境中,配置并運行應用程序更簡單,不用考慮復雜的依賴關系,拉取所有必要的依賴項。新建一個 Hubber,只需幾個小時就可以在本機上配置好 GitHub 并運行起來。在單體架構中,代碼在有些情況下會更簡潔。例如,不用添加超時處理邏輯,也不用考慮如何優雅地處理由網絡延遲和中斷所導致的失敗。此外,由于所有人都工作在同一個技術棧上,大家對代碼庫都很熟悉,所以可以方便地將開發人員和團隊調去開發單體的其他特性,有利于實現特性的全局最優。考慮到 GitHub 在過去 18 個月中的增長情況,微服務環境的一部分優點吸引了我們。例如,建立具有系統級所有權的特性團隊,通過清晰定義的 API 契約確立職責邊界。在遵循 API 契約的前提下,團隊有充分的自由選擇最適合自己的技術棧。代碼庫更小意味著閱讀更容易、啟動速度更快、問題排查更簡單。開發人員不用為了提高生產力去理解一整個龐大的代碼庫的內部運行機制。最重要的是,服務現在可以根據各自的需求單獨擴展。

4、務實——以賦能為出發點

在開始遷移 GitHub 之前,我們花了一些時間考慮為什么要這樣做,以及這樣做的目標是什么。對我們來說,這是文化上的巨大轉變,需要做大量的工作。我們得想好,到底要解決什么問題和痛點。在 GitHub,這樣做可以讓超過一半的開發人員(在過去的 18 個月中加入)在單體代碼庫之外富有成效地開展工作。我們的目標是賦能而非替代。為此,我們得接受這樣一個現實,GitHub 未來的特性將基于一個單體 - 微服務混合的環境。也就是說,對于我們來說,維護和改進現有的單體代碼庫仍然很重要。有一個很好的例子是,我們最近升級到了 Ruby2.7。感興趣的話,可以從 GitHub 官方博客上了解我們做了什么,以及我們總體上如何改進系統。

5、良好的架構始于模塊化

良好的架構始于模塊化。拆分單體的第一步是考慮基于特性功能分割代碼和數據。這個過程可以在真正在微服務環境中拆分之前在單體中完成。使代碼庫易于管理,通常都是一種良好的架構實踐。確保每個服務都有自己的數據,并且能夠控制對這些數據的訪問,而且只能通過明確定義的 API 契約訪問。我看到,在很多情況下,人們會首先抽出代碼邏輯,但仍然使用單體的共享數據庫。這往往會導致分布式單體,這是最糟糕的單體,同時也是最糟糕的分布式。沒有獲得任何好處(比如,單獨快速地向生產環境中部署一組特性),卻還要應對微服務的復雜性。

6、數據拆分

正確地拆分數據是從單體架構轉向微服務的基礎。這里將稍微詳細地介紹下 GitHub 的做法。首先,我們在現有的數據庫模式中識別功能邊界,并按照這些邊界將實際的數據庫表分組。例如,我們將所有存儲庫相關的表分到一起,所有用戶相關的分到一起,所有項目相關的分到一起。我們將生成的功能分組稱為模式域,并記錄在 YAML 定義文件中。現在,這個文件就成了事實來源。在數據庫模式中添加或刪除表,都要更新這個文件。我們通過一種靜態分析測試方法來提醒開發人員,在修改數據庫模式時,要更新這個文件。接下來,對于每個模式域,我們找了一個分區鍵。這是一個共享字段,將一個功能組中的所有信息聯系在一起。例如,存儲庫模式域(其中包含所有與存儲庫相關的數據,如問題、pull 請求、評審意見)使用存儲庫 ID 作為分區鍵。最終,創建數據庫模式功能組幫助我們將數據拆分到微服務架構所需的不同服務器和集群上。對于當前的跨域查詢,我們做了修復,以防數據拆分對產品造成破壞。在 GitHub,我們在單體中實現了一個查詢監視器來幫助我們檢測,并在發現跨域查詢時發出告警信息。我們會根據域邊界,把這些查詢拆分并重寫成多個,并在應用程序層實現必要的連接。在劃分完功能組后,我們開始通過一個類似的過程,進一步將數據分片到相應的租戶組。GitHub 有超過 5000 萬用戶和 1 億個存儲庫,在這樣的規模下,功能組可能會變得非常大。這時,分區鍵就派上用場了。例如,一種簡單的方法是根據數值范圍將不同的用戶分配到不同的數據存儲。更常見的可能是根據每個數據集的特性(如區域和大小)所做的邏輯分組。Tenantizing 是一個很好的方法,可以將數據存儲故障的爆炸半徑限制在客戶的一個子集里,而不是一下子影響到所有人。

7、從核心服務和共享資源入手

我們已經花了很多時間討論數據拆分的重要性。現在,我們換個話題,介紹下從單體中抽取服務的基礎工作。一定要記住,依賴方向只能從單體內到單體外,不能反過來,否則,我們最終會得到一個分布式單體。也就是說,當從單體中抽取服務時,要從核心服務入手,然后逐步到特性層面。接下來,找出開發人員在單體環境中開發時所使用的助力工具。隨著時間的推移構建一些共享工具以方便單體開發,這是很常見的。例如,我們的特性標識,可以讓單體開發者安心地將新特性從測試環境轉到生產環境,因為在這個過程中,他們可以通過這個標識控制誰能看到這些特性。將助力工具轉移出來,讓開發人員在單體之外也可以使用這些工具。最后,在新服務上線運行后,務必要刪除舊的代碼路徑。通過工具來識別誰在調用這個服務,并規劃好如何將流量全部導向新服務,這樣你就不用老是為兩套代碼提供支持了。在 GitHub,我們使用一個名為 Scientist 的工具幫我們處理這種上線,我們可以用它并排運行和比較新舊代碼路徑。

8、AuthN/AuthZ 抽取

在 GitHub,我們決定首先抽取的核心服務是身份驗證和授權。身份驗證相當復雜,因為所有東西都依賴于它。網站和 Git 操作之間有一大堆的共享邏輯。也就是說,如果 github.com 宕掉了,那么 Git 系統就無法訪問了,即使是使用命令行窗口,也無法執行像 pull、push 這樣的 Git 操作。這就是為什么把這些基礎部分抽取出來如此重要,那可以讓主要功能脫離單體而運行。對于我們來說,身份驗證已經很簡單,因為我們已經在單體外部將它重寫為一個鏡像服務。當前的 Rails 應用程序(即我們的單體)使用 Twirp(這是一個 gRPC 風格的服務到服務通信框架)和它通信,依賴方向是由內到外。

9、運營變化

監控、CI/CD、容器化都不是什么新概念,但為了支持從單體到微服務的轉型,節省時間,加速向微服務的過渡,運營要做必要的改變。在修改這些工作流時,要時刻記著微服務的特性。與為一個大型單體運行單個高度定制化的管道相比,為眾多小型的、獨立運行的、基于不同技術棧的服務提供運營支持存在很大的差別。將監控從功能調用指標升級為網絡指標和契約接口。推動實現自動化程度更高、更可靠的 CI/CD 管道,并使其可以在服務之間共享。使用容器化技術支持各種語言和技術棧。創建工作流模板以實現重用。例如,在 GitHub,我們創建了一個自助服務運行時平臺,可以用于微服務的打包交付。其目的是大幅減輕每個團隊創建微服務時的運營負擔。它提供了現成的 Kubernetes 模板,可自由使用的 Ingress 負載均衡設置。它可以將日志自動提取到 Splunk,并集成了我們內部的部署流程。這樣,任何團隊想要試驗或上線一個新的微服務都會更容易。

10、小處著手,考慮產品 / 業務價值

到目前為止,我們主要討論的還是結構性變化,以及從單體成功過渡到微服務架構所需要的基礎工作。此后,任何新特性都應該創建成單體外的一個微服務。下一步,找一些簡單的小特性從單體中遷移出來,例如,那些沒有復雜依賴和共享邏輯的特性。在 GitHub,我們是從 webhook 推送和語法高亮開始的。我們希望在遷移更多更大的單體功能之前,找出常見的模式和兩種架構之間的差別。我們是根據產品和業務價值來確定微服務的大小。我們通過查找經常一起更改和部署的代碼和數據,來確定耦合度較高的特性或功能,并以此為基礎,自然地劃分成可以獨立于其他部分單獨迭代和部署的分組。此外,專注于產品和業務價值,還有助于組織內跨工程團隊、產品和設計開展緊密合作。請注意,拆分得太小往往會增加不必要的復雜度和開銷。例如,需要維護單獨的部署密鑰,更多的服務臺職責,以及由于缺少知識共享而導致的單點故障。

11、實現異步性和彈性代碼

從單體轉向微服務是重大的模式轉變。在這個過程中,不管是軟件開發流程,還是實際的代碼庫,都會發生很大的變化。在最后一部分內容中,我們將快速了解下服務之間的通信以及失敗機制(designing for failure),這兩個都是微服務開發中非常重要的概念。服務之間的通信方式有兩種:同步和異步。使用同步通信,客戶端在發送請求后會等待服務器的響應。使用異步通信, 客戶端在發送請求后不會等待響應,每條消息都可以由多個接收者處理。在 GitHub,我們使用 Twirp 實現單體與單體外部核心服務(如授權)之間的同步通信。然而,隨著越來越多的服務移到單體之外,同步通信開始變得非常低效。而且,那還導致了服務之間的緊耦合,背離了遷移到微服務架構的初衷。更好的做法是創建一個共享的事件管道,協調多個生產者和消費者之間的消息。在 SendGrid,我們使用的就是這種架構。由于服務不再是運行在一臺服務器上,所以考慮網絡通信中的延遲和故障非常重要。對于大部分暫時的網絡問題,使用一種簡單的重試機制,定義好重試頻率和最大重試次數,就足夠了。可以考慮使用指數退避讓重試邏輯變得更加智能。例如,隨著重試次數的增加延長等待時間,而不是間隔同樣的時間,從而緩解那些因為過載而無法響應的服務器的壓力。作為一種自我保護和自愈機制,還可以在服務之間增加斷路器。例如,在多次嘗試失敗之后,斷路器會打開,在服務恢復之前,不再允許額外的請求進入。為服務設置超時時間,這樣服務就不會一直等待外部服務的響應。設法實現優雅的失敗,可以向用戶展示友好的提示信息,或者恢復到緩存中上一個已知的良好狀態。關注用戶體驗,做對企業有益的事。

12、小結

本文前 4 部分主要介紹了在開啟從單體到微服務的旅程之前應該了解的基礎內容。關注遷移原因。考慮模塊化和數據拆分。從核心服務和共享資源入手,做必要的運營調整。做好這些準備,整個組織的微服務轉型之旅就會更加令人愉快。接下來,我們討論了從哪里入手,以及如何將微服務與產品和業務價值聯系起來。最后,我們介紹了微服務的兩個關鍵概念:服務之間的通信和構建彈性系統。

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GitHub
    +關注

    關注

    3

    文章

    478

    瀏覽量

    17251

原文標題:“逃離”單體,GitHub的微服務架構實踐

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    微服務架構和CQRS架構基本概念介紹

    微服務架構現在很熱,到處可以看到各大互聯網公司的微服務實踐的分享總結。但是,我今天的分享和微服務沒有關系,希望可以帶給大家一些新的東西。如果一定要說
    發表于 05-22 09:03

    微服務與容器技術實踐

    基于微服務架構的技術實踐(點擊下載演講PPT) 普元信息主任架構師顧偉在演講中,分享了他們對微服務架構
    發表于 10-10 10:23 ?1次下載
    <b class='flag-5'>微服務</b>與容器技術<b class='flag-5'>實踐</b>

    微服務架構實踐摘要

    本文主要類容是對微服務架構實踐摘要解析。微服務架構中的 “微” 體現了其核心要素,即服務的微型
    的頭像 發表于 02-07 16:57 ?6260次閱讀
    <b class='flag-5'>微服務</b><b class='flag-5'>架構</b>與<b class='flag-5'>實踐</b>摘要

    微服務優勢_微服務架構的好處與不足

    ,我們需要根據項目業務和團隊情況來選擇合適的架構。 構建復雜的應用真的是非常困難。單體式的架構更適合輕量級的簡單應用。如果你用它來開發復雜應用,那真的會很糟糕。微服務
    發表于 02-23 11:24 ?4470次閱讀

    微服務架構實踐基礎篇

    微服務架構中,應用程序由多個服務組成,每個服務都是高度自治的獨立業務實體,可以運行在獨立的進程中,不同的服務能非常容易地部署到不同的主機上
    的頭像 發表于 04-10 14:23 ?4361次閱讀
    <b class='flag-5'>微服務</b><b class='flag-5'>架構</b>與<b class='flag-5'>實踐</b>基礎篇

    什么是微服務和容器?微服務和容器的作用是什么

    微服務是將應用程序拆分為多個服務的一種架構類型,這些服務具備構成整個應用程序的細粒度功能。每個微服務將具備針對您的應用程序的不同邏輯功能。與
    的頭像 發表于 01-13 10:54 ?3.3w次閱讀
    什么是<b class='flag-5'>微服務</b>和容器?<b class='flag-5'>微服務</b>和容器的作用是什么

    什么是微服務架構_微服務架構的優缺點及應用

    什么是微服務架構 簡單地說,微服務是系統架構上的一種設計風格, 它的主旨是將一個原本獨立的系統拆分成多個小型服務,這些小型
    的頭像 發表于 06-02 10:03 ?1.8w次閱讀
    什么是<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>_<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>的優缺點及應用

    微服務架構有哪些_微服務架構設計模式

    小伙伴們知道常用的微服務架構框架有哪些嗎?上回我們介紹了一些常用的微服務架構設計模式,這次我們就來了解一下一些常用的微服務
    的頭像 發表于 05-17 17:06 ?2.9w次閱讀
    <b class='flag-5'>微服務</b><b class='flag-5'>架構</b>有哪些_<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>設計模式

    微服務架構的特點_微服務架構適用場景

     微服務架構是一項在云中部署應用和服務的新技術。
    的頭像 發表于 05-17 17:28 ?5340次閱讀

    微服務軟件架構應用研究綜述

    自2014年,微服務架構概念經Martin Flower提出以來,受到廣泛關注,為更好了解微服務架構風格,本文首先分析、梳理了軟件架構的發展
    發表于 05-26 09:26 ?2次下載

    什么是微服務架構

    在Medium,我們的技術堆棧始于2012年的單片Node.js應用程序。我們已經構建了幾個衛星服務,但我們還沒有制定一個系統地采用微服務架構的策略。隨著系統變得越來越復雜并且團隊不斷發展,我們在2018年初轉向了
    的頭像 發表于 02-24 11:15 ?1479次閱讀
    什么是<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>?

    從分層架構微服務架構介紹(五)

    本文要介紹的是 服務架構 (Service-Based Architecture, SBA )。 SBA 可以看成是單體架構微服務
    的頭像 發表于 05-10 17:02 ?1003次閱讀
    從分層<b class='flag-5'>架構</b>到<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>介紹(五)

    springcloud微服務架構

    Spring Cloud是一個開源的微服務架構框架,它提供了一系列工具和組件,用于構建和管理分布式系統中的微服務。它基于Spring框架,旨在通過簡化開發過程和降低系統復雜性來幫助開發人員構建彈性
    的頭像 發表于 11-23 09:24 ?1742次閱讀

    docker微服務架構實戰

    的容器化技術,為微服務架構的實施提供了強大的支持。本文將介紹Docker微服務架構的實戰經驗,包括Docker的概述、微服務
    的頭像 發表于 11-23 09:26 ?759次閱讀

    設計微服務架構的原則

    微服務是一種軟件架構策略,有利于改善整體性能和可擴展性。你可能會想,我的團隊需不需要采用微服務,設計微服務架構有哪些原則?本文會給你一些靈感
    的頭像 發表于 11-26 08:05 ?745次閱讀
    設計<b class='flag-5'>微服務</b><b class='flag-5'>架構</b>的原則
    主站蜘蛛池模板: 在线看片一区 | 四虎4hu影库免费永久国产 | 免费公开视频人人人人人人人 | 黄色录像大全 | www国产永久免费视频看看 | 日韩欧美中文在线 | 天天躁夜夜躁 | 日本精品卡一卡2卡3卡四卡三卡 | 中文字幕在线观看第一页 | 最新版天堂资源官网 | 白丝丝袜高跟国产在线视频 | 免费国产99久久久香蕉 | 国产伦子系列视频6 | 午夜精品久久久久久91 | 欧美午夜寂寞影院安卓列表 | 国产毛片一区二区三区精品 | 成年人黄色片视频 | a资源在线观看 | 国产主播一区二区 | 国产女人水多白浆 | 永久免费人成网ww555kkk手机 | 经典三级四虎在线观看 | 免费国产成人午夜私人影视 | 福利毛片 | 色噜噜狠狠成人网 | 中文一区二区 | 超级毛片| 三级不卡 | 国产精品麻豆va在线播放 | 可以免费观看的一级毛片 | 国产美女久久久久 | 激情五月婷婷综合 | 国产黄网站 | 91精品日本久久久久久牛牛 | 国产网红精品 | 四虎影院在线免费观看 | 国产成人精品亚洲日本在线 | 黄色毛片免费网站 | 女人被狂躁视频网站免费 | 日日做夜夜爽夜夜爽 | 久久手机免费视频 |