偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

解讀 | TARS開源項目發(fā)布Go語言版本

開源 后端
近日,Tars 開源項目在上海發(fā)布并開源了 Go 語言版本,其性能與 C++ 版本相當(dāng),比 gRPC 的性能高 5 倍。

 Tars 是騰訊開源的一款微服務(wù)框架,它于去年 4 月份開源,并于今年 6 月捐贈給了 Linux 基金會。Tars 為用戶提供了涉及到開發(fā)和運(yùn)維的一整套解決方案,幫助一個產(chǎn)品或者服務(wù)快速開發(fā)、發(fā)布、部署、上線和維護(hù)。它集可擴(kuò)展協(xié)議編解碼、高性能 RPC 通信框架、名字路由與發(fā)現(xiàn)、發(fā)布監(jiān)控、日志統(tǒng)計、配置管理等于一體,通過它可以快速用微服務(wù)的方式構(gòu)建穩(wěn)定可靠的分布式應(yīng)用,并實現(xiàn)完整有效的服務(wù)治理。經(jīng)過一年多的發(fā)展,目前 Tars 已經(jīng)被許多企業(yè)使用,如閱文集團(tuán)、虎牙直播、科大訊飛,優(yōu)品財富、龍圖游戲和金太陽教育等。

據(jù)悉,9 月 15 日,騰訊宣布正式開源 Tars 的 Golang 版本 Tars-Go。編者從 Tars 的開源公告中了解到 Tars 與當(dāng)前市面上其它微服務(wù)框架的差異、技術(shù)架構(gòu)、性能數(shù)據(jù)與相關(guān)技術(shù)細(xì)節(jié),本文將詳細(xì)介紹 Tars 此次釋出的 Golang 版本。

項目地址: https://github.com/TarsCloud/TarsGo 

支持服務(wù)治理、多語言,只 Tars 一家 

微服務(wù)架構(gòu)這兩年變得格外火熱,它已經(jīng)成為當(dāng)前最主流的架構(gòu)模式。提起微服務(wù)框架,我們可以自然地舉出 Dubbo、gRPC 與 Spring Cloud 等眾多的知名項目,依據(jù)是否支持服務(wù)治理是否支持多語言兩個維度可將這些微服務(wù)框架分為以下四類:

 

  • 只有服務(wù)調(diào)用沒有服務(wù)治理類的框架。典型的代表有 gRPC、Thrift 等,他們很好地解決了服務(wù)間通信的問題,大部分也支持多語言,但使用這類框架時需要自己去解決服務(wù)治理問題。

  • 帶服務(wù)治理但支持單一語言的框架。典型的代表有 Spring Cloud 和 Dubbo,它們都是用 Java 實現(xiàn)的框架,用戶整合多個開源項目一起并能滿足服務(wù)治理等的需求。

  • Service Mesh。它支持服務(wù)治理,并通過 Sidecar 模式解決框架對多語言支持,業(yè)務(wù)需要再封裝一套通訊組件去解決通訊問題,以及異步調(diào)用等問題,同時會增加架構(gòu)和維護(hù)的復(fù)雜度。

  • 帶服務(wù)治理并支持多語言的框架。目前業(yè)界比較少,除了 Tars 目前還沒有發(fā)現(xiàn)其它具有代表性的框架。

從上面的分析大概可以發(fā)現(xiàn),Tars 是支持服務(wù)治理的同時又提供多語言支持的微服務(wù)框架,這是 Tars 的獨特之處,也是其優(yōu)勢。 

Tars 可以運(yùn)行在物理機(jī)、虛擬機(jī)和容器,其協(xié)議主打的是基于 IDL 實現(xiàn)的 Tars 協(xié)議,它是一種二進(jìn)制解析協(xié)議,與 pb 類似,同時 Tars 還擴(kuò)展支持其它協(xié)議,乃至用戶自定義。 

調(diào)用方式主要以 RPC 為主,支持同步、異步和單向調(diào)用幾種方式。在服務(wù)治理方面除了支持服務(wù)注冊、發(fā)現(xiàn)等業(yè)界常說的能力之外,還提供面對海量訪問的一些其它治理能力,如 Set 模型、自動區(qū)域感知、過載保護(hù)等,語言上除了此次新支持的 Golang,目前已經(jīng)支持了 C++、Java、NodeJS 與 PHP,同時整體框架可以和 DevOps 很好地協(xié)同工作。

Tars 整體分為三個部分:Registry、服務(wù)節(jié)點和基礎(chǔ)服務(wù)集群。

Registry

Registry 是微服務(wù)集群的管理和控制節(jié)點,提供服務(wù)注冊和發(fā)現(xiàn)等功能。

服務(wù)節(jié)點

