当前位置: 首页 > news >正文

全链路追踪 性能监控,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

相关文章:

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

作者&#xff1a;古琦 01 介绍 随着 Kubernetes 和容器化技术的普及&#xff0c;Go 语言不仅在云原生基础组件领域广泛应用&#xff0c;也在各类业务场景中占据了重要地位。如今&#xff0c;越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架&#xff…...

深入探索CSS3的Media Query:打造响应式网页设计的利器

在今天的互联网世界中&#xff0c;随着设备种类和屏幕尺寸的多样化&#xff0c;响应式网页设计&#xff08;Responsive Web Design, RWD&#xff09;已成为不可或缺的一部分。CSS3中的Media Query正是这一设计理念的实现利器&#xff0c;它允许开发者根据用户的设备特性和屏幕尺…...

DDD(Domain-Driven Design)领域驱动设计

在软件开发中&#xff0c;DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;是一种方法论&#xff0c;它强调在开发过程中将业务领域的知识和规则作为核心。DDD的目标是通过理解和建模业务领域来创建更好的软件系统。本文将详细讲解DDD的基本概念、原则…...

基于k8s快速搭建docker镜像服务的demo

基于k8s快速搭建docker镜像服务的demo 一、环境准备 如标题&#xff0c;你需要环境中有和2个平台&#xff0c;并且服务器上也已经安装好docker服务 接下来我来构建一个docker镜像&#xff0c;然后使用harbork8s来快速部署服务demo 二、部署概述 使用docker构建镜像&#x…...

“论大数据处理架构及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 大数据处理架构是专门用于处理和分析巨量复杂数据集的软件架构。它通常包括数据收集、存储、处理、分析和可视化等多个层面&#xff0c;旨在从海量、多样化的数据中提取有价值的信息。Lambda架构是大数据平台里最成熟、最稳定的架构&#xff0c;它是一种将批处理和流…...

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案&#xff0c;使用 React 语法规范来开发多端应用&#xff08;包括小程序、H5、React Native 等&#xff09;。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目&#xff08;本来就有的旧项目&#xff09;的步…...

Maven打包时将本地 jar 加入 classpath

在使用 maven 编译项目时&#xff0c;我们有时候会需要引入本地的 jar 包作为依赖&#xff08;不部署到本地仓库&#xff09;&#xff0c;一般会使用 scope 为 system 的标签来引入&#xff0c;如下所示&#xff1a; <dependency><groupId>com.example</groupI…...

Spring Boot打出的jar包为什么可以独立运行

闲来无事&#xff0c;浏览网页看到有人说jar包为什么可以独立运行&#xff0c;想起前端时间写的jar打包后无法正常运行处理。jar解压缩后有多个文件夹&#xff0c;内部存放运行所需jar包和一些配置文件&#xff0c;本文做一个简单介绍。 JAR包和WAR包区别 在Java开发中&#…...

“微软蓝屏”事件:网络安全与稳定性的深刻反思

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…...

【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位

目前项目当中使用的Nacos版本为2.0.2&#xff0c;该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题&#xff0c;尤其是对于像Nacos这样的服务发现与配置管理平台&#xff0c;它在微服务架构中扮演着核心角色。随着新版本的发布&#xff0c;开发团队会修复已知的…...

[题解]CF1401E.Divide Square(codeforces 05)

题目描述 There is a square of size 106106106106 on the coordinate plane with four points (0,0)(0,0) , (0,106)(0,106) , (106,0)(106,0) , and (106,106)(106,106) as its vertices. You are going to draw segments on the plane. All segments are either horizonta…...

软考高级第四版备考--第32天(新一代信息技术及应用)

1、物联网 1.1技术基础 1.1.1感知层&#xff1a;由各种传感器构成&#xff0c;包括温度传感器&#xff0c;二维码标签、RFID标签和读写器&#xff0c;摄像头&#xff0c;GPS等感知终端。感知层是物联网识别物体、采集信息的来源。 1.1.2网络层&#xff1a;由各种网络&#x…...

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…...

