全链路追踪 性能监控,GO 应用可观测全面升级

作者:古琦

01 介绍

随着 Kubernetes 和容器化技术的普及,Go 语言不仅在云原生基础组件领域广泛应用,也在各类业务场景中占据了重要地位。如今,越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架(如 Gin、Kratos、Kitex 等),Golang在微服务生态中愈加成熟,并被用于很多重要的开源项目,如 OpenTelemetry Collector、ETCD、Prometheus、Istio 等。

但是跟 Java 相比,Golang 在微服务生态上依然处于劣势,相比 Java 可以使用字节码增强的技术来实现无侵入的应用监控能力,Golang 没有成熟的对应方案,当前,大多数面向 Golang 应用的监控能力主要是通过 SDK 方式接入,如 OTel SDK,需要开放人员手动进行埋点,手动埋点的方案就会存在以下的两个问题:

  • Trace 需要每个调用点都需要进行埋点,同时要注意 Trace 上下文的传递,避免链路串联错误
  • Metrics 统计,需要针对每次调用都进行统计,同时注意指标发散的问题
  • 工作量非常大,对业务侵入性,每增加一个接口就需要同步增加对应的埋点

为了解决上述问题,可观测 Go Agent 应运而生。

02 实现原理

Java 有 JVM 提供的基于字节码增强的能力可以进行无侵入的埋点,Golang 没有类似的能力,因此这里我们是通过编译期注入的方案,在编译期完成埋点的注入,架构如下所示:

在这里插入图片描述

1. 语法树分析

我们在编译过程中,利用语法树(AST, Abstract Syntax Tree)解析每个 .go 文件。通过分析语法树,能够精确定位到合适的插入点。具体实现中,我们使用了 dst 库,这是一个强大的语法树解析和变换工具。

2. 编译劫持

利用 Golang 提供的 -toolexec 参数,我们可以在编译时指定一个定制工具来劫持编译过程。该工具——即我们的 Go Agent,在 Golang 程序编译时介入,通过分析和修改语法树,插入监控代码。修改后的文件将编译储存在 .a 文件中,最后生成的二进制文件中包含我们的插入代码。

3. 代码插入

具体流程如下:

  • 解析源代码: 在每次编译一个 .go 文件时,Go Agent 通过 toolexec 参数接管编译过程。
  • 语法树分析: 使用 dst 库解析每个文件的语法树,找到适合插入监控代码的位置,如函数调用点、HTTP 请求处理点等。
  • 插入监控代码: 在选定的插入点中写入监控代码,这些监控代码用来收集运行时信息,如请求数、响应时间、错误率等。
  • 继续编译过程: 插入监控代码后,将修改后的文件继续传递给编译器,编译成 .a 文件。最终生成的二进制文件包含了监控逻辑。

03 Go Agent 支持的三方 SDK

通过我们定义插件 API,我们可以非常方便的对不同的SDK进行埋点,当前 Go Agent 支持 1.18 及以上的 Golang 版本,支持如下常见的微服务框架、协议、中间件等我们在 Go Agent 中都做了埋点,如下是当前版本支持的情况,当前已经支持了 20 款的插件能力。

在这里插入图片描述

04 产品能力

1. 应用概览

展示应用的请求数、错误数、平均耗时、实例数等信息。

在这里插入图片描述

2. 应用拓扑

展示应用的上下游信息。

在这里插入图片描述

3. 提供服务

展示提供的接口的被调用情况。

在这里插入图片描述

4. 依赖服务

展示依赖的下游服务的调用情况。

在这里插入图片描述

5. 调用链分析

可以完整的展示整个系统的调用链数据。

在这里插入图片描述
在这里插入图片描述

6. 实例监控

在这里插入图片描述

7. 场景化分析

数据库分析:

在这里插入图片描述

异常分析:

在这里插入图片描述

8. 应用配置

可以配置采样率,目前支持按比例采样,还可以配置探针的开关,实现注入能力的实时插拔。

在这里插入图片描述

9. 智能告警

