成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不改一行代碼輕松玩轉(zhuǎn) Go 應(yīng)用微服務(wù)治理

開(kāi)發(fā)
為了更好的進(jìn)行 Go 應(yīng)用微服務(wù)治理,提高研發(fā)效率和系統(tǒng)穩(wěn)定性,本文將介紹 MSE 微服務(wù)治理方案,無(wú)需修改業(yè)務(wù)代碼,即可實(shí)現(xiàn)上述治理能力。

01、Go 應(yīng)用微服務(wù)治理簡(jiǎn)介

Go 語(yǔ)言具有簡(jiǎn)潔、高效、并發(fā)性強(qiáng)等特性,已經(jīng)被廣泛認(rèn)為是構(gòu)建微服務(wù)的理想選擇之一。Go 語(yǔ)言作為構(gòu)建 Kubernetes、Docker 的主要編程語(yǔ)言,目前不僅在云原生基礎(chǔ)組件領(lǐng)域中被廣泛使用,也逐漸被越來(lái)越多的開(kāi)發(fā)者應(yīng)用于各類業(yè)務(wù)場(chǎng)景中,基于微服務(wù)架構(gòu)構(gòu)建業(yè)務(wù)應(yīng)用。

微服務(wù)架構(gòu)通過(guò)模塊化體系結(jié)構(gòu),提高了系統(tǒng)的靈活性、敏捷性和擴(kuò)展性,縮短了團(tuán)隊(duì)開(kāi)發(fā)周期、增加了資源利用效率,這也是越來(lái)越多的公司選擇采用微服務(wù)架構(gòu)的主要原因之一。然而,隨著業(yè)務(wù)不斷發(fā)展與持續(xù)迭代,微服務(wù)帶來(lái)的系統(tǒng)復(fù)雜性也使得運(yùn)維管理難度逐漸增加,從而影響開(kāi)發(fā)效率和系統(tǒng)穩(wěn)定性。

為了保證系統(tǒng)穩(wěn)定性,我們?cè)谙硎芪⒎?wù)帶來(lái)的優(yōu)勢(shì)的同時(shí),也不得不持續(xù)解決微服務(wù)帶來(lái)的問(wèn)題和風(fēng)險(xiǎn)。例如:

  1. 在開(kāi)發(fā)測(cè)試態(tài),敏捷的迭代需要提供與線上完全隔離的環(huán)境用于研發(fā)和調(diào)試、業(yè)務(wù)發(fā)展帶來(lái)的服務(wù)增長(zhǎng)需要有統(tǒng)一的面板來(lái)管理和觀測(cè)。
  2. 在變更態(tài),為了防止新引入的 bug 給業(yè)務(wù)帶來(lái)的損失,需要具備灰度發(fā)布、快速回滾的能力。
  3. 在運(yùn)行態(tài),為了避免不確定流量、不穩(wěn)定調(diào)用和基礎(chǔ)設(shè)施給業(yè)務(wù)帶來(lái)的穩(wěn)定性問(wèn)題,需要具備限流、熔斷、降級(jí)等能力,來(lái)規(guī)避運(yùn)行時(shí)風(fēng)險(xiǎn)。

目前,在 Go 語(yǔ)言生態(tài)中,主流的微服務(wù)框架主要專注于解決如何快速構(gòu)建微服務(wù)應(yīng)用、以及微服務(wù)間通信問(wèn)題,在微服務(wù)治理能力上仍有欠缺;主流的微服務(wù)治理組件,如 Sentinel-Golang、OpenTelemetry 等,雖然較好的解決了流量防護(hù)、應(yīng)用可觀測(cè)等方面的微服務(wù)治理問(wèn)題,但需要開(kāi)發(fā)手動(dòng)在業(yè)務(wù)代碼中通過(guò) SDK 進(jìn)行埋點(diǎn),無(wú)法專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),這無(wú)疑在一定程度上降低了開(kāi)發(fā)效率。

為了更好的進(jìn)行 Go 應(yīng)用微服務(wù)治理,提高研發(fā)效率和系統(tǒng)穩(wěn)定性,本文將介紹 MSE 微服務(wù)治理方案,無(wú)需修改業(yè)務(wù)代碼,即可實(shí)現(xiàn)上述治理能力。

