SpringCloud分布式微服务链路追踪方案:Zipkin

创作博客的目的是希望将自己掌握的知识系统地整理一下,并以博客的形式记录下来。这不仅是为了帮助其他有需要的人查阅相关内容,也是为了自己能够更好地巩固和加深对这些知识的理解。创作的时候也是对自己所学的一次复盘和总结,在创作的过程中,自己也会更全面深入的思考和总结,对于知识的理解也更加深刻,这也让我更加愿意花时间和精力去创作。此外,日后在需要的时候,也可以方便地回顾和参考这些记录。
感谢大家的关注和支持,希望我的分享对你们有所帮助。如果有任何建议或问题,欢迎随时与我交流讨论!

一、引言

随着微服务架构的广泛应用,系统的复杂性也随之增加。在这种复杂的系统中,应用通常由多个相互独立的服务组成,每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性,但也带来了新的挑战,尤其是在故障排查和性能优化方面。这时,链路追踪(Tracing)成为了一个非常重要的工具。

在这里插入图片描述
注:图片来自网络

如图,在复杂的调用链路中假设存在一条调用链路响应缓慢,如何定位其中延迟高的服务呢?

  • 日志: 通过分析调用链路上的每个服务日志得到结果,这种方式耗时高效率低
  • zipkin:Zipkin是Twitter开源的分布式跟踪系统,是开箱即用的产品,主要用来收集系统的时许数据,从而追踪系统的调用问题,使用zipkin的web UI可以一眼看出延迟高的服务。
  • SkyWalking等

本文只介绍zipkin的使用方式。
在这里插入图片描述
如图所示,各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。

在这里插入图片描述
使用zipkin涉及到以下几个概念:

  • Span:基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它,span通过还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent-id等,其中parent-id可以表示span调用链路来源,通俗的理解span就是一次请求信息
  • Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
  • Annotation:注解,用来记录请求特定事件相关信息(例如时间),通常包含四个注解信息
    • cs: Client Start,表示客户端发起请求
    • sr:Server Receive,表示服务端收到请求
    • ss:Server Send,表示服务端完成处理,并将结果发送给客户端
    • cr:Client Received,表示客户端获取到服务端返回信息
  • BinaryAnnotation:提供一些额外信息,一般已key-value对出现

二、安装Zipkin

Zipkin 是由推特开发的分布式链路追踪系统,用于对 Sleuth 产生的日志加以收集并采用可视化的数据对链路追踪进行分析与图表展示,Zipkin 是典型的 C/S(客户端与服务端)架构模式,需要独立部署 Zipkin 服务器,同时也需要在微服务内部持有Zipkin客户端才可以自动实现日志的推送与展示。

1. Jar包部署

下载地址

运行

java -jar zipkin-server-2.3.1-exec.jar

在这里插入图片描述
这样zipkin就是以内存存储的方式进行启动了

2. docker部署

docker-zipkin官方文档:docker-zipkin

  1. 使用以下命令从Docker Hub上拉取Zipkin的Docker镜像:

docker pull openzipkin/zipkin

  1. 运行Zipkin容器

docker run -d --restart always -p 9411:9411 --name zipkin openzipkin/zipkin

该命令将Zipkin以守护进程模式(-d)运行Zipkin容器,并设置容器在退出时始终重启(–restart always)。同时,将容器的9411端口映射到主机的9411端口,以便外部访问。

  1. 测试

Zipkin服务启动后,可以在浏览器中访问以下URL查看Zipkin的Web UI:http://localhost:9411,如果出现下面的画面,那么代表我们zipkin服务配置成功了

在这里插入图片描述

三、项目集成Zipkin

在 Spring Cloud 中集成 Zipkin使用起来还是很方便的,只需引入相关依赖并配置 Zipkin 的地址即可,然后就会把请求的监控数据发往 Zipkin。

  1. 引入依赖
    安装完成后,我们需要引入 sleuth 和 zipkin的依赖。