【MySQL是怎样运行的 | 第二篇】MySQL三大日志文件

文章目录 2.MySQL三大日志文件2.1日志文件列表2.1.1 redo log2.1.2 bin log2.1.3 undo log 2.2redo log日志详讲2.3 binglog和redo log有什么区别&#xff1f;2.4一条更新语句的执行过程 2.MySQL三大日志文件 2.1日志文件列表 redo log&#xff1a;重做日志&#xff0c;记录了…...

视图、存储过程、触发器

一、视图 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基 本表不同&#xff0c;是一个虚表&#xff0c;视图只能用来从查询&#xff0c;不能做增删改(虚拟的表) 1.创建视图 创建视图的语法&#xff1a; create view 视图名【view_xxx / v_xxx】 a…...

【学习笔记】解决Serial Communication Library编译问题

【学习笔记】解决编译 Serial Communication Library 时的 Catkin 依赖问题 Serial Communication Library 是一个用 C 编写的用于连接类似 rs-232 串口的跨平台库。它提供了一个现代的 C 接口&#xff0c;它的工作流程设计在外观和感觉上与 PySerial 相似&#xff0c;但串口速…...

在 Windows 环境下实现负载均衡:提升系统性能与可靠性的关键技术

Windows 环境下的负载均衡&#xff1a;提升系统性能与可靠性的关键技术 负载均衡&#xff08;Load Balancing&#xff09;是现代网络架构中不可或缺的一部分&#xff0c;通过将请求分配到多台服务器上来提高系统的性能和可靠性。本文将介绍在 Windows 环境下使用负载均衡的基本…...

【Linux】-----工具篇(自动化构建工具make/makefile)

目录 前言 一、是什么&#xff1f; 二、怎么样的&#xff1f; 三、原理及细节 图解代码 细节1&#xff1a;make工作规则 ①依赖文件存在 ②依赖文件不存在 ③依赖文件列表为空(特殊) .PHONY关键字 细节2&#xff1a;makefile识别程序需要重新编译&#xff1f; 四、…...

图的遍历:深度优先搜索(DFS)

引言 图遍历是指按照一定的顺序访问图中的每个顶点。遍历图的两种主要方法是深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;和广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;。本文将详细介绍深度优先搜索的定义、算法及其实现。 深度优先搜…...

普元EOS学习笔记-某些版本的EOS提供的maven获取依赖失败的问题解决

前言 普元EOS的开发包中&#xff0c;提供了maven&#xff0c;因为EOS项目的某些依赖只能从普元官方仓库获取&#xff0c;因此&#xff0c;编译EOS项目必须使用EOS提供的maven。 maven拉取依赖失败 某些版本的EOS提供的maven在编译EOS项目的时候会出现拉取失败的现象。 [FATA…...

Pycharm + Pyside6

1. 使用 Qt designer 创建 UI 文件 2. 使用 UIC 工具生成 ui_.py 文件 3. 自定义类导入ui.py 文件的窗口类 4.自定义窗口继承UI窗体类 5. self.setupUi(self) from PySide6.QtWidgets import QApplication, QWidget, QComboBox, QVBoxLayout from ui_test import Ui_Formc…...

强化学习之价值迭代算法动态规划求解悬崖漫步环境(CliffWalking)最优策略及最优状态价值函数

class CliffWalkingEnv:def __init__(self,ncol12,nrow4):self.ncolncol#定义网格世界的列self.nrownrow#定义网格世界的行self.Pself.createP()#转移矩阵P[state][action][(p,next_state,reward,done)]包含下一个状态和奖励def createP(self):P[[[]for i in range(4)]for j in…...

javascript deriveKey和deriveBits()由主密钥派生出新的密钥进行加密