02、原理說(shuō)明

不同于 JAVA,Golang 作為靜態(tài)編譯型語(yǔ)言,它在編譯時(shí)直接將源代碼轉(zhuǎn)換為機(jī)器碼,不依賴于虛擬機(jī),也不具有字節(jié)碼。這種方式雖然無(wú)法屏蔽底層操作系統(tǒng),但是由于可以直接在硬件上運(yùn)行,會(huì)具有更高的性能。

我們通過(guò) Go Build 工具原生提供的 -toolexec 機(jī)制,在編譯期進(jìn)行代碼劫持,對(duì)特定 Go SDK 進(jìn)行埋點(diǎn)注入來(lái)實(shí)現(xiàn)代碼增強(qiáng)(如框架 SDK、Go 內(nèi)置 runtime、net/http 包等),從而使微服務(wù)應(yīng)用具備了治理能力。

圖片

  1. Compile Front:在編譯過(guò)程中,我們通過(guò) dry run 機(jī)制和抽象語(yǔ)法樹(shù)解析每個(gè)待編譯 .go 文件,通過(guò) module + path + receive type name + function name 可以唯一識(shí)別一個(gè)方法,從而能夠判斷出該方法是否需要進(jìn)行代碼增強(qiáng)和埋點(diǎn)注入。
  2. Code Inject:判斷出當(dāng)前方法需要進(jìn)行注入時(shí),會(huì)在對(duì)該文件進(jìn)行編譯之前,通過(guò)修改語(yǔ)法樹(shù),插入預(yù)定義好的代碼,隨后編譯生成 .a 文件。
  3. Compile Backend:編譯器繼續(xù)執(zhí)行原有編譯流程,最終生成二進(jìn)制可執(zhí)行文件,里面包含了服務(wù)治理邏輯。

編譯時(shí)注入框架現(xiàn)已開(kāi)源,歡迎參與社區(qū)討論和貢獻(xiàn),詳情請(qǐng)點(diǎn)擊 opentelemetry-go-auto-instrumentation[1]

03、接入并治理 Go 應(yīng)用

為了更直觀的展示如何進(jìn)行 Go 應(yīng)用的微服務(wù)治理,接下來(lái)我們將通過(guò)一個(gè) Demo,演示 Go 應(yīng)用從接入到使用微服務(wù)治理并生效的全過(guò)程。

3.1 Demo 服務(wù)說(shuō)明

Demo 服務(wù)部署在阿里云 ACK 集群中,調(diào)用順序?yàn)榫W(wǎng)關(guān)->A->B->C。其中網(wǎng)關(guān)采用阿里云 MSE 云原生網(wǎng)關(guān),應(yīng)用間調(diào)用方式為 http、服務(wù)發(fā)現(xiàn)方式采用 K8s 標(biāo)準(zhǔn)的 CoreDNS,應(yīng)用 A、C 各部署了一個(gè)灰度版本,用于某需求迭代發(fā)布過(guò)程中的灰度驗(yàn)證。

Demo 服務(wù)的實(shí)現(xiàn)源代碼請(qǐng)?jiān)斠?jiàn) mse-go-demo/multiframe[2]

應(yīng)用名稱

語(yǔ)言及版本

微服務(wù)框架及版本

Client 調(diào)用方式

服務(wù)發(fā)現(xiàn)方式

A

go 1.20

gin 1.8.1

http

CoreDNS

B

go 1.19

kratos 2.7.1

http

CoreDNS

C

go 1.19

go-zero 1.5.1

/

CoreDNS

圖片


3.2 接入 MSE 服務(wù)治理中心

一個(gè) Go 應(yīng)用接入 MSE 服務(wù)治理中心,只需執(zhí)行以下四步即可,其中步驟 1、2 只需首次接入時(shí)執(zhí)行,后續(xù)無(wú)需再操作。

1. 在 MSE 服務(wù)治理中心中,為 ACK 集群一鍵安裝 ACK-Onepilot 組件

圖片