可以配置应用响应的告警规则,针对如应用提供的服务、HTTP 状态码、数据库指标、依赖服务、主机监控配置告警。

在这里插入图片描述

05 兼容性

1)兼容已有的 OTel Go SDK,支持 v1.6.0-v1.26.0 版本,已经使用了 OTel SDK 的应用无需修改也可以通过 Go Agent 接入到 ARMS 应用监控。

2)Trace 透传协议支持 W3C、Jaeger、EagleEye、Zipkin,可以跟已有的其他 Trace 协议进行打通。

06 Go 应用接入应用监控

当您需要对部署在容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)中的 Go 应用进行监控时,通过安装 ARMS 应用监控组件 ack-onepilot 并编译 Go 二进制文件,即可在应用实时监控服务 ARMS 中查看对应应用的应用拓扑、接口调用、数据库分析等相关监控数据。本文将介绍如何为部署在容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)中的 Go 应用安装探针。

前提条件

  • 创建 Kubernetes 集群。您可按需选择创建 [ 1] 、创建 ACK 托管集群 [ 2] 或创建 ACK Serverless 集群 [ 3]
  • 创建命名空间,具体操作,请参见管理命名空间与配额 [ 4] 。本文示例中的命名空间名称为 default。
  • 检查您的编译环境操作系统和架构,以及 Go 版本和框架版本。具体要求,请参见 Golang 探针兼容性要求 [ 5]
  • 应用监控目前只支持使用 Go mod 的仓库编译,如果没有 Go mod 文件,可以使用 Go init 创建 Go mod。

步骤一:安装 ARMS 应用监控组件

  1. 登录容器服务管理控制台 [ 6] 。2. 在左侧导航栏单击集群,然后在集群列表页面单击目标集群名称。

  2. 在左侧导航栏选择运维管理 > 组件管理,然后在右上角通过关键字搜索 ack-onepilot。

重要: 请确保 ack-onepilot 的版本在 3.2.0 或以上。

  1. 在 ack-onepilot 卡片上单击安装。

说明: ack-onepilot 组件默认支持 1000 个 pod 规模,集群 pod 每超过 1000 个,ack-onepilot 资源对应的 CPU 请增加 0.5 核、内存请增加 512 M。

  1. 在弹出的页面中可以配置相关的参数,建议使用默认值,单击确定。

说明: 安装完成后,您可以在组件管理页面升级、配置或卸载 ack-onepilot 组件。

步骤二:编译 Go 二进制文件

  1. 使用 wget 命令下载编译工具,请根据编译环境和编译机器所在地域,选择对应的下载地址。

说明: 各地域下载的编译工具是相同的,如果您的公网环境可以访问 OSS 地址,可以直接使用对应操作系统和架构的杭州公网地址获取编译工具。

查看各地域对应的下载命令:

https://help.aliyun.com/zh/arms/application-monitoring/getting-started/ack-installs-a-go-probe-through-ack-onepilot-components?spm=a2c4g.11186623.0.0.243928a8HbTaeb#439ba6b5802t6

  1. 通过对 SHA256 校验和进行校验,验证下载结果的完整性,并为编译工具赋予可执行权限。

您可以在探针下载地址后面添加 .sha256 下载获取 SHA256 校验和。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 通过 OpenAPI 获取 LicenseKey,具体方法,参见 DescribeTraceLicenseKey - 列出 LicenseKey [ 7]

  2. 在项目 main 函数所在文件的目录下执行编译工具编译 Go 项目,请替换命令行中的 {licenseKey} 为上一步获取到的 LicenseKey。

如果您需要测试编译效果,或暂时无法获取到 LicenseKey,可以添加 --dev 来开启 Dev 编译模式,此模式下不需要传入 LicenseKey。

重要: Dev 模式下编译结果部分功能有降级,请勿用于线上。

在这里插入图片描述
在这里插入图片描述

  1. 如果您原本编译命令中含有后续的编译参数,请在所有选项添加完毕后,添加–分隔符,并将编译参数按照原有格式添加在后面,例如:

在这里插入图片描述
在这里插入图片描述