deriveKey 方法的完整示例&#xff0c;演示如何使用 HMAC 作为密钥派生函数&#xff08;KDF&#xff09;来从一个给定的秘密&#xff08;如密码&#xff09;派生出一个新的 AES 加密密钥。 //创建一个函数来生成随机盐function getRandomSalt(length){let arraynew Uint8Array…...

基于微信小程序的自习室选座系统/基于Java的自习室选座系统/自习室管理系统的设计与实现

获取源码联系方式请查看文章结尾&#x1f345; 摘要 自习室选座是学校针对用户必不可少的一个部分。在学校的整个过程中&#xff0c;学生担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类微信小程序自习室选座也在不断改进。本课题所设计的小程序自习室选座系…...

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…...

Skyeye云智能制造企业版源代码全部开放

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…...

Springboot 整合Elasticsearch

1 java操作ES方式 1.1 操作ES 9300端口(TCP) 但开发中不在9300进行操作 ES集群节点通信使用的也是9300端口如果通过9300操作ES&#xff0c;需要与ES建立长连接 可通过引入spring-data-elasticsearch:transport-api.jar不在9300操作原因&#xff1a;1.springboot版本不同&…...

WeNet环境配置与aishell模型训练

WeNet环境配置与aishell模型训练 1环境配置 踩坑记录&#xff1a; 系统使用win11&#xff0c;我根据wenet官方文档&#xff0c;使用conda虚拟环境安装了cuda12.1&#xff0c;安装wenet依赖库&#xff0c;其中deepspeed报错&#xff0c;根据报错信息查询github&#xff0c;发现…...

【C++的剃刀】我不允许你还不会AVL树

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 Hello,这里是kiki&#xff0c;今天继续更新C部分&#xff0c;我们继续来扩充我们的知识面&#xff0c;我希望能努力把抽象繁多的知识讲的生动又通俗易懂&#xff0c;今天要…...

React搭建Vite项目及各种项目配置

1. 创建Vite项目 在操作系统的命令终端&#xff0c;输入以下命令&#xff1a; yarn create vite 输入完成以后输入项目名称、选择开发框架&#xff0c;选择开发语言&#xff0c;如下图所示&#xff0c;即可完成项目创建。 注意事项&#xff1a; 1. Node版本必须符合要求&…...

Linux Vim教程:多文件编辑与窗口管理

目录 1. 多文件编辑基础 1.1 缓冲区管理 1.2 标签页管理 1.3 分屏管理 2. 多文件编辑的高级技巧 2.1 同时编辑多个文件 2.2 使用会话 2.3 使用寄存器 3. 窗口管理的实用技巧 3.1 窗口调整 3.2 窗口排列 3.3 快速切换 4. 使用插件增强多文件编辑与窗口管理 4.1 NE…...

C语言进阶 11.结构体

C语言进阶 11.结构体 文章目录 C语言进阶 11.结构体11.1. 枚举11.2. 结构类型11.3. 结构与函数11.4. 结构中的结构11.5. 类型定义11.6. 联合11.7. PAT11-0. 平面向量加法(10)11-1. 通讯录的录入与显示(10) 11.1. 枚举 常量符号化: 用符号而不是具体的数字表示程序中的数字 cons…...

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…...

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…...

记录:vite打包报错 error during build: Error: Parse error @:1:1

vant从3升级到4后&#xff0c;本地运行没问题&#xff0c; 但是打包就会报如下错误&#xff1a;error during build: Error: Parse error :1:1 一直以为是vant的问题&#xff0c;各种升级&#xff0c;替换插件&#xff0c;发现没什么用&#xff0c; 网上搜索了下&#xff0c;…...

Python 消费Kafka手动提交 批量存入Elasticsearch

一、第三方包选择 pip install kafka&#xff0c;对比了kafka和pykafka&#xff0c;还是选择kafka&#xff0c;消费速度更快pip install elasticsearch7.12.0(ES版本) 二、创建es连接对象 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulkc…...

oracle 基础知识表的主键