服務(wù)節(jié)點是 Tars 運(yùn)行的原子單元,可以是一個容器也可以是一個虛機(jī)或物理機(jī),一個業(yè)務(wù)服務(wù)通過部署多個服務(wù)節(jié)點來解決容量和容錯問題。服務(wù)節(jié)點上包括一個 node 管理服務(wù)和一個或多個業(yè)務(wù)服務(wù),node 服務(wù)對本節(jié)點的服務(wù)進(jìn)行統(tǒng)一管理,提供啟停、監(jiān)控服務(wù)節(jié)點等功能,同時接收業(yè)務(wù)服務(wù)節(jié)點上報過來的心跳,上報給 Registry 作為服務(wù)發(fā)現(xiàn)的數(shù)據(jù)來源。

基礎(chǔ)服務(wù)集群

基礎(chǔ)服務(wù)集群是為解決微服務(wù)治理而設(shè)計的一系列服務(wù),服務(wù)節(jié)點數(shù)量不定,為了自身的容錯容災(zāi),一般也要求在多個服務(wù)器上進(jìn)行部署,具體的節(jié)點數(shù)量與業(yè)務(wù)規(guī)模有關(guān),比如,如果業(yè)務(wù)規(guī)模大需要打較多的日志,就需要部署更多的日志服務(wù)節(jié)點?;A(chǔ)服務(wù)主要包括監(jiān)控統(tǒng)計、配置中心、日志聚合、認(rèn)證鑒權(quán)和分布式調(diào)用鏈等。Tars 具有非常完善的服務(wù)治理能力。 

Tars 通過 Registry、服務(wù)節(jié)點和基礎(chǔ)服務(wù)集群協(xié)同工作,透明完成服務(wù)發(fā)現(xiàn)/注冊、負(fù)載均衡、鑒權(quán)、分布式跟蹤等服務(wù)治理相關(guān)工作。如框架通過 Registry 來注冊 xxxsvr,Client 通過訪問 Registry 獲取到被調(diào)服務(wù)的地址信息列表,Client 再根據(jù)需要選擇合適的負(fù)載均衡方式來調(diào)用服務(wù)。負(fù)載均衡支持輪詢、hash、權(quán)重等多種方式。

為了更及時地屏蔽故障節(jié)點,Client 根據(jù)調(diào)用被調(diào)服務(wù)的異常情況判斷是否有故障來更快地進(jìn)行故障屏蔽。具體策略是,當(dāng) Client 調(diào)用某個服務(wù)器出現(xiàn)調(diào)用連續(xù)超時超過設(shè)置閾值,或者調(diào)用的超時比率超過一定百分比閾值,Client 就會對此服務(wù)器節(jié)點進(jìn)行屏蔽,讓流量分發(fā)到正常的節(jié)點上去。對屏蔽的服務(wù)器節(jié)點,每隔一定時間進(jìn)行重連,如果正常,則進(jìn)行正常的流量分發(fā)。 

隨著業(yè)務(wù)增長,服務(wù)的部署難免會跨機(jī)房或者地域,常規(guī)的負(fù)載均衡方式面對跨地區(qū)或者跨機(jī)房部署的服務(wù)會因為網(wǎng)絡(luò)原因造成延時增大,為了加快服務(wù)間的訪問速度,減少因建設(shè)跨地區(qū)、跨機(jī)房調(diào)用帶來的網(wǎng)絡(luò)資源消耗,減少網(wǎng)絡(luò)故障帶來的影響,Tars 提供自動區(qū)域感知的服務(wù)治理功能。 

通過 Registry 和開發(fā)框架配合實現(xiàn)自動區(qū)域感知,這樣的優(yōu)勢有:

  • 運(yùn)維簡單

  • 降低延時減少帶寬消耗

  • 更強(qiáng)的容災(zāi)能力

此外 Tars 還提供 Set 模型。

Set 模型是根據(jù)業(yè)務(wù)功能特征對部署進(jìn)行規(guī)范化和標(biāo)準(zhǔn)化,以 Set 為單元進(jìn)行部署。Set 模型的優(yōu)點有:

  • 有效防止故障擴(kuò)散

  • 方便進(jìn)行容量管理 

對于流量控制,服務(wù)發(fā)布上線主要面對的問題是“如何做對業(yè)務(wù)無損的服務(wù)變更”與“如何做灰度驗證”,在 Tars 中,可通過 Registry 和開發(fā)框架配合實現(xiàn)按需進(jìn)行流量控制,達(dá)到無損發(fā)布和灰度流量的目的。

語言支持方面,除了此前已經(jīng)支持的 PHP、C++、NodeJS 與 Java,此次還加入了 Golang 支持。 

此外,Tars 還提供一個 OSS 平臺,可使運(yùn)營可視化、Web 化。