<!-- sleuth 可以省略-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency><!-- zipkin链路追踪 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

zipkin依赖同时包含了seuth,可以省略sleuth的引用

  1. 添加Zipkin相关配置
spring:# sleuth 配置sleuth:web:client:enabled: truesampler:probability: 1.0 # 采样比例为: 0.1(即10%),设置的值介于0.0到1.0之间,1.0则表示全部采集。默认为0.1# zipkin 配置zipkin:base-url: http://192.168.253.10:9411  # 指定了Zipkin服务器的地址

参数示例:

spring:  zipkin:  base-url: http://<zipkin-server-address>:<zipkin-port>/  # Zipkin服务器地址,例如:http://localhost:9411/  sender:  type: web  # 发送追踪数据的方式,通常是'web'(HTTP)或'kafka'  service:  name: ${spring.application.name}  # 服务名,通常会从spring.application.name属性中获取  sleuth:  sampler:  probability: 1.0  # 采样率,1.0表示捕获所有追踪信息,0.1表示10%的追踪信息  web:  client:  # 客户端相关的配置,例如是否开启日志输出等  skip-pattern: /health.*,/info.*,/metrics.* # 匹配这些URL模式的请求将不会被追踪  baggage-keys: # 行李标签(Baggage),可以在整个分布式追踪中传递的键值对  - some-key  - another-key  propagation:  type: b3 # 追踪传播的格式,如b3(Zipkin的默认格式)  log:  slf4j:  enabled: true # 是否在日志中启用Sleuth的日志输出 cloud:  stream:  default-binder: rabbit  # 如果你使用RabbitMQ作为消息代理,则配置此选项(对于Kafka或其他消息代理,配置会不同)  bindings:  output:  # 如果使用消息队列(如RabbitMQ或Kafka)来发送追踪数据,则配置此部分  destination: zipkin  content-type: application/x-protobuf

配置说明:
spring.application.name:应用的名称,将作为Zipkin中追踪的服务名称。
spring.sleuth.sampler.probability:采样率,决定哪些追踪数据会被发送到Zipkin服务器。设置为1.0表示捕获所有追踪信息。
spring.sleuth.web.client.skip-pattern:正则表达式模式列表,用于指定哪些URL模式的请求将不会被追踪。
spring.sleuth.baggage-keys:行李标签(Baggage)的键列表,这些键值对可以在整个分布式追踪中传递。
spring.sleuth.propagation.type:追踪传播的格式,如b3是Zipkin的默认格式。
spring.sleuth.log.slf4j.enabled:是否在日志中启用Sleuth的日志输出。
spring.zipkin.base-url:Zipkin服务器的地址,追踪数据将发送到这个地址。
spring.zipkin.sender.type:发送追踪数据的方式,如通过HTTP(‘web’)或Kafka。
spring.zipkin.compression.enabled:是否启用发送前的数据压缩。
spring.cloud.stream.bindings.output:如果使用消息队列发送追踪数据,这部分配置指定了消息队列的目的地、内容类型等。
请注意,这些配置可能会因Spring Cloud和Spring Cloud Sleuth的版本不同而有所变化。

启动项目,查看请求链路情况

在这里插入图片描述

在这里插入图片描述

四、Zipkin数据持久化

Zipkin 默认是将监控数据存储在内存的,如果Zipkin 挂掉或重启的话,那么监控数据就会丢失。所以如果想要搭建生产可用的Zipkin,就需要实现监控数据的持久化。而想要实现数据持久化,自然就是得将数据存储至数据库。

Zipkin 支持将数据存储至:

  • 内存(默认)
  • MySQL
  • Elasticsearch
  • Cassandra

1. 内存存储

默认方式

用法示例:

java -jar zipkin.jar

参数:
MEM_MAX_SPANS:保存的最大 span 的数量,超过了会把最早的 span 删除。默认为500000

将内存中保存的span加倍的示例:

MEM_MAX_SPANS=1000000 java -Xmx1G -jar zipkin.jar

2. mysql存储