2. 在 MSE 服務(wù)治理中心中,為 ACK 集群一鍵開(kāi)啟高階治理能力

圖片

3. 下載并使用我們提供的 Instgo 工具編譯 Go 應(yīng)用,來(lái)代替 go build 命令,生成二進(jìn)制可執(zhí)行文件

# 生成當(dāng)前操作系統(tǒng)可執(zhí)行文件
./instgo build --mse --licenseKey="{licenseKey}"


# 交叉編譯,例如在MacOS中生成linux操作系統(tǒng)可執(zhí)行文件
#amd
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./instgo build --mse --licenseKey="{licenseKey}"
#arm
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 ./instgo build --mse --licenseKey="{licenseKey}"

4. 將應(yīng)用打包成鏡像之后,部署到集群之前,在相應(yīng)的 Deployment YAML 文件中 spec.template.metadata.labels 中添加以下標(biāo)簽后,部署應(yīng)用即可完成接入

spec:
  template:
    metadata:
      labels:
        # required 
        msePilotAutoEnable: "on" #標(biāo)識(shí)開(kāi)啟MSE微服務(wù)治理
        mseNamespace: your-namespace #標(biāo)識(shí)應(yīng)用所屬微服務(wù)治理空間
        msePilotCreateAppName: "your-app-name" #標(biāo)識(shí)應(yīng)用名稱
        aliyun.com/app-language: golang #標(biāo)識(shí)為Golang應(yīng)用
        # optional
        alicloud.service.tag: pod-tag #在全鏈路灰度中,用于標(biāo)識(shí)灰度節(jié)點(diǎn),如gray、blue...

可以看到,整個(gè)接入過(guò)程中不會(huì)涉及到業(yè)務(wù)代碼的修改,相比自主魔改框架、手動(dòng)引入 SDK 埋點(diǎn)等方式,更加清爽和簡(jiǎn)潔。

關(guān)于上述各步驟更詳細(xì)的指引和說(shuō)明請(qǐng)?jiān)斠?jiàn) ACK 微服務(wù)應(yīng)用接入 MSE 治理中心(Golang 版)[3]

3.3 使用服務(wù)治理能力

按照 3.2 所述步驟完成應(yīng)用接入后,即可在 MSE 治理中心控制臺(tái)中看到具體的應(yīng)用及服務(wù)信息,并且進(jìn)行相應(yīng)的服務(wù)治理規(guī)則配置。本節(jié)將從應(yīng)用觀測(cè)與管理、流量治理、全鏈路灰度三個(gè)常見(jiàn)治理場(chǎng)景,演示操作過(guò)程與實(shí)際效果。

3.3.1 應(yīng)用觀測(cè)與管理

將 3.1 中所述 Demo 的 A、B、C 三個(gè) Go 應(yīng)用接入到 MSE 治理中心,并設(shè)置:

  • mseNamespace=mse-go-agent-demo
  • 應(yīng)用 A 的 msePilotCreateAppName=go-gin-demo-a
  • 應(yīng)用 B 的 msePilotCreateAppName=go-kratos-demo-b
  • 應(yīng)用 C 的 msePilotCreateAppName=go-zero-demo-c

接入完成后,可以在 MSE 治理中心 mse-go-agent-demo namespace 下看到對(duì)應(yīng)的應(yīng)用詳情。

3.3.1.1 服務(wù)信息查看

進(jìn)入 MSE 服務(wù)治理中心,點(diǎn)擊服務(wù)查詢,可以查看服務(wù)信息,包括應(yīng)用內(nèi)創(chuàng)建的 http 或 rpc 服務(wù),以及對(duì)應(yīng)服務(wù)的元信息,如接口元信息、服務(wù)元信息等。

在左上角分別選擇 Gin、Kratos 和 Go-zero 框架,可以分別看到 A、B、C 應(yīng)用的服務(wù)信息。由于我們?cè)诰幋a實(shí)現(xiàn)時(shí),分別為應(yīng)用 B 和 C 各創(chuàng)建了一個(gè) Http Server、一個(gè) Grpc Server,用于接收不同類型的請(qǐng)求,因此可以在控制臺(tái)中看到兩個(gè)服務(wù)。

圖片