它主要包含以下特點:

  • 業(yè)務(wù)管理:包括已部署的服務(wù),以及服務(wù)管理、發(fā)布管理、服務(wù)配置、服務(wù)監(jiān)控、特性監(jiān)控等

  • 運(yùn)維管理:包括服務(wù)部署、擴(kuò)容、模版管理等

  • 提供 Open API ,可定制自己的 OSS 系統(tǒng) 

Tars-Go,Tars Go!

多語言支持是 Tars 的一大優(yōu)勢,在此之前 Tars 已經(jīng)推出了 C++、Java、PHP、NodeJS 版本。Go 語言的協(xié)程并發(fā)機(jī)制使它非常適用于大規(guī)模高并發(fā)后端服務(wù)器程序開發(fā),同時隨著容器化技術(shù)的飛速發(fā)展,諸如 Docker、Kubernetes 與 Etcd 等項目興起,使得 Go 語言越來越流行,并成為云原生的首選語言。Tars 的 Go 語言版本也因此應(yīng)運(yùn)而生,此次 Tars-Go 的推出,在大環(huán)境整體逐漸走向云原生的當(dāng)下,意義非凡。

此次新推出的 Go 版本 Tars-Go 整體架構(gòu)主要可以分為三個部分,如下圖所示:

  • 左邊是 tars2go 工具,tars2go 基于巴科斯范式(BNF),這是一種描述程序語言結(jié)構(gòu)的形式化方法,用來對 Tars 文件進(jìn)行語法和詞法分析,生成相應(yīng)的代碼,供客戶端和服務(wù)端使用。同時它提供 Tars 協(xié)議二進(jìn)制流的編解碼功能,將二進(jìn)制包轉(zhuǎn)成相應(yīng)的 Go 數(shù)據(jù)結(jié)構(gòu)。

  • 右邊部分是 package tars,它包含了 Client 和 Server 兩部分的功能:

    • Client 由 Servantproxy、Communicator、ObjProxy、adapterproxy 等邏輯結(jié)構(gòu)組成,這些邏輯結(jié)構(gòu)用來管理 servant,obj 對應(yīng)到的服務(wù)端節(jié)點的 ip 端口,和 C++ 的邏輯保持一致。底層使用 net.Conn 來建立具體的連接,并用 SendQueue chan 來控制并發(fā)數(shù)量。Client 還包含一些 Goroutine,用來做特性監(jiān)控和 stat 監(jiān)控上報。

    • Server 使用 package net 的 listener 來管理 TCP 和 UDP 連接,使用多個 Goroutine 進(jìn)行 accept,并將 accept 之后的 net.Conn 經(jīng)過 SendQueue chan 交給后端的 Handler 進(jìn)行處理。Handler 由一堆 woker Goroutine 組成,每個 Goroutine 基于 net.Conn 進(jìn)行收發(fā)包、Tars 協(xié)議解碼,并經(jīng)過 dispatcher(由 tars2go 生成) 來調(diào)用用戶的代碼實現(xiàn),然后將結(jié)果編碼成二進(jìn)制流返回給 Client。Server 也包含一些 Goroutine 實現(xiàn)遠(yuǎn)程日志異步上報等功能,防止同步調(diào)用阻塞請求。

編者了解到,Tars 開源團(tuán)隊在研發(fā) Tars-Go 的過程中經(jīng)歷的對其各個方面的性能調(diào)優(yōu)改造,Tars-Go 在早先的版本注重于功能的開發(fā)和完善,沒有體系化地進(jìn)行壓測和性能分析。在業(yè)務(wù)使用一段時間后,開始注重性能優(yōu)化。Tars 開源團(tuán)隊對 tars2go 工具先進(jìn)行了一輪優(yōu)化,在生成語樹的時候生成好了類型信息,避免使用反射進(jìn)行類型判斷,編解碼的效率提升了 2 倍,然后對再對整體 servant 進(jìn)行了一輪輪壓測,并進(jìn)行 CPU profile 性能分析。

下面是性能提升優(yōu)化的幾個實例: 

Timer 性能問題

每個請求進(jìn)來,Tars-Go 會創(chuàng)建一個協(xié)程進(jìn)行處理,因為要處理調(diào)用超時,會創(chuàng)建一個 timer,在結(jié)束的時候會刪掉 timer,當(dāng)并發(fā)量一上來,就會頻繁創(chuàng)建和刪除 timer,占用服務(wù)大量 CPU 時間。

研發(fā)團(tuán)隊在一個 issue 中發(fā)現(xiàn) ,在多 CPU 的場景下,如果存在大量的 timer,性能就會大量損耗,優(yōu)化方式是每個 p 有自己的 timer,這樣可以大幅提升整體并發(fā)性能。于是 Tars-Go 將編譯環(huán)境升級至 1.10.3,從 profile 來看,性能得到了很大的提升,并且基于時間輪詢算法實現(xiàn)了自己的 timer,以精度換取性能和效率。