首先我们需要在数据库中,执行下面的官方SQL脚本,创建对应的表:官方脚本传送门

如果上述地址过期,请执行下面的SQL脚本,在之前,需要创建一个数据库,叫zipkin

--
-- Copyright The OpenZipkin Authors
-- SPDX-License-Identifier: Apache-2.0
--CREATE TABLE IF NOT EXISTS zipkin_spans (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL,`id` BIGINT NOT NULL,`name` VARCHAR(255) NOT NULL,`remote_service_name` VARCHAR(255),`parent_id` BIGINT,`debug` BIT(1),`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';CREATE TABLE IF NOT EXISTS zipkin_annotations (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';CREATE TABLE IF NOT EXISTS zipkin_dependencies (`day` DATE NOT NULL,`parent` VARCHAR(255) NOT NULL,`child` VARCHAR(255) NOT NULL,`call_count` BIGINT,`error_count` BIGINT,PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

执行完成后,我们将会得到下面的三个表
在这里插入图片描述

其中

  • zipkin_spans:存放基本工作单元,也就是一次链路调用的信息
  • zipkin_dependencies:存放的依赖信息
  • zipkin_annotations:用来记录请求特定事件相关信息(例如时间)

然后在按照下面的方式进行启动:

jar包启动

java -jar zipkin.jar --STORAGE_TYPE=mysql --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306

docker启动

docker run -d -p 9411:9411 \-e STORAGE_TYPE=mysql \-e MYSQL_HOST=mysql-host \-e MYSQL_PORT=3306 \-e MYSQL_USER=root \-e MYSQL_PASS=password \-e MYSQL_DB=zipkin \--name zipkin \openzipkin/zipkin

参数:

  • MYSQL_DB:MySQL数据库名,默认为 zipkin
  • MYSQL_USER:用户名
  • MYSQL_HOST:主机地址
  • MYSQL_TCP_PORT:端口
  • MYSQL_MAX_CONNECTIONS:最大连接数据,默认 10
  • MYSQL_USE_SSL:是否使用ssl,需要 javax.net.ssl.trustStore 和 javax.net.ssl.trustStorePassword,默认 false
  • MYSQL_JDBC_URL: 自己设置 JDBC 的 url

3. elasticsearch存储

Zipkin-Elasticsearch 存储数据库的官方文档:elasticsearch-storage

首先,你需要一个运行中的Elasticsearch集群,并且可以正常连接。

环境变量参数:

在启动Zipkin容器时,需要配置一些环境变量来指定Elasticsearch集群的连接信息。这些环境变量包括:

  • STORAGE_TYPE: 存储类型,设为elasticsearch
  • ES_HOSTS: Elasticsearch集群的主机地址,多个地址用逗号分隔
  • ES_HTTP_LOGGING: (可选) Elasticsearch/OpenSearch API 请求,可选项BASIC, HEADERS, BODY
  • ES_INDEX: (可选) Elasticsearch索引名称,默认为zipkin
  • ES_TIMEOUT:连接Elasticsearch的超时时间,单位是毫秒;默认10000(10秒)
  • ES_USERNAME:Elasticsearch的用户名
  • ES_PASSWORD:Elasticsearch的密码
  • ES_PIPELINE:指定Elasticsearch的Ingest Pipeline,用于预处理文档

jar包启动示例:

$ STORAGE_TYPE=elasticsearch ES_HOSTS=http://elasticsearch-host:9200 java -jar zipkin.jar

docker启动示例:

docker run -d -p 9411:9411 \-e STORAGE_TYPE=elasticsearch \-e ES_HOSTS=http://elasticsearch-host:9200 \--name zipkin \openzipkin/zipkin

Zipkin 支持的这几种存储方式中,内存显然是不适用于生产的,这一点开始也说了。而使用MySQL 的话,当数据量大时,查询较为缓慢,也不建议使用。Twitter 官方使用的是Cassandra作为Zipkin 的存储数据库,但国内大规模用Cassandra 的公司较少,而且Cassandra 相关文档也不多。

综上,故采用Elasticsearch 是个比较好的选择。

五、原理简介

Zipkin Server主要包括四个模块:

  • Collector 接收或收集各应用传输的数据
  • Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,ElasticSearch等,默认存储在内存中
  • API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用
  • Web 提供简单的web界面

Zipkin 分为两端,Zipkin 服务端和Zipkin 客户端,客户端也就是微服务的应用。客户端配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。发送的方式主要有两种,一种是 HTTP 报文的方式,另一种是消息总线的方式如 RabbitMQ、kafka等。

链路追踪基本原理:

一个完整请求链路的追踪ID(traceid)用于查出本次请求调用的所有服务,每一次服务调用的跨度ID(spanid)用来记录调用顺序

在这里插入图片描述
上游服务parenetid用来记录调用的层级关系

在这里插入图片描述
调用时间timestamp,把请求发出、接收、处理的时间都记录下来,计算业务处理耗时和网络耗时,然后用可视化界面展示出来每个调用链路,性能,故障

在这里插入图片描述
还可以记录一些其他信息,比如发起调用服务名称、被调服务名称、返回结果、IP、调用服务的名称等,最后,我们再把相同spanid的信息合成一个大的span块,就完成了一个完整的调用链

在这里插入图片描述
注:图片来自chenchenchen

参考文章:

  • zipkin官方文档
  • SpringCloud 入门实战–Zipkin
  • 分布式链路追踪原理详解及SkyWalking、Zipkin区别

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

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

相关文章

【例子】webpack配合babel实现 es6 语法转 es5 案例 [通俗易懂]

首先来说一下实现 es6 转 es5 的一个简单步骤 1、新建一个项目&#xff0c;并且在命令行中初始化项目 npm init -y2、安装对应版本的 webpack webpack-cli(命令行工具) "webpack""webpack-cli"3、安装 Babel 核心库和相关的 loader "babel-core&qu…

PasteSpiderFile文件同步管理端使用说明(V24.6.21.1)

PasteSpider作为一款适合开发人员的部署管理工具&#xff0c;特意针对开发人员的日常情况做了一个PasteSpiderFile客户端&#xff0c;用于windows上的开发人员迅速的更新发布自己的最新代码到服务器上&#xff01; 虽然PasteSpider也支持svn/git的源码拉取&#xff0c;自动编译…

【自然语言处理系列】安装nltk_data和punkt库(亲测有效)

目录 一、下载nltk_data-gh-pages.zip数据文件 二、将nltk_data文件夹移到对应的目录 三、测试 四、成功调用punkt库 问题&#xff1a; 解决方案&#xff1a; 在使用自然语言处理库nltk时&#xff0c;许多初学者会遇到“nltk.download(punkt)”无法正常下载的问题。本…

Android Media Framework(七)MediaCodecService

Android引入Treble架构后&#xff0c;OpenMAX框架以HIDL Service的形式为System分区提供服务&#xff0c;本文将探讨该服务是如何启动&#xff0c;服务提供了什么内容&#xff0c;以及服务是如何被应用层所使用的。 1 概述 在Android的Treble架构中&#xff0c;为了确保系统的…

面试经典150题

打家劫舍 class Solution { public:int rob(vector<int>& nums) {int n nums.size();if(n 1){return nums[0];}vector<int> dp(n, 0);dp[0] nums[0];//有一间房可以偷//有两间房可以偷if(nums[1] > nums[0]){dp[1] nums[1];}else{dp[1] nums[0];}for …

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时&#xff0c;子组件接收到的 children 是一个数组&#xff0c;通过解析数组中各 JSX 的属性 slot &#xff0c;即可实现具名插槽的分发&#xff01; 代码实现 Father.jsx import Child from "./Child";…

【D3.js in Action 3 精译】第一部分 D3.js 基础知识

第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界&#xff01;可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证&#xff0c;这一目标很快就能达成&#xff01;但首先&#xff0c;我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…

探秘神经网络激活函数:Sigmoid、Tanh和ReLU,解析非线性激活函数的神奇之处

引言 在神经网络中&#xff0c;激活函数扮演着至关重要的角色。它们赋予神经网络非线性的能力&#xff0c;使得网络具备学习和表示复杂函数关系的能力。本文将详细解析三种常见的激活函数&#xff1a;Sigmoid、Tanh和ReLU&#xff0c;揭开它们在神经网络中的奥秘。无论你是初学…

【十一】【QT开发应用】模拟腾讯会议登录界面设计UI

ui 加入会议的样式表 QPushButton { /* 前景色 */ color:#0054E6; /* 背景色 */ background-color:rgb(255,255,255); /* 边框风格 */ border-style:outset; /* 边框宽度 */ border-width:0.5px; /* 边框颜色 */ border-color:gray; /* 边框倒角 */ border-radius…

日常-----最爱的人

今日话题 大家好嗷&#xff0c;今天聊的技术可比之前的重要的多啊&#xff0c;哼哼&#xff0c;也不是今天&#xff0c;大家像我看齐嗷&#xff0c;我宣布个事情&#xff01;&#xff01;&#xff01; 于2024年6月21日晚上&#xff0c;本人遇到了这一生最爱的人 嘿嘿 这种事…

微信小程序 引入MiniProgram Design失败

这tm MiniProgramDesign 是我用过最垃圾的框架没有之一 我按照官网的指示安装居然能安装不成功,牛! 这里说明我是用js开发的 到以上步骤没有报错什么都没有,然后在引入组件的时候报错 Component is not found in path “./miniprogram _npm/vant/weapp/button/index” (using…

CSS阴影优化气泡框样式

<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5&#xff08;使用until的逆向逻辑&#xff09; 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分&#xff0c;是C语言的核心、精髓所在。用好指针&#xff0c;可以在C语言开发中起到事半功倍的效果。一方面&#xff0c;可以提高程序的编译效率、执行速度&#xff0c;以及动态存储分配&#xff1b;另一方面&#xff0c;可使程序更加…

playwright录制脚本原理

Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时&#xff0c;点击录制按钮&#xff0c;会开启一个新浏览器&#xff0c;如下图所示&#xff0c;在新开浏览器页…

Hive基础知识(十八):Hive 函数的使用

1. 系统内置函数 1&#xff09;查看系统自带的函数 hive (hive3)> show functions; Time taken: 0.085 seconds, Fetched: 289 row(s) 2&#xff09;显示自带的函数的用法 hive (hive3)> desc function upper; OK tab_name upper(str)- Returns str with all characters…

“了解MySQL中的enum枚举数据类型“

目录 # 开篇 1. 创建包含枚举类型的表 2. 插入枚举类型的数据 3. 查询包含枚举类型的表 4. 更新枚举类型的数据 5. 使用枚举类型的好处 注意事项 示例总结 附加 # 开篇 在数据库中&#xff0c;枚举&#xff08;ENUM&#xff09;是一种数据类型&#xff0c;用于存储一组…

即插即用篇 | 手把手教你 YOLOv10 添加注意力机制 | 20+ 种全打通!

YOLOv10 添加注意力机制 ! 视频教程地址-哔哩哔哩 文章目录 YOLOv10 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码2. CBAM 注意力模块2.1 原理2.2 代码3. ECA 注意力模块3.1 原理3.2 代码4. CA 注意力模块4.1 原理4.2 代码5. 添加方式�…

构建开源多模态RAG系统

在这个新的冒险中&#xff0c;我们将深入研究使用开源大型语言多模态&#xff08;LLMM&#xff09;构建检索增强型生成&#xff08;RAG&#xff09;系统的过程。值得注意的是&#xff0c;我们的重点是在不依赖LangChain或Llama索引的情况下实现这一点&#xff1b;相反&#xff…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发&#xff0c;涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统&#xff0c;以进行复杂的机器人实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…