不改一行代码轻松玩转 Go 应用微服务治理

作者:赵源筱

Go 应用微服务治理简介

Go 语言具有简洁、高效、并发性强等特性,已经被广泛认为是构建微服务的理想选择之一。Go 语言作为构建 Kubernetes、Docker 的主要编程语言,目前不仅在云原生基础组件领域中被广泛使用,也逐渐被越来越多的开发者应用于各类业务场景中,基于微服务架构构建业务应用。

微服务架构通过模块化体系结构,提高了系统的灵活性、敏捷性和扩展性,缩短了团队开发周期、增加了资源利用效率,这也是越来越多的公司选择采用微服务架构的主要原因之一。然而,随着业务不断发展与持续迭代,微服务带来的系统复杂性也使得运维管理难度逐渐增加,从而影响开发效率和系统稳定性。

为了保证系统稳定性,我们在享受微服务带来的优势的同时,也不得不持续解决微服务带来的问题和风险。例如:

  1. 在开发测试态,敏捷的迭代需要提供与线上完全隔离的环境用于研发和调试、业务发展带来的服务增长需要有统一的面板来管理和观测。
  2. 在变更态,为了防止新引入的 bug 给业务带来的损失,需要具备灰度发布、快速回滚的能力。
  3. 在运行态,为了避免不确定流量、不稳定调用和基础设施给业务带来的稳定性问题,需要具备限流、熔断、降级等能力,来规避运行时风险。

目前,在 Go 语言生态中,主流的微服务框架主要专注于解决如何快速构建微服务应用、以及微服务间通信问题,在微服务治理能力上仍有欠缺;主流的微服务治理组件,如 Sentinel-Golang、OpenTelemetry 等,虽然较好的解决了流量防护、应用可观测等方面的微服务治理问题,但需要开发手动在业务代码中通过 SDK 进行埋点,无法专注于业务逻辑的实现,这无疑在一定程度上降低了开发效率。

为了更好的进行 Go 应用微服务治理,提高研发效率和系统稳定性,本文将介绍 MSE 微服务治理方案,无需修改业务代码,即可实现上述治理能力。

原理说明

不同于 JAVA,Golang 作为静态编译型语言,它在编译时直接将源代码转换为机器码,不依赖于虚拟机,也不具有字节码。这种方式虽然无法屏蔽底层操作系统,但是由于可以直接在硬件上运行,会具有更高的性能。

我们通过 Go Build 工具原生提供的 -toolexec 机制,在编译期进行代码劫持,对特定 Go SDK 进行埋点注入来实现代码增强(如框架 SDK、Go 内置 runtime、net/http 包等),从而使微服务应用具备了治理能力。

  1. Compile Front:在编译过程中,我们通过 dry run 机制和抽象语法树解析每个待编译 .go 文件,通过 module + path + receive type name + function name 可以唯一识别一个方法,从而能够判断出该方法是否需要进行代码增强和埋点注入。
  2. Code Inject:判断出当前方法需要进行注入时,会在对该文件进行编译之前,通过修改语法树,插入预定义好的代码,随后编译生成 .a 文件。
  3. Compile Backend:编译器继续执行原有编译流程,最终生成二进制可执行文件,里面包含了服务治理逻辑。

编译时注入框架现已开源,欢迎参与社区讨论和贡献,详情请点击 opentelemetry-go-auto-instrumentation [ 1]

接入并治理 Go 应用

为了更直观的展示如何进行 Go 应用的微服务治理,接下来我们将通过一个 Demo,演示 Go 应用从接入到使用微服务治理并生效的全过程。

3.1 Demo 服务说明

Demo 服务部署在阿里云 ACK 集群中,调用顺序为网关->A->B->C。其中网关采用阿里云 MSE 云原生网关,应用间调用方式为 http、服务发现方式采用 K8s 标准的 CoreDNS,应用 A、C 各部署了一个灰度版本,用于某需求迭代发布过程中的灰度验证。

Demo 服务的实现源代码请详见 mse-go-demo/multiframe [ 2]

