自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

據(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 版本。

項(xiàng)目地址: https://github.com/TarsCloud/TarsGo 

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

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

 

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

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

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

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

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

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

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

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

Registry

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

服務(wù)節(jié)點(diǎn)

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

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

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

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

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

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

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

  • 運(yùn)維簡單

  • 降低延時(shí)減少帶寬消耗

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

此外 Tars 還提供 Set 模型

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

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

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

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

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

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

它主要包含以下特點(diǎn):

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

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

  • 左邊是 tars2go 工具,tars2go 基于巴科斯范式(BNF),這是一種描述程序語言結(jié)構(gòu)的形式化方法,用來對(duì) Tars 文件進(jìn)行語法和詞法分析,生成相應(yīng)的代碼,供客戶端和服務(wù)端使用。同時(shí)它提供 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 對(duì)應(yīng)到的服務(wù)端節(jié)點(diǎn)的 ip 端口,和 C++ 的邏輯保持一致。底層使用 net.Conn 來建立具體的連接,并用 SendQueue chan 來控制并發(fā)數(shù)量。Client 還包含一些 Goroutine,用來做特性監(jiān)控和 stat 監(jiān)控上報(bào)。

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

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

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

Timer 性能問題

每個(gè)請(qǐng)求進(jìn)來,Tars-Go 會(huì)創(chuàng)建一個(gè)協(xié)程進(jìn)行處理,因?yàn)橐幚碚{(diào)用超時(shí),會(huì)創(chuàng)建一個(gè) timer,在結(jié)束的時(shí)候會(huì)刪掉 timer,當(dāng)并發(fā)量一上來,就會(huì)頻繁創(chuàng)建和刪除 timer,占用服務(wù)大量 CPU 時(shí)間。

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

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

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

bytes 的 Buffer 帶來的性能問題

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

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

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

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

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

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

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

Tars-Go 編程示例 

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

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

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

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

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

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

未來,Linux 基金會(huì)將加強(qiáng) Tars 項(xiàng)目的社區(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語言項(xiàng)目

2020-08-05 12:27:18

Go語言碼農(nóng)

2009-12-28 09:09:34

Google開源項(xiàng)目

2013-05-15 09:27:58

2023-11-01 08:08:50

Go語言傳遞請(qǐng)求

2013-09-02 15:26:21

恒拓開源開源項(xiàng)目Koala

2022-03-13 23:51:39

Web項(xiàng)目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項(xiàng)目

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

2013-04-09 12:18:45

socket.ioC服務(wù)器

2014-03-21 10:45:33

FacebookHack

2024-01-05 20:46:14

點(diǎn)贊
收藏

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