net 包的 SetDeadline 調(diào)用性能問題

為了設(shè)置網(wǎng)絡(luò)連接的讀寫超時,Tars-Go 使用了 net 包的 SetReadDeadline/SetWriteDeadline 等相關(guān)調(diào)用,但從 profile 發(fā)現(xiàn),當(dāng)并發(fā)非常大的時候,會導(dǎo)致這兩個調(diào)用占用了大量的 CPU 時間。為了繞開這兩個相關(guān)調(diào)用,使用了 Sysfd 進(jìn)行 Socket 讀寫超時的設(shè)置。 

bytes 的 Buffer 帶來的性能問題

從下圖可以看出,有相當(dāng)大的一部分時間耗在了 slice 相關(guān)的操作上,原來在包的編解碼過程中,使用 bytes.Buffer 進(jìn)行臨時存放,當(dāng) bytes.Buffer 底層用的 byte slice 大小不夠的時候,就會分配一定的內(nèi)存空間,頻繁地分配效率很低,所以導(dǎo)致大包情況下性能下降比較明顯。

聯(lián)想到了 Redis 的內(nèi)存模型和 Linux 的 slab 機(jī)制,對于頻繁創(chuàng)建銷毀的對象,采用預(yù)先創(chuàng)建和重復(fù)利用的方式。而 Go 本身提供了一種 sync.Pool 機(jī)制,供臨時對象的復(fù)用,以減少 GC,Tars-Go 在此基礎(chǔ)上,實現(xiàn)了類似 Linux slab 機(jī)制分配的 buffer 管理方案,通過這種方案,性能大幅提高。

其他方面的優(yōu)化

經(jīng)過上面的性能優(yōu)化后,Tars-Go 在小包的并發(fā)表現(xiàn)提升了 5 倍。

  • 壓測機(jī)型:4 核/8線程 CPU  3.3Ghz 主頻  16G 內(nèi)存

  • 壓測邏輯:客戶端帶著一定大小的數(shù)據(jù)給服務(wù)端,服務(wù)端原樣返回給客戶端

  • 服務(wù)端單進(jìn)程,多個客戶端發(fā)起測試

Tars-Go 編程示例 

Tars 協(xié)議是一個二進(jìn)制協(xié)議,它是與語言無關(guān)的IDL語言,由工具自動生成服務(wù)端和客戶端代碼,下邊是一個 Tars 協(xié)議的示例:

具體編程的時候,首先需要定義一個 Tars 文件,如下所示:定義接口 Mult ,a 和 b 為入?yún)?,c 為出參,均為整型。

接著生成接口代碼。使用 tars2go JesseTest.tars 即可自動生成 pacakge Prajna JesseTest 的 servant 和 Mult 方法的框架實現(xiàn),業(yè)務(wù)無需關(guān)心實現(xiàn)細(xì)節(jié):

最后,實現(xiàn)接口代碼,將入?yún)?a、b相乘后的結(jié)果放到 c 返回給客戶端:

之后 go build 就可以進(jìn)行編譯。

而客戶端只需關(guān)注出入?yún)?,引入?Tars 文件轉(zhuǎn)化成的包即可完成一次 RPC 調(diào)用。

未來,Linux 基金會將加強(qiáng) Tars 項目的社區(qū)運(yùn)作機(jī)制,讓 Tars 的影響力從中國走向國際。

  • Tars:https://github.com/TarsCloud

  • Tars-Go:https://github.com/TarsCloud/TarsGo

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2012-03-30 14:15:50

GoogleGo

2022-11-06 23:17:23

Go語言項目

2020-08-05 12:27:18

Go語言碼農(nóng)

2013-05-15 09:27:58

2009-12-28 09:09:34

Google開源項目

2023-11-01 08:08:50

Go語言傳遞請求

2013-09-02 15:26:21

恒拓開源開源項目Koala

2022-03-13 23:51:39

Web項目Go

2023-03-13 00:10:46

Go語言版本

2020-03-13 16:19:42

RPCTARS騰訊開源

2012-03-15 14:25:22

Go

2022-06-08 08:52:04

Tars微服務(wù)開發(fā)C++開發(fā)

2021-12-28 15:10:01

線程池C語言編程語言

2022-04-13 08:20:32

DockerGo項目

2014-03-21 10:45:33

FacebookHack

2021-07-12 06:23:38

抓包gRpcRPC 框架

2013-06-24 15:58:19

Windows 8.1Windows 8.1

2021-04-08 11:10:07

C語言版本Cmake

2024-09-29 15:26:01

2024-01-05 20:46:14

點贊
收藏

51CTO技術(shù)棧公眾號