应用名称 语言及版本 微服务框架及版本 Client 调用方式 服务发现方式
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 服务治理中心

一个 Go 应用接入 MSE 服务治理中心,只需执行以下四步即可,其中步骤 1、2 只需首次接入时执行,后续无需再操作。

  1. 在 MSE 服务治理中心中,为 ACK 集群一键安装 ACK-Onepilot 组件

  1. 在 MSE 服务治理中心中,为 ACK 集群一键开启高阶治理能力

  1. 下载并使用我们提供的 Instgo 工具编译 Go 应用,来代替 go build 命令,生成二进制可执行文件
# 生成当前操作系统可执行文件
./instgo build --mse --licenseKey="{licenseKey}"# 交叉编译,例如在MacOS中生成linux操作系统可执行文件
#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}"
  1. 将应用打包成镜像之后,部署到集群之前,在相应的 Deployment YAML 文件中 spec.template.metadata.labels 中添加以下标签后,部署应用即可完成接入
spec:template:metadata:labels:# required msePilotAutoEnable: "on" #标识开启MSE微服务治理mseNamespace: your-namespace #标识应用所属微服务治理空间msePilotCreateAppName: "your-app-name" #标识应用名称aliyun.com/app-language: golang #标识为Golang应用# optionalalicloud.service.tag: pod-tag #在全链路灰度中,用于标识灰度节点,如gray、blue...

可以看到,整个接入过程中不会涉及到业务代码的修改,相比自主魔改框架、手动引入 SDK 埋点等方式,更加清爽和简洁。

关于上述各步骤更详细的指引和说明请详见 ACK 微服务应用接入 MSE 治理中心(Golang 版) [ 3]

3.3 使用服务治理能力

按照 3.2 所述步骤完成应用接入后,即可在 MSE 治理中心控制台中看到具体的应用及服务信息,并且进行相应的服务治理规则配置。本节将从应用观测与管理、流量治理、全链路灰度三个常见治理场景,演示操作过程与实际效果。

3.3.1 应用观测与管理

将 3.1 中所述 Demo 的 A、B、C 三个 Go 应用接入到 MSE 治理中心,并设置:

  • mseNamespace=mse-go-agent-demo
  • 应用 A 的 msePilotCreateAppName=go-gin-demo-a
  • 应用 B 的 msePilotCreateAppName=go-kratos-demo-b
  • 应用 C 的 msePilotCreateAppName=go-zero-demo-c

接入完成后,可以在 MSE 治理中心 mse-go-agent-demo namespace 下看到对应的应用详情。

3.3.1.1 服务信息查看

进入 MSE 服务治理中心,点击服务查询,可以查看服务信息,包括应用内创建的 http 或 rpc 服务,以及对应服务的元信息,如接口元信息、服务元信息等。

在左上角分别选择 Gin、Kratos 和 Go-zero 框架,可以分别看到 A、B、C 应用的服务信息。由于我们在编码实现时,分别为应用 B 和 C 各创建了一个 Http Server、一个 Grpc Server,用于接收不同类型的请求,因此可以在控制台中看到两个服务。

点击相应的服务,能够看到服务的详细元信息,以应用 B 为例,以下为 B 应用的 Http 服务和 Grpc 服务信息。

3.3.1.2 应用信息查看

进入 MSE 服务治理中心,点击应用治理,能够从应用、接口、节点等不同维度查看应用的运行数据以及系统数据。

在应用列表处,可以看到不同应用的节点数、标签数、请求数、QPS 等数据。

点击对应应用卡片,即可从不同维度查看应用更详细的信息,包括应用整体数据、接口数据、节点数据等。

1)应用概览数据

2)接口数据

3)节点数据

3.3.2 流量治理