圖片

圖片

點(diǎn)擊相應(yīng)的服務(wù),能夠看到服務(wù)的詳細(xì)元信息,以應(yīng)用 B 為例,以下為 B 應(yīng)用的 Http 服務(wù)和 Grpc 服務(wù)信息。

圖片

圖片

3.3.1.2 應(yīng)用信息查看

進(jìn)入 MSE 服務(wù)治理中心,點(diǎn)擊應(yīng)用治理,能夠從應(yīng)用、接口、節(jié)點(diǎn)等不同維度查看應(yīng)用的運(yùn)行數(shù)據(jù)以及系統(tǒng)數(shù)據(jù)。

在應(yīng)用列表處,可以看到不同應(yīng)用的節(jié)點(diǎn)數(shù)、標(biāo)簽數(shù)、請(qǐng)求數(shù)、QPS 等數(shù)據(jù)。

圖片

點(diǎn)擊對(duì)應(yīng)應(yīng)用卡片,即可從不同維度查看應(yīng)用更詳細(xì)的信息,包括應(yīng)用整體數(shù)據(jù)、接口數(shù)據(jù)、節(jié)點(diǎn)數(shù)據(jù)等。

1)應(yīng)用概覽數(shù)據(jù)

圖片

2)接口數(shù)據(jù)

圖片

3)節(jié)點(diǎn)數(shù)據(jù)

圖片

3.3.2 流量治理

目前,我們提供了以下流量治理能力,支持用戶自主配置并應(yīng)對(duì)不同的場(chǎng)景,同時(shí)支持通過(guò)控制臺(tái)配置規(guī)則快速啟停:

  • 接口流控:設(shè)置單接口最大 QPS,超過(guò)閾值的請(qǐng)求將會(huì)被拒絕或進(jìn)入等待隊(duì)列。
  • 并發(fā)隔離:設(shè)置單接口的最大并發(fā)協(xié)程數(shù),超過(guò)閾值的請(qǐng)求將會(huì)被拒絕。
  • 熔斷:設(shè)置接口的熔斷防護(hù)規(guī)則,閾值可以設(shè)置為慢調(diào)用比例或者失敗率,達(dá)到閾值后會(huì)觸發(fā)熔斷,在熔斷時(shí)長(zhǎng)內(nèi),該接口的請(qǐng)求都會(huì)快速失敗,熔斷狀態(tài)結(jié)束后通過(guò)單次探測(cè)或漸進(jìn)式策略恢復(fù)。
  • 熱點(diǎn)參數(shù)防護(hù):相比接口流控,防護(hù)的規(guī)則精細(xì)到參數(shù)級(jí)別,例如可以設(shè)置某接口第 N 個(gè)參數(shù)占用最大并發(fā)資源數(shù)不超過(guò) 10,如果超過(guò)閾值則對(duì)應(yīng)的請(qǐng)求會(huì)快速失敗。
  • 行為降級(jí):觸發(fā)接口流控后,可以自定義防護(hù)行為,例如返回指定狀態(tài)碼和內(nèi)容、重定向等。
  • 自適應(yīng)過(guò)載保護(hù):以 CPU 使用率作為衡量實(shí)例負(fù)載的依據(jù),自適應(yīng)地調(diào)整對(duì)入口流量的防護(hù)策略,避免因 CPU 資源打滿導(dǎo)致服務(wù)崩潰。
3.3.2.1 規(guī)則配置

以應(yīng)用 A 為例,假設(shè)我們希望為接口 /greet1a 設(shè)置單機(jī) QPS 閾值為 1 的接口流控規(guī)則,如果達(dá)到閾值之后立即失敗,并且返回 429 作為 Http 狀態(tài)碼,返回內(nèi)容為"Too Many Request! The Server A will not process!"。

為了達(dá)到以上效果,可以直接在 MSE 治理中心配置如下:

1. 點(diǎn)擊應(yīng)用治理,點(diǎn)擊 go-gin-demo-a 應(yīng)用卡片,點(diǎn)擊流量治理

圖片

2. 點(diǎn)擊流量防護(hù)-行為管理,點(diǎn)擊新增行為,按下圖所示配置行為后,點(diǎn)擊新建