编译后会产生对应的二进制文件,二进制文件的名称可以通过编译参数指定。

如下所示,编译后的二进制名称为 http,如果不添加对应配置,输出的二进制的名称为 go.mod 中 module 配置的名称。

在这里插入图片描述

相关信息

Instgo 常见命令与释义如下:

在这里插入图片描述

初次编译时,探针会默认被下载到 /opt 目录下(Windows 为 C:\ProgramData),如果该目录没有权限,可以使用–cacheDir flag 指定缓存目录,或使用 sudo -E 命令执行编译(Windows 请使用管理员权限执行编译命令)。

编译过程中如果强制退出或出现异常退出,可能会存在编译残留。清理Golang探针编译残留的方法,请参见清理 Golang 探针编译残留 [ 8]

步骤三:授予 ARMS 资源的访问权限

如果需监控 ASK(容器服务 Serverless 版)或对接了 ECI 的集群应用,请在云资源访问授权 [ 9] 页面完成授权,然后重启 ack-onepilot 组件下的所有 Pod。

如果需监控 ACK 集群应用,但 ACK 集群中不存在ARMS Addon Token,请执行以下操作手动为集群授予 ARMS 资源的访问权限。如果已经存在 ARMS Addon Token,请跳转至步骤四。

查看集群是否存在 ARMS Addon Token:

a. 登录容器服务管理控制台 [ 10] ,在集群列表页面,单击目标集群名称进入集群详情页。

b. 在左侧导航栏选择配置管理 > 保密字典,然后在顶部选择命名空间为 kube-system,查看 addon.arms.token 是否存在。

说明: 集群存在 ARMS Addon Token 时,ARMS 会进行免密授权。Kubernetes 托管版集群默认存在 ARMS Addon Token,但对于部分早期创建的 Kubernetes 托管版集群,可能会存在没有 ARMS Addon Token 的情况,因此,对于 Kubernetes 托管版集群,建议首先检查 ARMS Addon Token 是否存在。若不存在,需进行手动授权。

a. 登录容器服务管理控制台。

b. 在左侧导航栏选择集群,然后单击目标集群名称。

c. 在目标集群的集群信息页面单击集群资源页签,然后单击Worker RAM角色右侧的链接。

d. 在角色页面的权限管理页签上,单击新增授权。

e. 选择权限为 AliyunARMSFullAccess,然后单击确定。

如果需要监控专有版集群和注册集群应用,请确认对应的阿里云账号已包含 AliyunARMSFullAccess 和 AliyunSTSAssumeRoleAccess 权限。添加权限的操作,请参见为 RAM 用户授权 [ 11]

a. 安装 ack-onepilot 组件后,还需要在 ack-onepilot 中填写有 ARMS 权限的阿里云账号 AK/SK。

b. 在左侧导航栏选择应用 > Helm 页面,单击 ack-onepilot 组件右侧的更新。

将 accessKey 和 accessKeySecret 替换为当前账号的 AccessKey,然后单击确定。

说明: 获取 AccessKey 的操作,请参见创建 AccessKey [1****2]

在这里插入图片描述

c. 重启应用 Deployment。

步骤四:为 Go 应用开启 ARMS 应用监控

如需在创建新应用的同时开启 ARMS 应用监控,请完成以下操作。

  1. 在容器服务管理控制台 [ 13] 左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理。

  2. 在无状态页面右上角单击使用 YAML 创建资源。

  3. 选择示例模板,并在模板(YAML 格式)中将以下 labels 添加到 spec.template.metadata 层级下。

labels:aliyun.com/app-language: golang # Go应用必填,标明此应用是Go应用。armsPilotAutoEnable: 'on'armsPilotCreateAppName: "<your-deployment-name>"    #请将<your-deployment-name>替换为您的应用名称。

在这里插入图片描述

创建一个无状态(Deployment)应用并开启 ARMS 应用监控的完整 YAML 示例模板如下:

查看完整示例 YAML 文件(Java):

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: fasthttp-servername: fasthttp-servernamespace: default
spec:replicas: 1selector:matchLabels:app: fasthttp-serverstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: fasthttp-serveraliyun.com/app-language: golangarmsPilotAutoEnable: 'on'armsPilotCreateAppName: fasthttp-serverhostLabelA: aaahostLabelB: bbbspec:containers:- image: >-registry.cn-hangzhou.aliyuncs.com/private-mesh/hellob:fasthttp-server-arms-go-test-0.0.1imagePullPolicy: Alwaysname: fasthttp-serverresources:requests:cpu: 250mmemory: 300MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:labels:app: fasthttp-servername: fasthttp-servernamespace: default
spec:internalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: httpport: 8080protocol: TCPtargetPort: 8080selector:app: fasthttp-serversessionAffinity: Nonetype: ClusterIP---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: fasthttp-clientname: fasthttp-clientnamespace: default
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: fasthttp-clientstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: fasthttp-clientaliyun.com/app-language: golangarmsPilotAutoEnable: 'on'armsPilotCreateAppName: fasthttp-clienthostLabelA: aaahostLabelB: bbbspec:containers:- image: >-registry.cn-hangzhou.aliyuncs.com/private-mesh/hellob:fasthttp-client-arms-go-test-0.0.1imagePullPolicy: Alwaysname: fasthttp-clientresources:requests:cpu: 250mmemory: 300MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30

执行结果

约一分钟后,若 Golang 应用出现在 ARMS 控制台 [ 14] 的应用监控 > 应用列表页面中且有数据上报,则说明接入成功。

在这里插入图片描述

点击此处立即开通 ARMS - 应用监控,享受每月 50GB 免费额度!加入钉钉群(群号:35568145)获得在线技术支持。

相关链接:

[1] 创建

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-dedicated-cluster?spm=a2c4g.11186623.0.i4#task-skz-qwk-qfb

[2] 创建 ACK 托管集群

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-2?spm=a2c4g.11186623.0.i5#task-skz-qwk-qfb

[3] 创建 ACK Serverless 集群

https://help.aliyun.com/zh/ack/serverless-kubernetes/user-guide/create-an-ask-cluster-2?spm=a2c4g.11186623.0.i6#task-e3c-311-ydb

[4] 管理命名空间与配额

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/manage-namespaces-and-resource-quotas-1?spm=a2c4g.11186623.0.i7#task-2060973

[5] Golang 探针兼容性要求

https://help.aliyun.com/zh/arms/application-monitoring/developer-reference/go-components-and-frameworks-supported-by-arms-application-monitoring?spm=a2c4g.11186623.0.i8

[6] 容器服务管理控制台

https://cs.console.aliyun.com/?spm=a2c4g.11186623.0.0.5de2554b7Zi2Ir#/k8s/cluster/list

[7] DescribeTraceLicenseKey - 列出 LicenseKey

https://help.aliyun.com/zh/arms/application-monitoring/developer-reference/api-arms-2019-08-08-describetracelicensekey-apps?spm=a2c4g.11186623.0.i9

[8] 清理 Golang 探针编译残留

https://help.aliyun.com/zh/arms/application-monitoring/user-guide/unloading-the-golang-probe?spm=a2c4g.11186623.0.i10#376f76252fhsm

[9] 云资源访问授权

https://ram.console.aliyun.com/role/authorization?spm=a2c4g.11186623.0.0.5de24bc27D1EPz&request=%7B%22Services%22%3A%5B%7B%22Service%22%3A%22ECS%22%2C%22Roles%22%3A%5B%7B%22RoleName%22%3A%22AliyunMSEForECIRole%22%2C%22TemplateId%22%3A%22AliyunMSEForECIRole%22%7D%5D%7D%5D%2C%22ReturnUrl%22%3A%22https%3A%2F%2Farms.console.aliyun.com%22%7D

[10] 容器服务管理控制台

https://cs.console.aliyun.com/?spm=a2c4g.11186623.0.0.5de24bc27D1EPz#/k8s/cluster/list

[11] 为 RAM 用户授权

https://help.aliyun.com/zh/ram/user-guide/grant-permissions-to-the-ram-user?spm=a2c4g.11186623.0.i11

