Harness 中的请求标识染色:端到端追踪
你有没有过这样的经历:用户反馈"我刚才下单失败了,你们能不能帮忙看看是啥问题"?如果是单体应用时代,你只要打开服务器的日志文件,搜一下用户ID或者订单号,1分钟就能定位到问题。但现在几乎所有互联网公司都用微服务架构,一个下单请求可能要经过网关、用户校验服务、订单服务、库存服务、支付服务、消息队列、缓存、数据库等十几个节点,每个节点都有自己的日志、监控数据。
Harness 中的请求标识染色:端到端追踪
关键词:Harness、请求标识染色、端到端追踪、分布式链路追踪、可观测性、上下文传递、微服务监控
摘要:本文以奶茶店订单流转的生活化类比为切入点,深入浅出讲解Harness平台中请求标识染色与端到端追踪的核心原理、技术实现与实战落地方法。我们会从微服务架构下的故障排查痛点出发,逐步拆解请求染色的核心概念、传播协议、生成算法,再通过完整的Spring Cloud微服务实战项目演示如何零代码改动接入Harness链路追踪,最后总结生产环境最佳实践、行业发展趋势与常见问题解决方案。全文兼顾技术深度与易用性,哪怕是没有分布式系统经验的初学者也能轻松掌握端到端追踪的核心逻辑。
背景介绍
问题背景
你有没有过这样的经历:用户反馈"我刚才下单失败了,你们能不能帮忙看看是啥问题"?如果是单体应用时代,你只要打开服务器的日志文件,搜一下用户ID或者订单号,1分钟就能定位到问题。但现在几乎所有互联网公司都用微服务架构,一个下单请求可能要经过网关、用户校验服务、订单服务、库存服务、支付服务、消息队列、缓存、数据库等十几个节点,每个节点都有自己的日志、监控数据。
以前你要排查这个问题,得先去网关找对应时间点的请求日志,拿到请求ID,再去订单服务搜这个ID,再去库存服务搜,再去支付服务搜,运气不好的话半小时都找不到问题根源。这就是分布式系统最大的痛点:请求链路碎片化,缺少全局唯一的标识串联整个流程。
Harness作为全球领先的软件交付与可观测性平台,推出的请求标识染色+端到端追踪功能,就是专门解决这个痛点的:就像给每个订单打一个唯一的取餐号,整个流转过程都带着这个号,你只要报号就能查到所有环节的信息。
目的和范围
本文将覆盖以下内容:
- 请求标识染色、端到端追踪的核心概念与底层原理
- Harness链路追踪的架构设计与技术实现逻辑
- 零代码改动接入Harness追踪的完整实战步骤
- 生产环境落地的最佳实践与常见坑点规避
- 端到端追踪的未来发展趋势与技术挑战
本文不涉及Harness平台其他CI/CD功能的讲解,聚焦于可观测性领域的链路追踪能力。
预期读者
- 后端开发工程师:需要排查分布式系统故障、优化接口性能
- SRE/运维工程师:负责系统监控、可观测性体系搭建
- 架构师:设计微服务架构的可观测性方案
- 产品/测试人员:需要复现用户问题、验证接口可用性
术语表
核心术语定义
| 术语 | 定义 |
|---|---|
| 请求标识染色 | 给每个进入系统的请求分配一个全局唯一的标识,这个标识会跟随请求流转到所有下游节点,相当于给请求打了一个独一无二的"标记" |
| 端到端追踪 | 基于请求的唯一标识,把请求从入口到最终响应的所有环节的耗时、状态、日志、参数等信息串联起来,形成完整的调用链路视图 |
| Trace | 一次完整的请求链路,对应一个唯一的TraceID |
| Span | 链路中的一个操作节点,比如一次HTTP调用、一次数据库查询,每个Span有唯一的SpanID和父SpanID |
| Baggage | 链路中传递的自定义业务字段,比如用户ID、订单号,用来实现按业务维度搜索链路 |
| Harness APM | Harness平台的应用性能监控模块,提供请求染色、链路追踪、性能分析等能力 |
缩略词列表
- APM:Application Performance Monitoring,应用性能监控
- OTel:OpenTelemetry,统一的可观测性标准
- W3C:万维网联盟,制定Trace Context传播标准
- eBPF:扩展伯克利包过滤器,实现无侵入式系统数据采集
核心概念与联系
故事引入
我们先来讲个奶茶店的故事,保证你听完就能懂所有核心概念:
你走进一家连锁奶茶店,点了一杯三分糖少冰的杨枝甘露,服务员给你打印了一张取餐码:8864,这个取餐码就是请求标识,给订单打码的过程就是染色。
接下来你的订单会流转到各个环节:
- 收银台录入订单,标记取餐码
8864,状态"已支付" - 茶饮师拿到订单,标记取餐码
8864,开始做茶,耗时2分钟 - 配料师拿到做好的茶,加芒果粒、西柚粒,标记取餐码
8864,耗时30秒 - 出餐员检查订单,叫号取餐,标记取餐码
8864,状态"已完成"
如果你等了10分钟还没拿到茶,去前台问,服务员只要输取餐码8864,就能看到订单卡在了配料环节,配料师刚才去上厕所了,马上给你做。这个查取餐码拿到整个订单流转信息的过程,就是端到端追踪。
如果这家奶茶店用的是Harness的管理系统,那这个系统就是Harness APM,自动帮你记录每个环节的信息,不用人工登记。
核心概念解释
我们把奶茶店的故事对应到技术概念上,小学生都能懂:
核心概念一:请求标识染色
就像奶茶店的取餐码,每个进入系统的请求都会被分配一个全局唯一、永远不会重复的字符串,这个字符串会跟着请求走到所有下游服务、中间件、数据库,就像给请求染了一个独一无二的颜色,走到哪都能认出来。
比如你打开淘宝首页,这个请求刚到阿里的网关,就会被分配一个TraceID:a1b2c3d4e5f6g7h8,接下来这个请求走到商品服务、推荐服务、广告服务、缓存、数据库,都会带着这个ID,所有日志、监控数据都会关联这个ID。
核心概念二:端到端追踪
就像你拿取餐码查订单流转信息,我们拿TraceID就能把整个请求的所有环节的信息都串起来:每个服务花了多少时间,哪个环节报错了,参数是什么,日志内容是什么,一目了然。
比如刚才的下单请求报错,你只要拿TraceID去Harness控制台一搜,就能看到整个链路:网关耗时10ms,订单服务耗时50ms,库存服务调用返回500错误,日志是"库存不足",10秒就能定位问题,不用去十几个服务翻日志。
核心概念三:Harness可观测性套件
就像奶茶店的订单管理系统,Harness提供了一整套开箱即用的链路追踪能力:
- 自动给请求生成唯一TraceID,不用你自己写代码生成
- 自动把TraceID传播到所有下游节点,不用你手动传请求头
- 自动收集每个节点的Span数据,包括耗时、状态、参数、日志
- 自动组装成完整的链路图,可视化展示整个请求流程
- 支持按业务字段(比如用户ID、订单号)搜索链路,不用记TraceID
核心概念之间的关系
三个概念是相辅相成的,缺了哪个都不行:
- 染色是追踪的基础:没有唯一的TraceID,就没法把分散在各个节点的请求数据串起来,就像奶茶店没有取餐码,你根本找不到你的订单。
- 追踪是染色的目的:给请求打标识不是为了好玩,是为了能快速排查问题、优化性能,就像给订单打取餐码是为了方便用户查单、门店管理订单。
- Harness是落地的载体:你完全可以自己实现请求染色和追踪,但要写大量的埋点代码、维护采集服务、存储系统、可视化界面,成本非常高,Harness把这些都做好了,你只要几行配置就能用。
我们用一个对比表看自己实现和用Harness的区别:
| 维度 | 自己基于OpenTelemetry实现 | Harness开箱即用 |
| — | — | — |
| 代码改动 | 需要手动埋点,每个服务都要改代码,老系统改造成本极高 | 零代码改动,只要加启动参数加载Agent,自动埋点 |
| 协议兼容性 | 需要自己适配HTTP、gRPC、MQ、数据库等各种协议的Trace传播 | 内置支持所有主流协议,自动传播TraceID |
| 存储成本 | 需要自己搭建Elasticsearch、Cassandra等存储集群,运维成本高 | Harness托管存储,不用自己运维,按使用量付费 |
| 功能完整性 | 只有基础的链路展示,没有智能分析、告警、业务维度聚合等功能 | 内置性能瓶颈分析、故障根因定位、自定义告警、业务链路统计等高级功能 |
| 性能开销 | 自己写的埋点容易有性能问题,优化难度大 | 官方优化的Agent,CPU开销低于3%,内存开销低于2%,几乎无影响 |
核心概念原理和架构的文本示意图
[用户请求] → [Harness Agent 生成TraceID+染色] → [网关服务 记录Span1 上报Harness]
↓
[TraceID跟着请求传到订单服务 记录Span2 上报Harness]
↓
[TraceID跟着请求传到库存服务 记录Span3 上报Harness]
↓
[TraceID跟着请求传到MySQL 记录Span4 上报Harness]
↓
[TraceID跟着请求传到Redis 记录Span5 上报Harness]
↓
[用户查询链路] ← [Harness后端组装所有Span形成完整链路] ← [Harness Collector接收所有Span数据]
Mermaid 架构图
Mermaid 执行流程图
核心算法原理 & 具体操作步骤
TraceID生成算法
TraceID必须保证全局唯一,不能重复,否则会把不同请求的链路混在一起。目前行业通用的是OpenTelemetry标准的128位随机数生成算法:
T r a c e I D = R a n d o m ( 2 128 ) TraceID = Random(2^{128}) TraceID=Random(2128)
这个算法生成的TraceID是32位的16进制字符串,总共有 3.4 × 10 38 3.4 \times 10^{38} 3.4×1038种可能,就算每秒生成10亿个TraceID,也要10^21年才会出现重复,概率可以忽略不计。
SpanID是64位随机数:
S p a n I D = R a n d o m ( 2 64 ) SpanID = Random(2^{64}) SpanID=Random(264)
16位16进制字符串,用来标识链路中的每个操作节点。
Python实现代码如下:
import secrets
from typing import Tuple
def generate_trace_id() -> str:
"""
生成符合OTel/W3C标准的128位TraceID
返回32位小写16进制字符串
"""
return secrets.token_hex(16)
def generate_span_id() -> str:
"""
生成符合OTel/W3C标准的64位SpanID
返回16位小写16进制字符串
"""
return secrets.token_hex(8)
def generate_trace_parent(trace_id: str, span_id: str, sampled: bool = True) -> str:
"""
生成W3C标准的traceparent请求头
格式:version-trace_id-span_id-flags
flags: 01表示采样 00表示不采样
"""
flags = "01" if sampled else "00"
return f"00-{trace_id}-{span_id}-{flags}"
# 测试
if __name__ == "__main__":
trace_id = generate_trace_id()
span_id = generate_span_id()
trace_parent = generate_trace_parent(trace_id, span_id)
print(f"生成的TraceID: {trace_id}")
print(f"生成的SpanID: {span_id}")
print(f"生成的traceparent头: {trace_parent}")
# 输出示例:
# 生成的TraceID: 4bf92f3577b34da6a3ce929d0e0e4736
# 生成的SpanID: 00f067aa0ba902b7
# 生成的traceparent头: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
传播协议标准
Harness采用W3C制定的Trace Context国际标准,通过两个HTTP请求头传递Trace信息:
traceparent:存储核心Trace信息,格式为version-trace_id-span_id-flagstracestate:存储厂商自定义的Trace信息,比如Harness的采样策略、租户ID等baggage:存储自定义业务染色字段,格式为key1=value1,key2=value2,可以传递用户ID、订单号等业务字段
所有主流协议都支持这种传递方式:
- HTTP/gRPC:放在请求头里
- Kafka/RocketMQ:放在消息头里
- Redis:放在客户端名称或者命令参数里
- MySQL/PostgreSQL:放在SQL注释或者客户端属性里
具体操作步骤
Harness实现请求染色和端到端追踪只需要4步,零业务代码改动:
步骤1:部署Harness Agent
Harness Agent是无侵入的埋点组件,不同语言的部署方式不同:
- Java:启动时加
-javaagent:harness-agent.jar参数,字节码注入自动埋点 - Go:导入Harness的SDK包,编译时自动插桩
- Python/Node.js:安装对应的依赖包,启动时自动加载
- 其他语言:都有对应的Agent或者SDK,官方文档有详细的接入指南
步骤2:配置基础参数
在服务的配置文件里添加Harness的基础配置,比如Spring Boot的application.yml:
harness:
apm:
enabled: true
api-key: "YOUR_HARNESS_ACCOUNT_API_KEY" # 从Harness控制台获取
service-name: "order-service" # 服务名称,用来区分不同服务
environment: "production" # 环境名称,区分测试/生产环境
cluster: "us-west-1" # 集群名称,可选
步骤3:配置染色规则
在Harness控制台配置自定义染色规则,比如:
- 所有请求路径匹配
/api/order/*的请求,自动把请求参数里的orderId加入Baggage - 所有请求头里有
X-User-ID的请求,自动把X-User-ID加入Baggage - 所有来自微信小程序的请求,自动把
X-App-Version加入Baggage
配置完成后,这些业务字段会自动跟着TraceID传递到所有下游节点,你可以直接在Harness控制台按这些字段搜索链路。
步骤4:配置传播规则
默认Harness已经支持所有主流协议的Trace传播,如果你有自定义的私有协议,可以配置传播规则:
harness:
apm:
tracing:
propagation:
enabled: true
custom-protocols:
- name: "my-custom-rpc"
header-names:
traceparent: "x-trace-parent"
tracestate: "x-trace-state"
baggage: "x-baggage"
配置完成后,自定义RPC协议也会自动传播Trace信息。
项目实战:Spring Cloud微服务接入Harness追踪
项目介绍
我们用一个极简的Spring Cloud微服务demo演示接入过程:
- 网关服务:
gateway-service,端口8080,请求入口 - 订单服务:
order-service,端口8081,创建订单 - 库存服务:
inventory-service,端口8082,扣减库存 - 依赖:MySQL 8.0、Redis 6.0、Kafka 2.8
开发环境搭建
- 注册Harness免费账号:https://app.harness.io/ ,免费版足够测试使用
- 获取API密钥:进入Harness控制台 → 账户设置 → API密钥 → 创建新的API密钥,复制保存
- 下载Harness Java Agent:https://docs.harness.io/category/apm-downloads ,下载最新版本的
harness-agent.jar,放到每个服务的根目录 - 启动本地MySQL、Redis、Kafka服务,创建对应的数据库和表
源代码实现
我们不需要改任何业务代码,只要修改每个服务的启动脚本和配置文件:
1. 网关服务配置
application.yml:
server:
port: 8080
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: order-service
uri: http://localhost:8081
predicates:
- Path=/api/order/**
harness:
apm:
enabled: true
api-key: "YOUR_HARNESS_API_KEY"
service-name: "gateway-service"
environment: "test"
tracing:
sampling-rate: 1.0 # 测试环境100%采样
baggage:
enabled: true
keys:
- X-User-ID
- X-Order-ID
启动脚本:
java -javaagent:harness-agent.jar -jar gateway-service.jar
2. 订单服务配置
application.yml:
server:
port: 8081
spring:
application:
name: order-service
datasource:
url: jdbc:mysql://localhost:3306/order_db
username: root
password: root
redis:
host: localhost
port: 6379
kafka:
bootstrap-servers: localhost:9092
harness:
apm:
enabled: true
api-key: "YOUR_HARNESS_API_KEY"
service-name: "order-service"
environment: "test"
启动脚本:
java -javaagent:harness-agent.jar -jar order-service.jar
3. 库存服务配置
application.yml:
server:
port: 8082
spring:
application:
name: inventory-service
datasource:
url: jdbc:mysql://localhost:3306/inventory_db
username: root
password: root
harness:
apm:
enabled: true
api-key: "YOUR_HARNESS_API_KEY"
service-name: "inventory-service"
environment: "test"
启动脚本:
java -javaagent:harness-agent.jar -jar inventory-service.jar
测试验证
- 启动三个服务,发送测试请求:
curl -H "X-User-ID: 123456" http://localhost:8080/api/order/create?productId=789&count=1
返回结果:
{"code":200,"msg":"success","data":{"orderId":"ORD123456789"}}
- 打开Harness控制台 → 服务管理 → 链路追踪,搜索
X-User-ID=123456或者X-Order-ID=ORD123456789,就能看到完整的链路:
总耗时:234ms
├─ gateway-service GET /api/order/create 耗时10ms 状态200
├─ order-service POST /createOrder 耗时100ms 状态200
│ ├─ MySQL INSERT INTO order_table 耗时20ms
│ ├─ Redis SET order:ORD123456789 耗时5ms
│ └─ inventory-service POST /deduct 耗时60ms 状态200
│ └─ MySQL UPDATE inventory SET count = count -1 耗时15ms
└─ Kafka SEND order_created 耗时14ms
每个节点都可以点进去看详细的日志、参数、错误信息,如果请求报错,直接就能看到哪个环节出了问题。
代码解读与分析
整个过程我们没有改一行业务代码,只是加了启动参数和配置,就实现了完整的端到端追踪,这就是Harness的优势:
- Agent通过字节码注入自动拦截所有请求、数据库调用、缓存调用、MQ调用,不用手动埋点
- 自动传播TraceID到所有下游节点,不用手动写代码传递请求头
- 自动收集所有Span数据上报到Harness后端,不用自己搭建采集和存储系统
实际应用场景
1. 故障快速排查
这是最常用的场景:用户反馈问题,只要拿用户ID、订单号或者手机号,去Harness控制台一搜,就能找到对应的链路,直接看到哪个环节报错,错误信息是什么,以前半小时才能定位的问题,现在10秒就能解决。
比如用户反馈下单失败,搜订单号发现库存服务返回500错误,日志是"商品库存不足",直接就能告诉用户这个商品没货了,不用再去查各个服务的日志。
2. 性能瓶颈优化
如果你的接口耗时很长,只要看链路图里哪个节点耗时占比最高,重点优化那个节点就行。比如下单接口总耗时2秒,链路里显示库存服务耗时1.5秒,那你只要优化库存服务的逻辑,比如加缓存、优化SQL,就能把整体耗时降到500ms。
Harness还会自动分析性能瓶颈,告诉你哪个接口慢、哪个SQL慢、哪个缓存命中率低,给你优化建议。
3. 业务链路统计
你可以按Baggage里的业务字段统计链路数据,比如:
- 统计来自iOS和Android的请求的平均耗时、错误率
- 统计不同用户等级的请求的性能差异
- 统计不同订单金额的请求的链路分布
这些数据可以帮助你做业务决策,比如给VIP用户分配更多的资源,优化高频业务的性能。
4. 合规审计
对于金融、政务等对合规要求高的行业,端到端追踪可以实现操作的全链路审计:所有敏感操作的请求都能追溯,每个环节谁操作的、做了什么、什么时候做的,都有完整的记录,符合等保2.0的要求。
最佳实践Tips
- 不要用业务ID当TraceID:业务ID可能重复,比如订单号重试的时候可能会生成一样的,TraceID一定要用全局唯一的随机数,业务ID可以放到Baggage里。
- 异步场景手动传递TraceID:线程池、定时任务、MQ消费者这些异步场景,TraceID会从父线程传到子线程,但是如果你自己创建了新的线程,要手动传递TraceID,Harness提供了工具类:
// Java示例
TraceContext traceContext = TraceContext.current();
executor.submit(() -> {
try (TraceScope scope = traceContext.makeCurrent()) {
// 业务逻辑,TraceID自动传递
}
});
- Baggage字段不要太多太长:Baggage里的字段会增加请求头的大小,建议控制在10个以内,每个字段的长度不要超过128字节,敏感字段不要放Baggage里,必须放的话要加密。
- 生产环境不要开100%采样:流量大的系统100%采样会产生大量的数据,存储成本很高,建议用Harness的尾部采样:异常请求、耗时超过阈值的请求100%采样,正常请求按10%的比例采样,既不会漏故障,又能降低成本。
- 配置链路告警:在Harness控制台配置告警规则,比如链路错误率超过1%、平均耗时超过1秒的时候自动发告警,告警信息里会直接带上TraceID,点击就能跳转到链路详情页,不用再去查。
行业发展与未来趋势
我们用一个表格看端到端追踪的发展历史:
| 时间 | 阶段 | 核心技术 | 特点 |
|---|---|---|---|
| 2010年以前 | 萌芽期 | 自定义日志埋点 | 每个公司自己实现,没有统一标准,维护成本极高,只有大厂能做 |
| 2010-2015年 | 发展期 | Google Dapper、Twitter Zipkin、阿里鹰眼 | 大厂开源实现,有了基础的链路追踪能力,但是协议不统一,跨厂商无法互通,需要自己搭建运维 |
| 2015-2020年 | 标准化期 | OpenTracing、OpenCensus、W3C Trace Context | 开始有统一的标准,但是多个标准并存,用户选择困难,还是需要自己实现大部分功能 |
| 2020年至今 | 成熟期 | OpenTelemetry、Harness等商用可观测平台 | 标准统一,开箱即用,零代码接入,托管式服务,不用自己运维,功能完善,中小公司也能用上企业级的链路追踪能力 |
| 未来的发展趋势: |
- eBPF无代码埋点:现在的Agent还是需要加载到应用进程里,未来用eBPF技术,直接从操作系统层面采集Trace数据,不用改任何应用的配置,连Agent都不用装,真正的零侵入。
- 智能根因分析:现在的链路追踪还是需要人去看链路找问题,未来AI会自动分析链路数据,直接告诉你故障的根因是什么,给出解决方案,比如"库存服务耗时高是因为SQL没有加索引,建议给inventory表的product_id字段加索引"。
- 跨厂商链路追踪:现在请求走到第三方服务商的系统里链路就断了,未来会有跨厂商的Trace传播标准,比如你调用微信支付的接口,TraceID会传到微信的系统里,返回的时候带回来,整个链路是完整的。
面临的挑战: - 多语言多协议支持:现在还有很多小众语言、私有协议的埋点支持不完善,需要社区和厂商持续迭代。
- 隐私安全问题:Baggage里可能会有敏感信息,跨厂商传播的时候容易泄露,需要完善的加密和权限控制机制。
- 大规模场景的性能优化:超大规模的系统每天产生几十亿条Trace数据,存储和查询的性能压力很大,需要更高效的存储引擎和查询优化技术。
总结:学到了什么?
核心概念回顾
- 请求标识染色:给每个请求打一个全局唯一的TraceID,就像奶茶店的取餐码,跟着请求走到所有环节。
- 端到端追踪:拿TraceID把整个请求的所有环节的信息串起来,就像拿取餐码查订单的整个流转过程。
- Harness APM:开箱即用的可观测性平台,帮你自动实现染色、传播、采集、存储、可视化,不用自己造轮子。
概念关系回顾
- 染色是追踪的基础,没有TraceID就串不起链路。
- 追踪是染色的目的,打标识就是为了快速排查问题、优化性能。
- Harness是落地的载体,降低了链路追踪的接入门槛,中小公司也能快速用上。
思考题:动动小脑筋
- 如果你的系统里有定时任务,每天凌晨1点执行批量订单处理,怎么给这些定时任务的请求加上TraceID,实现全链路追踪?
- 如果你的系统要对接第三方支付接口,怎么把TraceID传到第三方的系统里,让整个支付链路是完整的?需要注意什么问题?
- 如果你的系统流量非常大,每天10亿次请求,怎么配置采样策略才能既不漏掉异常请求,又能降低存储成本?
附录:常见问题与解答
Q1:TraceID断了怎么办?
A:大概率是某个环节没有埋点或者Trace传播失败,先检查那个服务有没有加载Harness Agent,再检查有没有自定义的协议没有配置传播规则,如果是异步场景,检查有没有手动传递TraceContext。
Q2:请求染色会影响业务性能吗?
A:Harness Agent的性能开销非常低,官方测试CPU开销低于3%,内存开销低于2%,几乎不会影响业务性能,生产环境可以放心使用。
Q3:可以自定义染色字段吗?
A:完全可以,在Harness控制台配置Baggage规则就行,支持从请求头、请求参数、Cookie、响应头里提取字段,自动传递到整个链路。
Q4:Harness支持哪些语言?
A:支持Java、Go、Python、Node.js、.NET、Ruby、PHP、C/C++等几乎所有主流编程语言,覆盖99%的应用场景。
扩展阅读 & 参考资料
- Harness官方请求染色文档
- OpenTelemetry官方文档
- W3C Trace Context标准
- 《可观测性工程》(O’Reilly出版)
- Google Dapper论文
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)