圖片

3. 點(diǎn)擊流量防護(hù)-接口流控,按下圖所示步驟配置流控防護(hù)規(guī)則,然后點(diǎn)擊新增

圖片

圖片

圖片

4. 在規(guī)則列表處,點(diǎn)擊規(guī)則狀態(tài)置為開(kāi)啟后,規(guī)則即生效

圖片

3.3.2.2 結(jié)果觀測(cè)

持續(xù)一段時(shí)間后,可以看到應(yīng)用 A 單節(jié)點(diǎn)通過(guò)的 QPS 穩(wěn)定在 1,超過(guò)閾值的請(qǐng)求已經(jīng)被拒絕;應(yīng)用 B 的 QPS 穩(wěn)定為 2,這是因?yàn)閼?yīng)用 A 一共有 2 個(gè)節(jié)點(diǎn),最多允許通過(guò)的 QPS 為 2。

1)應(yīng)用 A 單節(jié)點(diǎn) QPS 數(shù)據(jù)

圖片

2)應(yīng)用 B 整體 QPS 數(shù)據(jù)

圖片

使用云原生網(wǎng)關(guān)對(duì)應(yīng)用 A/greet1a 發(fā)起調(diào)用,可以觀察到由于觸發(fā)了流控,接口返回了我們剛剛定義的錯(cuò)誤狀態(tài)碼和內(nèi)容。

圖片

3.3.3 全鏈路灰度

3.3.3.1 規(guī)則配置

假設(shè)在某次需求迭代中,我們變更了應(yīng)用 A 和應(yīng)用 C 的部分邏輯,并且希望通過(guò)灰度發(fā)布的方式測(cè)試并驗(yàn)證功能的正確性,希望 Header 內(nèi)容中 x-user-uuid=123456789 的請(qǐng)求路由到灰度節(jié)點(diǎn),其他請(qǐng)求仍然路由到常規(guī)節(jié)點(diǎn)。

為了達(dá)到以上效果,我們可以按照以下步驟進(jìn)行操作和配置:

  1. 為應(yīng)用 A 和應(yīng)用 C 部署灰度節(jié)點(diǎn),通過(guò)在 YAML 文件中 spec.template.metatada.labels 增加 alicloud.servicetag=gray 標(biāo)識(shí)節(jié)點(diǎn)類型。
  2. 進(jìn)入 MSE 治理中心,點(diǎn)擊全鏈路灰度,創(chuàng)建泳道組,泳道組主要用于業(yè)務(wù)模塊隔離,例如,同部門下業(yè)務(wù)小組 A 可以創(chuàng)建并使用泳道組 a,業(yè)務(wù)小組 B 可以創(chuàng)建并使用泳道組 b,兩者相互隔離,互不干擾。
  3. 在泳道組內(nèi)創(chuàng)建標(biāo)簽為 gray 的灰度泳道,如下圖所示填寫(xiě)泳道信息、配置基線路由和灰度規(guī)則。

圖片

圖片

圖片

泳道組及泳道創(chuàng)建完成后,全鏈路灰度的配置就已經(jīng)完成,如下圖所示,泳道組的流量入口為 MSE 云原生網(wǎng)關(guān),接下來(lái)我們通過(guò)對(duì)應(yīng)的網(wǎng)關(guān)發(fā)起請(qǐng)求,Demo 應(yīng)用中的業(yè)務(wù)返回結(jié)果打印了請(qǐng)求的調(diào)用鏈以及每一跳所路由到的節(jié)點(diǎn)標(biāo)簽和 IP,用于方便觀察調(diào)用鏈路。

圖片

3.3.3.2 結(jié)果觀測(cè)

1)設(shè)置請(qǐng)求 Header 中無(wú) x-user-uuid,請(qǐng)求均路由到基線節(jié)點(diǎn)

圖片

2)設(shè)置請(qǐng)求 Header x-user-uuid=1,請(qǐng)求均路由到基線節(jié)點(diǎn)

圖片