[12] 创建 AccessKey

https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair?spm=a2c4g.11186623.0.i12

[13] 容器服务管理控制台

https://cs.console.aliyun.com/?spm=a2c4g.11186623.0.0.5de22c6a8Wb7NM#/k8s/cluster/list

[14] ARMS 控制台

https://arms.console.aliyun.com/?spm=a2c4g.11186623.0.0.5de22c6a8Wb7NM#/home

参考文档:

[1] 手动安装 Golang 探针

https://help.aliyun.com/zh/arms/application-monitoring/getting-started/manually-install-the-golang-probe?spm=a2c4g.11186623.0.0.760528a8VT9OFu

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

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

相关文章

Golang实现Word模板内容填充导出

这里我们使用一个广泛使用且免费处理 .docx 文件的库&#xff0c;github.com/nguyenthenguyen/docx. 安装 github.com/nguyenthenguyen/docx 库 首先&#xff0c;确保你已经安装了 docx 库&#xff1a; go get github.com/nguyenthenguyen/docx使用 docx 库处理 Word 模板 …

ubuntu实践

目录 扩容 本机上ping不通新建立的虚拟机 ssh连接 装sshd ssh客户端版本较低&#xff0c;会报key exchange算法不匹配问题 ubuntun上装docker 将centos7下的安装包改造成适配 ubuntu的包 参考文章 扩容 Hyper-V 管理器安装的ubutun扩容磁盘空间说明_hype-v磁盘扩容-…

复现open-mmlab的mmsegmentation详细细节

复现open-mmlab的mmsegmentation详细细节 1.配置环境2.数据处理3.训练 1.配置环境 stage1&#xff1a;创建python环境 conda create --name openmmlab python3.8 -y conda activate openmmlabstage2&#xff1a;安装pytorch&#xff08;这里我是以torch1.10.0为例&#xff09…

VINS-Fusion 回环检测pose_graph_node

VINS-Fusion回环检测,在节点pose_graph_node中启动。 pose_graph_node总体流程如下: 重点看process线程。 process线程中,将订阅的图像、点云、位姿时间戳对齐,对齐后分别存入image_msg、point_msg、pose_msg。pose_msg为VIO后端优化发布的位姿。 一、创建关键帧keyFram…

mac|安装PostgreSQL

1、官网下载&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 选择需要的版本&#xff1a; 双击得到的.dmg文件 双击&#xff0c;弹窗选择打开&#xff0c;一路next&#xff0c;然后输入你要设置的密码&#xff0c;默认账号名字为&#xff1a;postgres…

项目一缓存商品

文章目录 概要整体架构流程技术细节小结 概要 因为商品是经常被浏览的,所以数据库的访问量就问大大增加,造成负载过大影响性能,所以我们需要把商品缓存到redis当中,因为redis是存在内存中的,所以效率会比MySQL的快. 整体架构流程 技术细节 我们在缓存时需要保持数据的一致性所…

面试场景题系列--(2)短 URL 生成器设计:百亿短 URL 怎样做到无冲突?--xunznux

文章目录 面试场景题&#xff1a;短 URL 生成器设计&#xff1a;百亿短 URL 怎样做到无冲突&#xff1f;1. 需求分析2. 短链接生成算法2.1 自增法2.2 散列函数法2.3 预生成法 3. 部署模型3.1 其他部署方案 4. 设计4.1 重定向响应码4.2 短 URL 预生成文件及预加载4.3 用户自定义…

个人百度百科怎么创建?

百度百科词条分为企业词条、品牌词条、人物词条等&#xff0c;个人百度百科创建的需求量很大&#xff0c;各式各样的人物需求都有。现在凡是要推广个人的人&#xff0c;创建百度百科都是其中一个必要的步骤。 作为一个有知名度的人物&#xff0c;拥有一个百度百科从侧面也证明了…

基于微信小程序+SpringBoot+Vue的自习室选座与门禁系统(带1w+文档)

基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 本课题研究的研学自习室选座与门禁系统让用户在小程序端查看座位&#xff0c;预定座位&#xff0c;支付座位价格&#xff0c;该系统让用户预定座位…

