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

入门OpenTelemetry——应用自动埋点

埋点

什么是埋点

埋点,本质就是在你的应用程序里,在重要位置插入采集代码,比如:

  • 收集请求开始和结束的时间
  • 收集数据库查询时间
  • 收集函数调用链路信息
  • 收集异常信息

这些埋点数据(Trace、Metrics、Logs)被收集起来后,可以在监控平台看到系统运行时的真实表现,帮助你做:

  • 性能分析
  • 故障排查
  • 调用链路追踪

简单说就是:“在合适的地方插追踪/监控代码”。

要使用 OpenTelemetry 检测应用程序,可以前往访问 OpenTelemetry 存储库,选择适用于的应用程序的语言,然后按照说明进行操作。具体可以参考文档:https://opentelemetry.opendocs.io/docs/getting-started/dev/

自动埋点

使用自动埋点是一个很好的方式,因为它简单、容易,不需要进行很多代码更改。

如果你没有必要的知识(或时间)来创建适合你应用程序量身的追踪代码,那么这种方法就非常合适。

OpenTelemetry 支持自动化埋点的语言:

  • .net
  • Java
  • JavaScript
  • PHP
  • Python

手动检测

手动检测是指为应用程序编写特定的埋点代码。这是向应用程序添加可观测性代码的过程。这样做可以更有效地满足你的需求,因为可以自己添加属性和事件。这样做的缺点是需要导入库并自己完成所有工作。

埋点方式对比

手动埋点(Manual Instrumentation)自动埋点(Automatic Instrumentation)
定义程序员自己在代码里显式写下采集逻辑借助 SDK/Agent 自动拦截应用,无需修改业务代码
实现方式引用 OpenTelemetry API,比如创建 Tracer,手动打 span安装一个 Agent(Java agent、Python instrumentation)自动检测框架和库,插入追踪
控制力度非常高,想怎么打点都可以较低,受限于 Agent 支持的范围
开发成本高,需要自己判断哪里要加埋点低,几乎开箱即用
支持范围业务逻辑细粒度打点,比如特定函数、算法内部框架级打点,比如 HTTP 请求、数据库访问、消息队列消费
性能影响可控,看你打点多少可能稍高,因为 Agent 会 Hook 很多地方
典型场景需要追踪复杂业务逻辑快速上线链路追踪,不想改代码

k8s 应用自动埋点步骤

  • 部署 OpenTelemetry Operator:它帮你管理 InstrumentationOpenTelemetryCollector,实现自动注入、自动采集功能。
  • 部署 OpenTelemetryCollector:用来接收自动埋点产生的数据,比如 traces。
  • 定义 Instrumentation 对象:声明“我想要给哪些应用自动打点”(比如 Java 的 agent),并指定用哪个 Collector
  • 给你的 Pod 加上 Annotation:Operator 会根据 Annotation 自动注入 Agent 和 Sidecar。

自动埋点配置详解

配置示例

apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:name: <name>namespace: <namespace>
spec:exporter:                     # 导出目标配置endpoint: <string>          # 指定导出的地址,通常是 OpenTelemetry Collector 的 OTLP 接收端口tls:											  # 是否使用非加密连接(跳过 TLS)insecure: <bool>          # 跳过 TLS 校验,默认 falseinsecureSkipVerify: <bool>propagators:								  # 上下文传播协议,如果是跨服务追踪,一定要所有服务使用同一传播协议- tracecontext              # W3C Trace Context 标准(推荐)- baggage                   #	W3C Baggage(支持传递 key-value)- b3                        #	B3 single-header(Zipkin 风格)- b3multi                   # B3 multi-header- jaeger                    # Jaeger 原生格式sampler:									  	# 采样器配置type: <sampler_type>argument: <string>        resource:											# 资源标签,可选配置attributes:service.name: <string>      # 用于区分不同服务service.namespace: <string> # 服务所属 namespaceservice.version: <string>   # 服务版本env:												  	# 全局环境变量- name: OTEL_FOOvalue: "bar"             

