在微服务架构中,操作通常涵盖多个服务和资源,例如网关,微服务,负载平衡器和数据库。微服务的分布性质使软件仪器变得有价值。
如果我们的代码提供迹线,指标和日志,我们可以说它是仪器的,这意味着我们能够观察系统的性能。
服务仪器对于识别和故障排除性能问题和错误特别有用。收集的数据也可以通过帮助我们了解应用程序的流量和使用模式来用于容量计划。
有几种用于服务仪器的解决方案,例如OpenTelemetry,Zipkin和datadog。 AWS还提供了一个OpenTelemetry Distro,以便在使用X射线或任何其他第三方解决方案时使用OpenTelemetry作为可观察性后端,以接收跟踪遥测数据并提供该数据的处理,聚合和可视化。
在这篇文章中,我将告诉您有关使用杜松子酒的Go Microservice的经验。
杜松子酒
Gin是GO编程语言的轻巧且高性能的Web框架,旨在使快速且可扩展的Web应用程序易于构建。
它具有简约的API,强大的路由器,中间件支持和内置的安全功能,使其成为构建微服务和其他高性能Web应用程序的理想选择。
杜松子酒可能具有陡峭的学习曲线和有限的内置功能,但其简单性和可扩展性使其成为优先性能和可扩展性的开发人员的流行选择。
从头开始创建杜松子酒服务不在这篇文章的范围的范围之内,但是您可以在official documentation page.
中阅读有关杜松子酒的更多信息。AWS X射线
aws X射线是一项AWS服务,可收集有关您应用程序服务请求的数据,并提供了查看,过滤和获得该数据的见解以识别问题和优化机会的工具。
其他类似工具的X射线优点是:
- 与某些AWS服务集成
- 没有额外的基础架构要管理(AWS Elastic Beanstalk和AWS Lambda平台上包含守护程序)
- 只能用作可视化器(将OpenTelemetry作为示踪剂)
- 对于支持的服务,X射线SDK可以自动发送和跟踪跨服务的请求ID
- 由AWS管理
- 每月免费的100k痕迹是免费的
- 每个月检索或扫描的前1,000,000个痕迹是免费的。
但是,它的一些缺点是:
- AWS X射线只能与在Amazon EC2,Amazon EC2集装箱服务,AWS Lambda和AWS Elastic Beanstalk上运行的应用程序一起使用。
- 用尽了本月的自由跟踪后,每个痕迹索引或查询都有成本。
- 有限的语言支持:X射线为几种编程语言提供了SDK,但它不支持所有语言或平台,这可能会限制其在某些情况下的实用性。
- 供应商锁定:使用X射线可能会导致供应商锁定AWS,因为它是仅在AWS平台上可用的专有服务。这可能会限制您将来切换到其他云提供商或工具的能力。
如果阅读了一些利弊后,您仍然倾向于使用X射线,那么您可以继续阅读。
要求
要查看AWS中的跟踪信息,您需要一个AWS帐户和一个在AWS基础架构上运行的应用程序或与AWS服务集成。此外,您需要:
- X射线守护程序的实例,可以作为二进制或Docker容器运行。您可以找到有关如何运行和配置here的详细说明。对于本文,我将使用OS X二进制。
- 您的应用程序必须具有与AWS X射线服务和其他使用的其他AWS服务相互作用的必要权限。
已经角色了
要使您的应用程序将轨迹发送到X射线,您需要为X射线守护程序提供角色。要创建角色,请转到AWS Web控制台中的“角色”部分以进行IAM服务,然后单击“创建角色”按钮。
在向导中,选择“ AWS帐户”作为受信任的实体,然后单击“下一步”。在下一个屏幕上,搜索名为“ awsxraydaemonwriteaccess”的权限策略。单击“下一步”继续。
为角色添加名称和描述,然后单击“创建角色”。这将带您回到角色列表。寻找您刚刚创建的角色以查看和复制角色。
X射线守护程序
现在我们已经创建了守护程序角色,让我们配置并运行它。
对于本地设置,我只需要更改一些设置,例如日志级别,将本地模式设置为true并添加X射线角色和AWS区域。
这是我使用的配置文件:
# Send segments to AWS X-Ray service in a specific region
Region: "us-west-2"
Socket:
# Change the address and port on which the daemon listens for UDP packets containing segment documents.
UDPAddress: "127.0.0.1:2000"
# Change the address and port on which the daemon listens for HTTP requests to proxy to AWS X-Ray.
TCPAddress: "127.0.0.1:2000"
Logging:
# Change the log level, from most verbose to least: dev, debug, info, warn, error, prod (default).
LogLevel: "dev"
# Turn on local mode to skip EC2 instance metadata check.
LocalMode: true
# Assume an IAM role to upload segments to a different account.
RoleARN: "arn:aws:iam::269174633178:role/X-Ray_Daemon_role"
# Daemon configuration file format version.
Version: 2
您可以在AWS X-Ray Developer Guide.
中了解有关其他配置值的更多信息。仪器进行微服务。
现在我们已经配置了X射线守护程序并运行了,我们可以将仪器添加到我们的服务中。
AWS建议通过用xray.Handler
包装服务处理程序来追踪传入的请求。但是,由于我们正在使用杜松子酒,我们将实现的方法略有不同。
在寻找有关如何启动杜松子酒应用程序的资源时,我发现了基于x-ray handler function的middleware by Oroshnivskyy。
此中间件将开始并关闭收到的每个请求。还将照顾处理跟踪ID标头("x-amzn-trace-id"
),该标题包含一个ID值,该值将为每个新请求生成,并将在我们所有的所有微服务中传播。
因此,让我们将中间件添加到要仪器的路线中:
// as part of my gin routes
v1.GET("/auth/roles", xraymid.Middleware(xray.NewFixedSegmentNamer("GetRoles")), controller.GetRoles)
在这里,我们将(将作为XrayMid)添加到v1
组的路线中。作为参数传递给NewFixedSegmentNamer
的值必须设置为您路线的描述名称。这将是此端点的主要跟踪组的名称。
好吧!现在让我们看看它是否有效!启动服务并验证守护程序正在运行。
提出请求后,我们可以在守护程序日志中看到类似的内容:
2023-03-21T13:10:47-06:00 [Debug] Received request on HTTP Proxy server : /GetSamplingRules
2023-03-21T13:10:48-06:00 [Debug] processor: sending partial batch
2023-03-21T13:10:48-06:00 [Debug] processor: segment batch size: 1. capacity: 50
2023-03-21T13:10:48-06:00 [Info] Successfully sent batch of 1 segments (0.109 seconds)
2023-03-21T13:10:49-06:00 [Debug] Send 1 telemetry record(s)
看起来正常工作!让我们在AWS Web控制台中查看跟踪。
在您的AWS Web控制台中,转到CloudWatch和侧面面板,查找X射线,然后单击“痕迹”选项。
如果一切顺利,您将看到最近收到的轨迹的数量,并且轨迹表将使用此类痕迹填充。
在跟踪表中,单击条目中。如果我们可以看到追踪信息,我们将被带到跟踪视图。
在这里我们可以看到跟踪数据。我们只为每个呼叫创建一个细分市场并关闭它,因此我们没有其他数据,但是我们可以看到响应状态代码,所需的请求所花费的时间,当然还有跟踪地图,目前仅包括客户和服务。
创建子段
所以现在我们有了基本的仪器设置,我们还能跟踪什么?
到目前为止,我们只是在追踪一个请求及其元数据。但是,如果我们想变得更详细呢?
假设我们有一个密集的过程作为请求的一部分;我们可以添加一个子段来监视它。
我服务中的某个地方,当我调用auth/roles
端点时执行以下代码:
// inside a function
roles := make([]Role, len(rolesList))
for i, roleItem := range rolesList {
role, err := u.buildRole(roleItem)
if err != nil {
return model.RoleList{}, err
}
roles[i] = role
}
我们可以将for
循环包裹在子段中,以便我们可以看到在此过程中花费了多少要求。
要添加一个子段,我们将循环包裹为:
err = xray.Capture(ctx, "BuildRolesDetail", func(ctx1 context.Context) error {
for i, roleItem := range rolesList {
role, err := u.buildRole(roleItem)
if err != nil {
return err
}
roles[i] = role
}
if err = xray.AddMetadata(ctx1, "No. roles built", len(roles)); err != nil {
return nepErrors.InternalServerError.WithDetail(err.Error())
}
return nil
})
让我们运行我们的服务并再次致电我们的乐器端点。
这是AWS CloudWatch-> TRACES中的新跟踪:
现在,我们看到该请求采用了 215ms ,其中BuildRolesDetail
循环采用了 205ms 。
您是否开始考虑追踪提示?你应该!您可以使用xray.AddMetadata
添加所需的任何额外信息。只需考虑X射线守护程序仅发送到AWS up to 64KB of metadata per Segment。
用X射线仪器AWS客户
使用SDK-V1的仪器AWS客户端非常简单,您可以关注official guide。
没有太多关于如何启动AWS SDK-V2客户端的文档,但是配置也很简单。
在您的服务代码中的某个地方,您将初始化AWS客户端。要向他们添加仪器,您只需要向客户提供X射线HTTP客户端并传递每个呼叫的请求上下文。
cfg, err := config.LoadDefaultConfig(ctx)
if err != nil {
return nil, err
}
// Create an HTTP client
httpClient := &http.Client{}
// Set the HTTP client as the AWS configuration's HTTP client
cfg.HTTPClient = httpClient
// Create an X-Ray client
xrayClient := xray.Client(httpClient)
dynamoClient := dynamodb.NewFromConfig(cfg, func(options *dynamodb.Options) {
// Wrap the http.Client with an xray.Client
options.HTTPClient = xrayClient
})
在这里,我将X射线HTTP客户端添加到AWS DynamoDB客户端。
让我们再次致电我们的乐器端点。
我当前在本地运行DynamoDB,但是您已经可以看到每次呼叫DynamoDB花费了多少时间。我们还可以看到,跟踪映射已更新以显示我的dynamodb的本地实例。
要点
使用X射线服务的仪器相对简单,但是根据我们要监视的内容,它可能会变得非常复杂。因此,为您的服务添加跟踪的努力可能会根据您的用例而有所不同。
要考虑的另一件事是每个段的64kb限制。如果您想追踪很多子播种或添加更多元数据,这可能还不够。有一些方法可以绕过这一点,但它们不超出此帖子的范围。
总而言之,在GO微服务中实施X射线是一个简单的过程,可以极大地使您的应用程序的可观察性和故障排除功能受益。集成过程相对容易,X射线SDK提供了一系列有用的功能,使其易于跟踪请求并识别瓶颈。但是,重要的是要记住X射线确实有一些缺点,例如与使用它相关的成本以及其采样功能的局限性。
尽管如此,通过仔细考虑和正确的实现,X射线可能是调试和优化微服务体系结构的宝贵工具。因此,请不要犹豫,尝试一下它如何增强您的GO微服务的性能和可靠性。