一、表的约束条件 •约束条件是施加在表的字段上的一组限制条件&#xff0c;它使得只有符合限制条件要求的数据才能输入表。 •保证了表中的数据的正确性 i.约束条件包括了&#xff1a;非空和唯一和核对&#xff0c;即not null 和unique 和check null的含义:不确定 3个人去捡苹…...

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…...

Unity Apple Vision Pro 开发:如何把 PolySpatial 和 Play To Device 的版本从 1.2.3 升级为 1.3.1

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 本教程将介绍如何把 Unity 的 PolySpatial 和 Play To Device 版本从 1.2.3 升级为 1.3.1。 &#x1f4d5;Play To Device 软件升级 ht…...

大数据时代,区块链是如何助力数据开放共享的?

在大数据时代&#xff0c;区块链技术以其独特的优势&#xff0c;为数据开放共享提供了强有力的支持。以下是区块链助力数据开放共享的几个主要方面&#xff1a; 1. 增强数据安全性与隐私保护 加密安全&#xff1a;区块链技术采用先进的加密算法&#xff0c;如国密非对称加密技…...

睿抗2024省赛----RC-u4 章鱼图的判断

题目 对于无向图 G(V,E)&#xff0c;我们将有且只有一个环的、大于 2 个顶点的无向连通图称之为章鱼图&#xff0c;因为其形状像是一个环&#xff08;身体&#xff09;带着若干个树&#xff08;触手&#xff09;&#xff0c;故得名。 给定一个无向图&#xff0c;请你判断是不…...

py2exe,一个神奇的 Python 库

在众多Python打包工具中&#xff0c;py2exe无疑是一款出色的选择。它能够将Python脚本转换成可在Windows平台上独立运行的可执行文件&#xff0c;极大地方便了程序的分发与部署。本文将深入探讨py2exe的特性和使用方法&#xff0c;让你在创建桌面应用程序时更加游刃有余。 安装…...

博途PLC网络连接不上

博途PLC网络连接不上其中的一个原因就是网线接触不好&#xff0c;各种原因都试了&#xff0c;任然连接不上&#xff0c;大家可以把网线拔下&#xff0c;重新插拔或者直接更换一根网线。 1、无线网络网段和PLC连接网段冲突 。。。。...

哪个邮箱最安全最好用啊

企业邮箱安全至关重要&#xff0c;需保护隐私、防财务损失、维护通信安全、避免纠纷&#xff0c;并维持业务连续性。哪个企业邮箱最安全好用呢&#xff1f;Zoho企业邮箱&#xff0c;采用加密技术、反垃圾邮件和病毒保护&#xff0c;支持多因素认证&#xff0c;确保数据安全合规…...

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…...

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris 持续加深与数据湖的融合&#xff0c;已演进出一套成熟…...

Inno setup pascal编码下如何美化安装界面支持带边框,圆角,透明阴影窗口

inno setup自带的安装界面太老套了&#xff0c;如何实现类似网易&#xff0c;微信那种带界面的安装&#xff1f;一般有两种思路&#xff1a;提供一个单独的下载器&#xff0c;然后通过下载器将你用innosetup 打包后的软件下载下来&#xff0c;然后&#xff0c;静默安装这个包&a…...

SQL语句(以MySQL为例)——单表、多表查询

笛卡尔积&#xff08;或交叉连接&#xff09;: 笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y&#xff0c;那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合&#xff0c;也就是第一个对象来自于 X&#xff0c;第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中…...

C++第二十八弹---进一步理解模板:特化和分离编译

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3. …...

正则表达式的独占模式,懒惰模式等有那些区别

正则表达式的独占模式、懒惰模式&#xff08;也称为非贪婪模式&#xff09;和贪婪模式&#xff08;默认模式&#xff09;在匹配行为上存在显著的区别。以下是这三种模式的详细解释和区别&#xff1a; 1、贪婪模式&#xff08;Greedy&#xff09;&#xff1a; 默认情况下&…...