目前,我们提供了以下流量治理能力,支持用户自主配置并应对不同的场景,同时支持通过控制台配置规则快速启停:

  • 接口流控: 设置单接口最大 QPS,超过阈值的请求将会被拒绝或进入等待队列。
  • 并发隔离: 设置单接口的最大并发协程数,超过阈值的请求将会被拒绝。
  • 熔断: 设置接口的熔断防护规则,阈值可以设置为慢调用比例或者失败率,达到阈值后会触发熔断,在熔断时长内,该接口的请求都会快速失败,熔断状态结束后通过单次探测或渐进式策略恢复。
  • 热点参数防护: 相比接口流控,防护的规则精细到参数级别,例如可以设置某接口第 N 个参数占用最大并发资源数不超过 10,如果超过阈值则对应的请求会快速失败。
  • 行为降级: 触发接口流控后,可以自定义防护行为,例如返回指定状态码和内容、重定向等。
  • 自适应过载保护: 以 CPU 使用率作为衡量实例负载的依据,自适应地调整对入口流量的防护策略,避免因 CPU 资源打满导致服务崩溃。

3.3.2.1 规则配置

以应用 A 为例,假设我们希望为接口 /greet1a 设置单机 QPS 阈值为 1 的接口流控规则,如果达到阈值之后立即失败,并且返回 429 作为 Http 状态码,返回内容为"Too Many Request! The Server A will not process!"。

为了达到以上效果,可以直接在 MSE 治理中心配置如下:

  1. 点击应用治理,点击 go-gin-demo-a 应用卡片,点击流量治理

  1. 点击流量防护-行为管理,点击新增行为,按下图所示配置行为后,点击新建

  1. 点击流量防护-接口流控,按下图所示步骤配置流控防护规则,然后点击新增

  1. 在规则列表处,点击规则状态置为开启后,规则即生效

3.3.2.2 结果观测

持续一段时间后,可以看到应用 A 单节点通过的 QPS 稳定在 1,超过阈值的请求已经被拒绝;应用 B 的 QPS 稳定为 2,这是因为应用 A 一共有 2 个节点,最多允许通过的 QPS 为 2。

1)应用 A 单节点 QPS 数据

2)应用 B 整体 QPS 数据

使用云原生网关对应用 A/greet1a 发起调用,可以观察到由于触发了流控,接口返回了我们刚刚定义的错误状态码和内容。

3.3.3 全链路灰度

3.3.3.1 规则配置

假设在某次需求迭代中,我们变更了应用 A 和应用 C 的部分逻辑,并且希望通过灰度发布的方式测试并验证功能的正确性,希望 Header 内容中 x-user-uuid=123456789 的请求路由到灰度节点,其他请求仍然路由到常规节点。

为了达到以上效果,我们可以按照以下步骤进行操作和配置:

  1. 为应用 A 和应用 C 部署灰度节点,通过在 YAML 文件中 spec.template.metatada.labels 增加 alicloud.servicetag=gray 标识节点类型。
  2. 进入 MSE 治理中心,点击全链路灰度,创建泳道组,泳道组主要用于业务模块隔离,例如,同部门下业务小组 A 可以创建并使用泳道组 a,业务小组 B 可以创建并使用泳道组 b,两者相互隔离,互不干扰。
  3. 在泳道组内创建标签为 gray 的灰度泳道,如下图所示填写泳道信息、配置基线路由和灰度规则。

泳道组及泳道创建完成后,全链路灰度的配置就已经完成,如下图所示,泳道组的流量入口为 MSE 云原生网关,接下来我们通过对应的网关发起请求,Demo 应用中的业务返回结果打印了请求的调用链以及每一跳所路由到的节点标签和 IP,用于方便观察调用链路。

3.3.3.2 结果观测

1)设置请求 Header 中无 x-user-uuid,请求均路由到基线节点

2)设置请求 Header x-user-uuid=1,请求均路由到基线节点

3)设置请求 Header x-user-uuid=123456789,请求路由到 A、C 的灰度节点,由于应用 B 不存在灰度节点,因此路由到基线节点

由此,我们验证了全链路灰度规则配置已经生效。

本文链接:

[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 微服务应用接入 MSE 治理中心(Golang 版)

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

相关链接:

[1] Go 应用治理接入指引

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

[2] Go 应用治理兼容性要求与功能说明

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

[3] 15 分钟快速体验 Go 应用服务治理

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

阿里云 MSE Go 应用服务治理现已开启公测,公测期间不收取费用,欢迎接入使用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/789106.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECCV24|全局式SfM最新SOTA,GLOMAP重新定义SfM!

前言 ETH&微软最新开源-全局式GLOMAP,它与以前的全局SfM系统相比,其核心区别在于全局定位步骤。不是先执行不适定的平移平均然后进行全局三角测量,而是进行联合相机和点位置估计。GLOMAP不仅在鲁棒性和准确性方面达到增量式COLMAP系统相当或更优的水平,同时还比COLMAP快…

英伟达玩转剪枝、蒸馏:把Llama 3.1 8B参数减半,性能同尺寸更强

前言 小模型崛起了。 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。 本文转载自机器之心 仅用于学术分享,若侵权请联系删除 CV方向的准研究生们,未来三年如何度过? 招聘高光谱图像、语义分割、diffusion等方向论文指导老…

powershell 创建winform窗体 T2 : 自动配置相机网卡参数

<# 脚本功能说明:选择要配置的相机网卡,点击配置按键,自动配置参数 # 2024.08.29 #># 获取管理员权限 if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] &q…

打造高效门诊经营分析看板,赋能智慧医疗新篇章

在医疗行业日新月异的今天,门诊作为医疗服务的前沿阵地,其运营效率与服务质量直接关系到患者的就医体验与医院的整体竞争力。为了在这场医疗变革中抢占先机,越来越多的医疗机构开始探索并应用数据分析看板。门诊经营分析看板,是一个集数据收集、处理、展示于一体的综合信息…

lua的update、lateupdate

lua框架里面会封装,想用C#的Update,直接往里面塞事件:

使用 nuxi analyze 命令分析 Nuxt 应用的生产包

title: 使用 nuxi analyze 命令分析 Nuxt 应用的生产包 date: 2024/8/29 updated: 2024/8/29 author: cmdragon excerpt: 使用 nuxi analyze 命令可以帮助你深入了解生产包的结构和大小,从而做出针对性的优化。通过定期分析生产包,你可以识别并解决性能瓶颈,提高应用的加载…

风控系统之事件溯源,决策流程记录与版本控制

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview背景 一天,小明在风控管理台查看事件数据时,发现一笔决策结果为“拒绝”❌的交易事件,小明点开事件详情发现其触发了一条“24小时内向不同陌生账户转账超过30w”的规则,…

解密华为问界M7 Pro:智能出行的全新里程碑与技术亮点

华为问界M7 Pro为何备受瞩目?这款智能SUV究竟能为出行体验带来怎样的颠覆?智能座舱如何将科技与舒适完美结合,自动驾驶技术又将如何引领未来出行?通过鸿蒙生态的无缝联动,华为能否能够真正改变我们的生活方式?在这篇文章中,深入探讨这些问题,揭示华为在智能出行领域的全…

【ROS教程】服务通信

@目录1.流程2.自定义请求和响应的数据2.1 std_msgs内置类型2.2 编写.srv文件2.3 修改package.xml文件2.4 修改CMakeLists.txt文件2.4.1 修改find_package指令2.4.2 添加add_message_files指令2.4.3 添加generate_messages指令2.5 查看头文件3.编写cpp文件3.1 功能包目录文件树3…

NocoBase 1.3:REST API 数据源、移动端 V2 和更多功能

NocoBase 1.3 带来了 REST API 和 MSSQL 数据源、支持通过 URL 打开弹窗、动态配置字段组件、增强的移动端版本、企业微信认证、多对多数组、以及工作流中的日期计算节点等多项新功能。从 v1.3 开始,NocoBase 提供两个关键分支:main 和 next。main 分支,beta 版本,专注于缺…

ArgoWorkflow教程(三)---使用 Artifacts 实现步骤间文件共享

上一篇我们分析了 Workflow、WorkflowTemplate、template 之间的关系。本篇主要分析如何在 argo-workflow 中使用 S3 存储 artifact 实现步骤之间的文件共享。上一篇我们分析了 Workflow、WorkflowTemplate、template 之间的关系。本篇主要分析如何在 argo-workflow 中使用 S3 …