采样器配置

采样器配置如下:

类型含义是否支持 argument
always_on全部采样
always_off全部不采样
traceidratio指定比例采样是(如 "0.25"
parentbased_traceidratio如果上游有 trace,继承上游;否则按照比例采样
parentbased_always_on如果上游有 trace,继承;否则全部采样
parentbased_always_off如果上游有 trace,继承;否则不采样

argument 字段通常是小数,表示采样概率,如 "1" 表示 100%,"0.5" 表示 50%。

其他配置

其他配置可通过环境变量方式注入,具体配置项可参考文档:

https://opentelemetry.io/docs/languages/sdk-configuration/

部署示例应用

部署 java 应用

这里我们将使用一个名为 Petclinic 的 Java 应用程序,这是一个使用 Maven 或 Gradle 构建的 Spring Boot 应用程序。该应用程序将使用 OpenTelemetry 生成数据。

Petclinic 示例项目地址:https://github.com/spring-projects/spring-petclinic

apiVersion: apps/v1
kind: Deployment
metadata:name: java-demo
spec:selector:matchLabels:app: java-demotemplate:metadata:labels:app: java-demospec:containers:- name: java-demoimage: contrastsecuritydemo/spring-petclinic:1.5.1imagePullPolicy: IfNotPresentresources:limits:memory: "500Mi"cpu: "200m"ports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: java-demo
spec:selector:app: java-demoports:- port: 8080targetPort: 8080
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:name: java-demo
spec:entryPoints:- webroutes:- match: Host(`java-demo.cuiliangblog.cn`)kind: Ruleservices:- name: java-demoport: 8080

部署完成后通过域名访问验证。

部署 python 应用

这里我们将使用一个名为 python-demoapp 的 python 应用程序,这是一个使用 flask 构建的 web 应用程序。该应用程序将使用 OpenTelemetry 生成数据。

项目地址:https://github.com/benc-uk/python-demoapp

apiVersion: apps/v1
kind: Deployment
metadata:name: python-demo
spec:selector:matchLabels:app: python-demotemplate:metadata:labels:app: python-demospec:containers:- name: python-demoimage: ghcr.io/benc-uk/python-demoapp:latestimagePullPolicy: IfNotPresentresources:limits:memory: "500Mi"cpu: "200m"ports:- containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:name: python-demo
spec:selector:app: python-demoports:- port: 5000targetPort: 5000
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:name: python-demo
spec:entryPoints:- webroutes:- match: Host(`python-demo.local.com`)kind: Ruleservices:- name: python-demoport: 5000

接下来通过域名访问应用

应用埋点

java 应用自动埋点

对于 Java 应用,我们可以通过下载 OpenTelemetry 提供的 opentelemetry-javaagent 这个 jar 包来使用 OpenTelemetry 自动检测应用程序。

opentelemetry-javaagent 地址:https://github.com/open-telemetry/opentelemetry-java-instrumentation

只需要将这个 jar 包添加到应用程序的启动命令中即可,比如:

java -javaagent:opentelemetry-javaagent.jar -jar target/*.jar

Java 自动检测使用可附加到任何 Java 8+ 应用程序的 Java 代理 JAR。它动态注入字节码以从许多流行的库和框架捕获遥测数据。它可用于捕获应用程序或服务“边缘”的遥测数据,例如入站请求、出站 HTTP 调用、数据库调用等。通过运行以上命令,我们可以对应用程序进行插桩,并生成链路数据,而对我们的应用程序没有任何修改。
尤其是在 Kubernetes 环境中,我们可以使用 OpenTelemetry Operator 来注入和配置 OpenTelemetry 自动检测库,这样连 javaagent 我们都不需要去手动注入了。
接下来为 Java 应用程序添加一个 Instrumentation 资源。

apiVersion: opentelemetry.io/v1alpha1    
kind: Instrumentation                     # 声明资源类型为 Instrumentation(用于语言自动注入)
metadata:name: java-instrumentation              # Instrumentation 资源的名称(可以被 Deployment 等引用)namespace: opentelemetry
spec:propagators:                            # 指定用于 trace 上下文传播的方式,支持多种格式- tracecontext                        # W3C Trace Context(最通用的跨服务追踪格式)- baggage                             # 传播用户定义的上下文键值对- b3                                  # Zipkin 的 B3 header(用于兼容 Zipkin 环境)sampler:                                # 定义采样策略(决定是否收集 trace)type: always_on                       # 始终采样所有请求(适合测试或调试环境)java:# image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest# 使用的 Java 自动注入 agent 镜像地址image:  harbor.cuiliangblog.cn/otel/autoinstrumentation-java:latestenv:- name: OTEL_EXPORTER_OTLP_ENDPOINTvalue: http://center-collector.opentelemetry.svc:4318

为了启用自动检测,我们需要更新部署文件并向其添加注解。这样我们可以告诉 OpenTelemetry Operator 将 sidecar 和 java-instrumentation 注入到我们的应用程序中。修改 Deployment 配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: java-demo
spec:selector:matchLabels:app: java-demotemplate:metadata:labels:app: java-demoannotations:instrumentation.opentelemetry.io/inject-java: "opentelemetry/java-instrumentation" # 填写 Instrumentation 资源的名称sidecar.opentelemetry.io/inject: "opentelemetry/sidecar" # 注入一个 sidecar 模式的 OpenTelemetry Collectorspec:containers:- name: java-demoimage: contrastsecuritydemo/spring-petclinic:1.5.1imagePullPolicy: IfNotPresentresources:limits:memory: "500Mi"cpu: "200m"ports:- containerPort: 8080

接下来更新 deployment,然后查看资源信息,java-demo 容器已经变为两个。

# kubectl get pod
NAME                        READY   STATUS    RESTARTS      AGE
java-demo-557fff6b7c-x8tjg  2/2     Running   0               3m6s
# kubectl get opentelemetrycollectors -A                 
NAMESPACE       NAME      MODE         VERSION   READY   AGE   IMAGE                                                                                     MANAGEMENT
default         sidecar   sidecar      0.123.1           39m                                                                                             managed
opentelemetry   simple    deployment   0.123.1   1/1     39m   ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector:0.123.1   managed
# kubectl get instrumentations -A                 
NAMESPACE       NAME                   AGE   ENDPOINT   SAMPLER     SAMPLER ARG
opentelemetry   java-instrumentation   39m              always_on 

查看 sidecar日志,已正常启动并发送 spans 数据

# kubectl logs java-demo-557fff6b7c-x8tjg -c otc-container
2025-04-23T08:56:32.664Z        info    grpc@v1.71.0/server.go:690      [core] [Server #3]Server created        {"grpc_log": true}
2025-04-23T08:56:32.669Z        info    otlpreceiver@v0.123.0/otlp.go:116       Starting GRPC server    {"endpoint": "0.0.0.0:4317"}
2025-04-23T08:56:32.670Z        info    otlpreceiver@v0.123.0/otlp.go:173       Starting HTTP server    {"endpoint": "0.0.0.0:4318"}
2025-04-23T08:56:32.670Z        info    service@v0.123.0/service.go:287 Everything is ready. Begin running and processing data.
2025-04-23T08:56:32.670Z        info    grpc@v1.71.0/server.go:886      [core] [Server #3 ListenSocket #4]ListenSocket created     {"grpc_log": true}
2025-04-23T08:56:32.686Z        info    grpc@v1.71.0/clientconn.go:1224 [core] [Channel #1 SubChannel #2]Subchannel Connectivity change to READY   {"grpc_log": true}
2025-04-23T08:56:32.686Z        info    pickfirst/pickfirst.go:184      [pick-first-lb] [pick-first-lb 0xc000ab7530] Received SubConn state update: 0xc0008b6550, {ConnectivityState:READY ConnectionError:<nil> connectedAddress:{Addr:simple-collector.opentelemetry.svc:4317 ServerName:simple-collector.opentelemetry.svc:4317 Attributes:<nil> BalancerAttributes:<nil> Metadata:<nil>}}    {"grpc_log": true}
2025-04-23T08:56:32.686Z        info    grpc@v1.71.0/clientconn.go:563  [core] [Channel #1]Channel Connectivity change to READY    {"grpc_log": true}
2025-04-23T08:57:26.022Z        info    Traces  {"resource spans": 1, "spans": 72}
2025-04-23T08:57:36.027Z        info    Traces  {"resource spans": 1, "spans": 4}

查看collector 日志,已经收到 traces 数据

# kubectl logs -n opentelemetry simple-collector-5b5699b46f-qgdw6
2025-04-23T07:28:27.220Z        info    service@v0.123.0/service.go:197 Setting up own telemetry...
2025-04-23T07:28:27.220Z        info    builders/builders.go:26 Development component. May change in the future.
2025-04-23T07:28:27.223Z        info    memorylimiter@v0.123.0/memorylimiter.go:148     Using percentage memory limiter    {"total_memory_mib": 7914, "limit_percentage": 75, "spike_limit_percentage": 15}
2025-04-23T07:28:27.223Z        info    memorylimiter@v0.123.0/memorylimiter.go:74      Memory limiter configured {"limit_mib": 5935, "spike_limit_mib": 1187, "check_interval": 1}
2025-04-23T07:28:27.270Z        info    service@v0.123.0/service.go:264 Starting otelcol...     {"Version": "0.123.1", "NumCPU": 4}
2025-04-23T07:28:27.270Z        info    extensions/extensions.go:41     Starting extensions...
2025-04-23T07:28:27.271Z        info    otlpreceiver@v0.123.0/otlp.go:116       Starting GRPC server    {"endpoint": "0.0.0.0:4317"}
2025-04-23T07:28:27.271Z        info    otlpreceiver@v0.123.0/otlp.go:173       Starting HTTP server    {"endpoint": "0.0.0.0:4318"}
2025-04-23T07:28:27.272Z        info    service@v0.123.0/service.go:287 Everything is ready. Begin running and processing data.
2025-04-23T08:57:26.022Z        info    Traces  {"resource spans": 1, "spans": 72}
2025-04-23T08:57:36.027Z        info    Traces  {"resource spans": 1, "spans": 4}

python 应用自动埋点

与 java 应用类似,python 应用同样也支持自动埋点, OpenTelemetry 提供了 opentelemetry-instrument CLI 工具,在启动 Python 应用时通过 sitecustomize 或环境变量注入自动 instrumentation。

我们先创建一个java-instrumentation 资源

apiVersion: opentelemetry.io/v1alpha1    
kind: Instrumentation                     # 声明资源类型为 Instrumentation(用于语言自动注入)
metadata:name: python-instrumentation              # Instrumentation 资源的名称(可以被 Deployment 等引用)namespace: opentelemetry
spec:propagators:                            # 指定用于 trace 上下文传播的方式,支持多种格式- tracecontext                        # W3C Trace Context(最通用的跨服务追踪格式)- baggage                             # 传播用户定义的上下文键值对- b3                                  # Zipkin 的 B3 header(用于兼容 Zipkin 环境)sampler:                                # 定义采样策略(决定是否收集 trace)type: always_on                       # 始终采样所有请求(适合测试或调试环境)python:image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-python:latestenv:                                  - name: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED # 启用日志的自动检测value: "true"- name: OTEL_PYTHON_LOG_CORRELATION # 在日志中启用跟踪上下文注入value: "true"- name: OTEL_EXPORTER_OTLP_ENDPOINTvalue: http://center-collector.opentelemetry.svc:4318

然后更新 deployment 资源清单,添加注解

apiVersion: apps/v1
kind: Deployment
metadata:name: python-demo
spec:selector:matchLabels:app: python-demotemplate:metadata:labels:app: python-demoannotations:instrumentation.opentelemetry.io/inject-python: "opentelemetry/python-instrumentation" # 填写 Instrumentation 资源的名称sidecar.opentelemetry.io/inject: "opentelemetry/sidecar" # 注入一个 sidecar 模式的 OpenTelemetry Collector……

接下来观察日志既可。

查看更多

崔亮的博客-专注devops自动化运维,传播优秀it运维技术文章。更多原创运维开发相关文章,欢迎访问https://www.cuiliangblog.cn

相关文章:

入门OpenTelemetry——应用自动埋点

埋点 什么是埋点 埋点&#xff0c;本质就是在你的应用程序里&#xff0c;在重要位置插入采集代码&#xff0c;比如&#xff1a; 收集请求开始和结束的时间收集数据库查询时间收集函数调用链路信息收集异常信息 这些埋点数据&#xff08;Trace、Metrics、Logs&#xff09;被…...

C语言链表的操作

初学 初学C语言时&#xff0c;对于链表节点的定义一般是这样的&#xff1a; typedef struct node {int data;struct node *next; } Node; 向链表中添加节点&#xff1a; void addNode(Node **head, int data) {Node *newNode (Node*)malloc(sizeof(Node));newNode->dat…...

芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”

【开篇&#xff1a;设备——芯片工业的“剑与盾”】 当ASML的EUV光刻机以每秒5万次激光脉冲在硅片上雕刻出0.13nm精度的电路&#xff08;相当于在月球表面精准定位一枚二维码&#xff09;&#xff0c;当国产28nm光刻机在华虹产线实现“从0到1”的突破&#xff0c;这场精密制造…...

C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用

目录 一、const修饰指针 &#xff08;一&#xff09;const修饰变量 &#xff08;二&#xff09;const 修饰指针变量 二、野指针 &#xff08;一&#xff09;野指针成因 1、指针未初始化 2、指针越界访问 3、指针指向的空间释放 &#xff08;二&#xff09;如何规避野指…...

【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言常用的EditorGUILayout控件专栏推荐完结 前言 EditorG…...

Linux基础第三天

系统时间 date命令&#xff0c;date中文具有日期的含义&#xff0c;利用该命令可以查看或者修改Linux系统日期和时间。 基本格式如下&#xff1a; gecubuntu:~$ date gecubuntu:~$ date -s 日期时间 // -s选项可以设置日期和时间 文件权限 chmod命令&#xff0c;是英文…...

MoodDrop:打造一款温柔的心情打卡单页应用

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念&#xff1a;我想做一款温柔的情绪应用 「今天的你&#xff0c;心情如何&#xff1f;」 有时候&#x…...

接口——类比摄像

最近迷上了买相机&#xff0c;大疆Pocket、Insta Go3、大疆Mini3、佳能50D、vivo徕卡人像大师&#xff08;狗头&#xff09;&#xff0c;在买配件的时候&#xff0c;发现1/4螺口简直是神中之神&#xff0c;这个万能接口让我想到计算机设计中的接口&#xff0c;遂有此篇—— 接…...

【上位机——WPF】布局控件

布局控件 常用布局控件Panel基类Grid(网格)UniformGrid(均匀分布)StackPanel(堆积面板)WrapPanel(换行面板)DockerPanel(停靠面板)Canvas(画布布局)Border(边框)GridSplitter(分割窗口)常用布局控件 Grid:网格,根据自定义行和列来设置控件的布局StackPanel:栈式面板,包含的…...

深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用

深入解析Spring Boot与Kafka集成&#xff1a;构建高性能消息驱动应用 引言 在现代分布式系统中&#xff0c;消息队列是实现异步通信和解耦的重要组件。Apache Kafka作为一种高性能、分布式的消息系统&#xff0c;被广泛应用于大数据和实时数据处理场景。本文将详细介绍如何在…...

二十、案例特训专题3【系统设计篇】web架构设计

一、前言 二、内容提要 三、单机到应用与数据分离 四、集群与负载均衡 五、集群与有状态无状态服务 六、ORM 七、数据库读写分离 八、数据库缓存Memcache与Redis 九、Redis数据分片 哈希分片如果新增分片会很麻烦&#xff0c;需要把之前数据取出来再哈希除模 一致性哈希分片是…...

【数据结构与算法】ArrayList 与顺序表的实现

目录 一、List 接口 1.1 List 接口的简单介绍 1.1 常用方法 二、顺序表 2.1 线性表的介绍 2.2 顺序表的介绍 2.3 顺序表的实现 2.3.1 前置条件:自定义异常 2.3.2 顺序表的初始化 2.3.2 顺序表的实现 三、ArrayList 实现类 3.1 ArrayList 的两种使用方式 3.2 Array…...

处理金融数据,特别是股票指数数据,以计算和分析RSRS(相对强度指数)

Python脚本,用于处理金融数据,特别是股票指数数据,以计算和分析RSRS(相对强度指数)指标。以下是代码的逐部分解释: 1. **导入库**: - `pandas`:用于数据处理和CSV文件操作。 - `numpy`:用于数值计算。 - `ElasticNet`:来自`sklearn.linear_model`,用于线性…...

【图像处理基石】OpenCV中都有哪些图像增强的工具?

OpenCV 图像增强工具系统性介绍 OpenCV 提供了丰富的图像增强工具&#xff0c;主要分为以下几类&#xff1a; 亮度与对比度调整 线性变换&#xff08;亮度/对比度调整&#xff09;直方图均衡化自适应直方图均衡化&#xff08;CLAHE&#xff09; 滤波与平滑 高斯滤波中值滤波双…...

WPS PPT设置默认文本框

被一个模板折磨了好久&#xff0c;每次输入文本框都是很丑的24号粗体还有行标&#xff0c;非常恶心&#xff0c;我甚至不知道如何描述自己的问题&#xff0c;非常憋屈&#xff0c;后来终于知道怎么修改文本框了。这种软件操作问题甚至不知道如何描述问题本身&#xff0c;非常烦…...

PostGIS实现矢量数据转栅格数据【ST_AsRaster】

ST_AsRaster函数应用详解&#xff1a;将矢量数据转换为栅格数据 [文章目录] 一、函数概述 二、函数参数与分组说明 三、核心特性与注意事项 四、示例代码 五、应用场景 六、版本依赖 七、总结 一、函数概述 ST_AsRaster是PostGIS中用于将几何对象&#xff08;如点、线…...

FAST-DDS源码分析PDP(一)

准备开一个FAST-DDS源码分析系列&#xff0c;源码版本FAST-DDS 1.1.0版本。 FAST-DDS这种网络中间件是非常复杂的&#xff0c;所以前期先去分析每个类的作用是什么&#xff0c;然后在结合RTPS DOC&#xff0c;FAST-DDS DEMO,以及FAST-DDS的doc去串起来逻辑。 Builtin Discovery…...

python打卡day29@浙大疏锦行

知识点回顾 类的装饰器装饰器思想的进一步理解&#xff1a;外部修改、动态类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;对python这门工具的理解等&…...

【数据结构】2-3-1单链表的定义

数据结构知识点合集 知识点 单链表存储结构 优点&#xff1a;不要求大片连续空间&#xff0c;改变容量方便&#xff1b;缺点&#xff1a;不可随机存取&#xff0c;要耗费一定空间存放指针 /*单链表节点定义*/ typedef struct LNode{ElemType data;struct LNode *next; }LNo…...

贝塞尔曲线原理

文章目录 一、 低阶贝塞尔曲线1.一阶贝塞尔曲线2. 二阶贝塞尔曲线3. 三阶贝塞尔曲线 一、 低阶贝塞尔曲线 1.一阶贝塞尔曲线 如下图所示&#xff0c; P 0 ​ P_0​ P0​​, P 1 ​ P_1​ P1​​ 是平面中的两点&#xff0c;则 B ( t ) B ( t ) B(t) 代表平面中的一段线段。…...

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…...

创建型:原型模式

目录 1、核心思想 2、实现方式 2.1 基本结构 2.2 代码示例&#xff08;Java&#xff09; 3、适用场景 4、new与clone实际场景建议 1、核心思想 目的&#xff1a;通过复制&#xff08;克隆&#xff09;现有对象来创建新对象&#xff0c;而不是通过new关键字实例化。对于那…...

浅谈“量子计算应用:从基础原理到行业破局”

量子计算应用:从基础原理到行业破局 引言:量子计算为何成为科技革命新引擎? 量子计算利用量子力学原理(叠加态、纠缠态、量子干涉)突破经典计算的极限,在特定领域可实现指数级加速。根据中研普华预测,2025年全球量子计算市场规模将突破80亿美元,2035年可达8117亿美元。…...

Java面试攻略:从Spring Boot到微服务架构的深入探讨

Java面试攻略&#xff1a;从Spring Boot到微服务架构的深入探讨 场景设定 在一家知名互联网大厂的会议室里&#xff0c;资深面试官王老师正在对一位求职者谢飞机进行技术面试。谢飞机是一位幽默风趣的程序员&#xff0c;他的回答有时让人捧腹大笑。 第一轮&#xff1a;核心技…...

关于文件分片的介绍和应用

文件分片&#xff0c;顾名思义&#xff0c;就是将一个大文件分割成多个小的文件块&#xff08;chunk&#xff09;。每个文件块都是原始文件的一部分&#xff0c;并可以通过特定的方式将这些小文件块重新组装成原始文件。 1. 基本原理: 文件分片从底层来看&#xff0c;主要是对…...

Tapered Off-Policy REINFORCE_ 如何为LLM实现稳定高效的策略优化?

Tapered Off-Policy REINFORCE: 如何为LLM实现稳定高效的策略优化&#xff1f; 在大语言模型&#xff08;LLM&#xff09;的微调领域&#xff0c;强化学习&#xff08;RL&#xff09;正成为提升复杂任务性能的核心方法。本文聚焦于一篇突破性论文&#xff0c;其提出的Tapered …...

使用lvm进行磁盘分区

使用lvm进行磁盘分区 目的&#xff1a; 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提&#xff1a; /dev/vdb是一块干净的空磁盘&#xff0c;数据会被清空&#xff01;&#xff01;&#xff01; 1. 创建物理卷(PV)&#xff1a; pvcreate /dev/sdb2. 验证&#xf…...

[Java实战]Spring Boot整合Elasticsearch(二十六)

[Java实战]Spring Boot整合Elasticsearch&#xff08;二十六&#xff09; 摘要&#xff1a;本文通过完整的实战演示&#xff0c;详细讲解如何在Spring Boot项目中整合Elasticsearch&#xff0c;实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…...

图像分割(1)U-net

一、整体结构 虽然说是几年前的产品&#xff0c;但是现在还在用&#xff0c;因为深度学习很多时候越是简单的网络用起来效果越好&#xff0c;而且一般是目标比较小的时候产生的分割问题。u-net的优势就是网络结构简单&#xff0c;适合小目标分割&#xff0c;所以一直用到现在&a…...

数位和:从定义到编程实现

1. 定义 ​数位和​&#xff08;Digit Sum&#xff09;是指一个数的每一位数字相加的总和。例如&#xff1a; 123 的数位和&#xff1a;1 2 3 645 的数位和&#xff1a;4 5 9 2. 计算方法 计算数位和的通用步骤&#xff1a; ​提取每一位数字​&#xff1a;从右到左&…...