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

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

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

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

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

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

為了保證系統(tǒng)穩(wěn)定性,我們在享受微服務(wù)帶來的優(yōu)勢的同時(shí),也不得不持續(xù)解決微服務(wù)帶來的問題和風(fēng)險(xiǎn)。例如:

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

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

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

02、原理說明

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

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

圖片

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

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

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

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

3.1 Demo 服務(wù)說明

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ā)布過程中的灰度驗(yàn)證。

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

應(yīng)用名稱

語言及版本

微服務(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ù)無需再操作。

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

圖片

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

圖片

3. 下載并使用我們提供的 Instgo 工具編譯 Go 應(yīng)用,來代替 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)識開啟MSE微服務(wù)治理
        mseNamespace: your-namespace #標(biāo)識應(yīng)用所屬微服務(wù)治理空間
        msePilotCreateAppName: "your-app-name" #標(biāo)識應(yīng)用名稱
        aliyun.com/app-language: golang #標(biāo)識為Golang應(yīng)用
        # optional
        alicloud.service.tag: pod-tag #在全鏈路灰度中,用于標(biāo)識灰度節(jié)點(diǎn),如gray、blue...

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

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

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

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

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

將 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 下看到對應(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ù),以及對應(yīng)服務(wù)的元信息,如接口元信息、服務(wù)元信息等。

在左上角分別選擇 Gin、Kratos 和 Go-zero 框架,可以分別看到 A、B、C 應(yīng)用的服務(wù)信息。由于我們在編碼實(shí)現(xiàn)時(shí),分別為應(yīng)用 B 和 C 各創(chuàng)建了一個(gè) Http Server、一個(gè) Grpc Server,用于接收不同類型的請求,因此可以在控制臺中看到兩個(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ù)、請求數(shù)、QPS 等數(shù)據(jù)。

圖片

點(diǎn)擊對應(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)對不同的場景,同時(shí)支持通過控制臺配置規(guī)則快速啟停:

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

圖片

3.3.2.2 結(jié)果觀測

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

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

圖片

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

圖片

使用云原生網(wǎng)關(guān)對應(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 的部分邏輯,并且希望通過灰度發(fā)布的方式測試并驗(yàn)證功能的正確性,希望 Header 內(nèi)容中 x-user-uuid=123456789 的請求路由到灰度節(jié)點(diǎn),其他請求仍然路由到常規(guī)節(jié)點(diǎn)。

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

  1. 為應(yīng)用 A 和應(yīng)用 C 部署灰度節(jié)點(diǎn),通過在 YAML 文件中 spec.template.metatada.labels 增加 alicloud.servicetag=gray 標(biāo)識節(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 的灰度泳道,如下圖所示填寫泳道信息、配置基線路由和灰度規(guī)則。

圖片

圖片

圖片

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

圖片

3.3.3.2 結(jié)果觀測

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

圖片

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

圖片

3)設(shè)置請求 Header x-user-uuid=123456789,請求路由到 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)用治理兼容性要求與功能說明

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é)任編輯:龐桂玉 來源: 阿里云云原生
相關(guān)推薦

2022-11-09 09:15:31

ProtoBufGo語言

2022-08-25 06:42:00

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

2022-04-14 07:57:52

Python代碼熱力圖

2016-12-02 08:53:18

Python一行代碼

2015-03-20 14:51:09

Testin云測

2018-01-02 09:26:28

Ubuntuzzupdate版本升級

2019-10-26 13:59:35

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

2017-04-05 11:10:23

Javascript代碼前端

2014-02-12 13:43:50

代碼并行任務(wù)

2022-04-09 09:11:33

Python

2021-06-09 08:50:39

C語言關(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í)行語言

2017-04-13 19:20:18

Python代碼并行任務(wù)

2021-11-02 16:25:41

Python代碼技巧

2020-08-19 10:30:25

代碼Python多線程

2020-09-09 16:00:22

Linux進(jìn)程

2023-09-12 10:10:57

開發(fā)者工具開源
點(diǎn)贊
收藏

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