CentOS搭建Apache服务器

安装对应的软件包 [roothds ~]# yum install httpd mod_ssl -y 查看防火墙的状态和selinux [roothds ~]# systemctl status firewalld [roothds ~]# cat /etc/selinux/config 若未关闭&#xff0c;则关闭防火墙和selinux [roothds ~]# systemctl stop firewalld [roothds ~]# …

ARM功耗管理之autosleep和睡眠锁实验

安全之安全(security)博客目录导读 ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战 思考&#xff1a;睡眠唤醒实验&#xff1f;压力测试&#xff1f;Suspend-to-Idle/RAM/Disk演示&#xff1f; 1、实验环境准备 2、软件代码准备 3、唤醒源 4、Suspend-…

18.jdk源码阅读之CopyOnWriteArrayList

1. 写在前面 CopyOnWriteArrayList 是 Java 中的一种线程安全的 List 实现&#xff0c;基于“写时复制”&#xff08;Copy-On-Write&#xff09;机制。下面几个问题大家可以先思考下&#xff0c;在阅读源码的过程中都会解答&#xff1a; CopyOnWriteArrayList 适用于哪些场景…

Profinet转ModbusTCP网关模块的配置与应用详解

Profinet转ModbusTCP网关模块&#xff08;XD-ETHPN20&#xff09;是一种常见的工业通信设备&#xff0c;广泛应用于现代工业自动化系统中。通过使用Profinet转Modbus TCP网关模块&#xff08;XD-ETHPN20&#xff09;将Profinet协议转换成Modbus TCP协议&#xff0c;实现了不同网…

抓包工具Charles

1、抓包的目的 遇到问题需要进行分析 发现bug需要定位 检查数据传输的安全性 接口测试时&#xff0c;开发给的需求文档不详细 在弱网环境下APP的测试 2、Charles是java语言编写的程序&#xff0c;本质是一个代理服务器&#xff0c;通过拦截服务端和客户端的http请求&#xff0…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-2

目录 高并发缓存三问 - 穿透 缓存穿透 概念 现象举例 解决方案 缓存穿透 - 预热架构 缓存穿透 - 布隆过滤器 布隆过滤器 布隆过滤器基本思想​编辑 了解 高并发缓存三问 - 击穿 缓存击穿 高并发缓存三问 - 雪崩 缓存雪崩 解决方案 总结 为什么要使用数据字典&…

【Dison夏令营 Day 30】如何用 Python 创建平台游戏(下篇)

几十年来&#xff0c;平台游戏一直是深受玩家喜爱的游戏类型&#xff0c;它提供了令人兴奋的挑战和令人怀念的游戏玩法。在本教程中&#xff0c;我们将指导您使用 Python 中的 PyGame 库构建自己的平台游戏。 无论您是希望深入游戏开发的初学者&#xff0c;还是希望探索 Pygame…

【OpenCV C++20 学习笔记】基本图像容器——Mat

【OpenCV C20 学习笔记】基本图像容器——Mat 概述Mat内部结构引用计数机制颜色数据格式 显式创建Mat对象使用cv::Mat::Mat构造函数矩阵的数据项 使用数组进行初始化的构造函数cv::Mat::create函数MATLAB风格的初始化小型矩阵通过复制创建Mat对象 Mat对象的输出其他普通数据项的…

77.WEB渗透测试-信息收集-框架组件识别利用(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;76.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;16&#xff09; java&#xff…

HarmonyOS入门-状态管理

View(UI)&#xff1a;UI渲染&#xff0c;指将build方法内的UI描述和Builder装饰的方法内的UI描述映射到界面。 State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 装…

C# Nmodbus,EasyModbusTCP读写操作

Nmodbus读写 两个Button控件分别为 读取和写入 分别使用控件的点击方法 ①引用第三方《NModbus4》2.1.0版本 全局 public SerialPort port new SerialPort("COM2", 9600, Parity.None, 8, (StopBits)1); ModbusSerialMaster master; public Form1() port.Open();…