3)設(shè)置請(qǐng)求 Header x-user-uuid=123456789,請(qǐng)求路由到 A、C 的灰度節(jié)點(diǎn),由于應(yīng)用 B 不存在灰度節(jié)點(diǎn),因此路由到基線節(jié)點(diǎn)

圖片

由此,我們驗(yàn)證了全鏈路灰度規(guī)則配置已經(jīng)生效。

本文鏈接:

[1] opentelemetry-go-auto-instrumentation

https://github.com/alibaba/opentelemetry-go-auto-instrumentation

[2] mse-go-demo/multiframe

https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-go-demo/multiframe

[3] ACK 微服務(wù)應(yīng)用接入 MSE 治理中心(Golang 版)

https://help.aliyun.com/zh/mse/getting-started/ack-microservice-application-access-mse-governance-center-golang-version

相關(guān)鏈接:

[1] Go 應(yīng)用治理接入指引

https://help.aliyun.com/zh/mse/getting-started/ack-microservice-application-access-mse-governance-center-golang-version

[2] Go 應(yīng)用治理兼容性要求與功能說(shuō)明

https://help.aliyun.com/zh/mse/product-overview/golang-application-governance-compatibility-requirements-and-function-description

[3] 15 分鐘快速體驗(yàn) Go 應(yīng)用服務(wù)治理

https://help.aliyun.com/zh/mse/getting-started/15-minutes-to-complete-the-rapid-experience-of-service-governance-capabilities-golang-version

責(zé)任編輯:龐桂玉 來(lái)源: 阿里云云原生
相關(guān)推薦

2022-11-09 09:15:31

ProtoBufGo語(yǔ)言

2022-04-14 07:57:52

Python代碼熱力圖

2022-08-25 06:42:00

飛書(shū)GCD 隊(duì)列啟動(dòng)優(yōu)化

2016-12-02 08:53:18

Python一行代碼

2018-01-02 09:26:28

Ubuntuzzupdate版本升級(jí)

2015-03-20 14:51:09

Testin云測(cè)

2019-10-26 13:59:35

PythonRFM模型數(shù)據(jù)

2014-02-12 13:43:50

代碼并行任務(wù)

2022-04-09 09:11:33

Python

2017-04-05 11:10:23

Javascript代碼前端

2021-06-09 08:50:39

C語(yǔ)言關(guān)機(jī)代碼復(fù)雜代碼解讀

2024-06-07 14:54:55

2021-12-29 09:34:49

Log4j漏洞代碼

2021-11-11 23:02:16

電腦垃圾軟件

2021-08-31 09:49:37

CPU執(zhí)行語(yǔ)言

2017-04-13 19:20:18

Python代碼并行任務(wù)

2020-08-11 07:40:37

數(shù)組數(shù)據(jù)存儲(chǔ)

2024-12-10 09:15:39

2020-09-29 07:00:00

微服務(wù)API架構(gòu)

2020-08-19 10:30:25

代碼Python多線程
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 嫩草视频免费 | 国产精品99久久久久久大便 | 国产精品免费一区二区三区四区 | 逼逼网| 亚洲一区二区三区免费在线观看 | 午夜精品久久久久久久 | 日韩一区二区在线播放 | 欧美日韩精品一区二区三区四区 | 欧美日韩国产一区二区三区 | 亚洲有码转帖 | 欧美一级艳情片免费观看 | 欧美成人免费在线视频 | 午夜精品久久久久久不卡欧美一级 | 亚洲欧美视频一区 | 久一精品 | 亚洲播放 | 男人天堂视频在线观看 | 黄色香蕉视频在线观看 | 亚洲三级免费看 | 久久久123 | 成人av网页 | 国产精品一区二区免费 | 精品亚洲一区二区三区 | 日韩电影一区 | 99热视 | 免费在线精品视频 | 欧美a区 | 久久国产欧美一区二区三区精品 | 精品国产91乱码一区二区三区 | 亚洲精品国产偷自在线观看 | 国产福利精品一区 | 精品亚洲二区 | 美女久久| 一级毛片中国 | 91精品国产91综合久久蜜臀 | 久久久久久久av | 日本a级大片| 久久国产精品99久久久大便 | 亚洲免费在线 | 九九热在线免费视频 | 国产精品1 |