【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录

  • 前言
  • 链路追踪介绍
  • Sleuth入门
    • Sleuth介绍
      • Trace
      • Span
      • Annotation
    • Sleuth入门
      • 1、引入依赖
      • 2、修改配置文件
      • 3、网关路由配置
      • 4、演示
  • Zipkin的集成
    • ZipKin介绍
    • ZipKin服务端安装
    • Zipkin客户端集成
      • 1、添加依赖
      • 2、添加配置
      • 3、访问微服务
      • 4、演示
  • Zipkin数据持久化
    • 使用mysql实现数据持久化
      • 1、创建mysql数据环境
      • 2、启动Zipkin Server
      • 3、演示
    • 使用elasticsearch实现数据持久化
      • 1、下载
      • 2、启动
    • 3、启动Zipkin Server
      • 4、ES-head安装
      • 5、演示
  • 总结

前言

开始之前先降个版本,我发现高版本的springcloud好像不统计gateway的链路信息,百度了一大顿没有发现问题,如果有小伙伴在高版本里解决了,欢迎留言指正。

<spring-cloud.version>Hoxton.sR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>

链路追踪介绍

在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。

在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题:

  • 如何快速发现问题?
  • 如何判断故障影响范围?
  • 如何梳理服务依赖以及依赖的合理性?
  • 如何分析链路性能问题以及实时容量规划?

在这里插入图片描述

分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

常见的链路追踪技术有下面这些:

  • cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控、业务监控。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高,风险较大。
  • zipkin 由 Twitter 公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合 spring-cloud-sleuth 使用较为简单,集成很方便,但是功能较简单
  • pinpoint 是韩国人开源的基于字节码注入的调用链分析以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入
  • skywalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是**支持多种插件,U功能较强,接入端无代码侵入。**目前已加入Apache孵化器。
  • Sleuth 是SpringCloud提供的分布式系统中链路追踪解决方案。

注意:SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术,我们可以采用Sleuth +Zinkin来做链路追踪解决方案。

Sleuth入门

Sleuth介绍

SpringCloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计,先来了解一下Sleuth 中的术语和相关概念。

Trace

整个调用链路,由一组Trace Id相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即Traceld),同时在分布式系统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来,形成一条完整的请求链路。

Span

代表了一组基本的工作单元,产生于一次远程微服务调用。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(Spanld)来标记它的开始、具体过程和结束。通过 Spanld 的开始和结束时间戳,就能统计该 span 的调用时间。除此之外,我们还可以获取如事件的名称、请求信息等元数据。

Annotation

用它记录一段时间内的事件,内部使用的重要注释:

  • cs(Client Send)客户端发出请求,开始一个请求的生命;
  • sr(Server Received)服务端接受到请求开始进行处理,sr-cs=网络延迟(服务调用的时间);
  • ss(Server Send)服务端处理完毕准备发送到客户端, ss-sr=服务器上的请求处理时间;
  • cr(Client Reveived)客户端接受到服务端的响应,请求结束。cr-sr=请求的总时间;

在这里插入图片描述

Sleuth入门

接下来我们一起来通过之前的项目案例整合Sleuth

1、引入依赖

每个微服务都添加依赖

<!--链路追踪sleuth-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

2、修改配置文件

每个微服务都添加日志级别

logging:level:root: infoorg.springframework.web.servlet.DispatcherServlet: debugorg.springframework.cloud.sleuth: debug

3、网关路由配置

spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true  # 让gateway可以发现nacos中的微服务lowerCaseServiceId: true # 将请求路径上的服务名配置为小写routes:- id: shop-order #当前路由标识,要求唯一uri: lb://shop-order #lb代表从nacos中获取微服务,shop-order 是微服务的名称order: 1 #路由的优先级,数字越小级别越高predicates: #断言(就是路由转发要满足的条件)- Path=/order/** #当请求路径满足Path指定的规则时,才进行路由转发filters: #过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix=1 #去掉请求路径的第一层

4、演示

启动微服务,我们调用之前下订单的操作,即网关->订单微服务->商品微服务,调用http://127.0.0.1:7000/order/order2/1?token=123

在这里插入图片描述

我们可以在控制台观察到 sleuth 的日志输出

在这里插入图片描述

截图中的解释:[微服务名称, traceld, spanId,是否将链路的追踪结果输出到第三方平台]

查看日志文件并不是一个很好的方法,当微服务越来越多日志文件也会越来越多,通过 Zipkin 可以将日志聚合,并进行可视化展示和全文检索。

Zipkin的集成

ZipKin介绍

Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现

我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。

除了面向开发的API接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。

Zipkin 提供了可插拔数据存储方式:In-Memory、MySqI、Cassandra 以及 Elasticsearch。

在这里插入图片描述

上图展示了Zipkin的基础架构,它主要由4个核心组件构成

  • Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为 Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。
  • Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
  • RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
  • Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。

Zipkin分为两端,一个是Zipkin服务端,一个是Zipkin客户端,客户端也就是微服务的应用。客户端会配置服务端的URL地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的Trace和Span信息发送给服务端。

ZipKin服务端安装

1、下载jar包

访问下载链接即可得到一个jar包,这就是ZipKin服务端的jar包。

2、启动服务端

通过命令行输入命令启动ZipKin Server java-jar zipkin-server-2.12.9-exec. jar

3、访问

通过浏览器访问 http://127.0.0.1:9411访问

在这里插入图片描述

Zipkin客户端集成

ZipKin 客户端集成非常简单,只需要在微服务中添加其依赖和配置即可。

1、添加依赖

在每个微服务上添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

2、添加配置

spring:zipkin:base-url: http://127.0.0.1:9411/ #zipkin server的请求地址discovery-client-enabled: false #关闭服务发现,因为zipkin server和gateway在同一个nacos中,让nacos把他当成一个URL,而不是当做服务名sleuth:sampler:probability: 1.0 #设置采样比例为:1.0,即全部都需要

3、访问微服务

http://127.0.0.1:7000/order/order2/1?token=123

4、演示

访问zipkin的UI界面,观察效果

在这里插入图片描述

点击其中一条记录,可观察一次访问的详细线路。
在这里插入图片描述
点击其中的某个服务,查看详细信息

在这里插入图片描述

Zipkin数据持久化

Zipkin Server默认会将追踪数据信息保存到内存,但这种方式不适合生产环境。Zipkin支持将追踪数据持久化到mysql数据库或elasticsearch中。

使用mysql实现数据持久化

1、创建mysql数据环境

DROP TABLE IF EXISTS `zipkin_annotations`;
CREATE TABLE `zipkin_annotations` (`trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` bigint(20) NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` bigint(20) 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(11) NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` bigint(20) DEFAULT NULL COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` int(11) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` binary(16) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` smallint(6) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` varchar(255) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`) COMMENT 'Ignore insert on duplicate',UNIQUE KEY `trace_id_high_4` (`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`) COMMENT 'Ignore insert on duplicate',KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`span_id`) COMMENT 'for joining with zipkin_spans',KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTraces/ByIds',KEY `endpoint_service_name` (`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames',KEY `a_type` (`a_type`) COMMENT 'for getTraces',KEY `a_key` (`a_key`) COMMENT 'for getTraces',KEY `trace_id` (`trace_id`,`span_id`,`a_key`) COMMENT 'for dependencies job',KEY `trace_id_high_5` (`trace_id_high`,`trace_id`,`span_id`) COMMENT 'for joining with zipkin_spans',KEY `trace_id_high_6` (`trace_id_high`,`trace_id`) COMMENT 'for getTraces/ByIds',KEY `endpoint_service_name_2` (`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames',KEY `a_type_2` (`a_type`) COMMENT 'for getTraces',KEY `a_key_2` (`a_key`) COMMENT 'for getTraces',KEY `trace_id_2` (`trace_id`,`span_id`,`a_key`) COMMENT 'for dependencies job'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;-- ----------------------------
-- Table structure for zipkin_dependencies
-- ----------------------------
DROP TABLE IF EXISTS `zipkin_dependencies`;
CREATE TABLE `zipkin_dependencies` (`day` date NOT NULL,`parent` varchar(255) NOT NULL,`child` varchar(255) NOT NULL,`call_count` bigint(20) DEFAULT NULL,UNIQUE KEY `day` (`day`,`parent`,`child`),UNIQUE KEY `day_2` (`day`,`parent`,`child`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;-- ----------------------------
-- Table structure for zipkin_spans
-- ----------------------------
DROP TABLE IF EXISTS `zipkin_spans`;
CREATE TABLE `zipkin_spans` (`trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` bigint(20) NOT NULL,`id` bigint(20) NOT NULL,`name` varchar(255) NOT NULL,`parent_id` bigint(20) DEFAULT NULL,`debug` bit(1) DEFAULT NULL,`start_ts` bigint(20) DEFAULT NULL COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` bigint(20) DEFAULT NULL COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`id`) COMMENT 'ignore insert on duplicate',UNIQUE KEY `trace_id_high_4` (`trace_id_high`,`trace_id`,`id`) COMMENT 'ignore insert on duplicate',KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`id`) COMMENT 'for joining with zipkin_annotations',KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTracesByIds',KEY `name` (`name`) COMMENT 'for getTraces and getSpanNames',KEY `start_ts` (`start_ts`) COMMENT 'for getTraces ordering and range',KEY `trace_id_high_5` (`trace_id_high`,`trace_id`,`id`) COMMENT 'for joining with zipkin_annotations',KEY `trace_id_high_6` (`trace_id_high`,`trace_id`) COMMENT 'for getTracesByIds',KEY `name_2` (`name`) COMMENT 'for getTraces and getSpanNames',KEY `start_ts_2` (`start_ts`) COMMENT 'for getTraces ordering and range'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
SET FOREIGN_KEY_CHECKS=1;

2、启动Zipkin Server

在启动Zipkin Server的时候,指定数据保存的mysql的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456

参数参考链接:https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

3、演示

去访问http://127.0.0.1:7000/order/order2/1?token=123链接,查看数据库发现存在数据

在这里插入图片描述
停掉zinkin服务,重启查看网页数据,发现调用链接依然存在,持久化生效

在这里插入图片描述

使用elasticsearch实现数据持久化

1、下载

下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-4 此处我选择的是windows版本。

修改config文件夹下的elasticsearch.yml,增加配置

http.cors.enabled: true
http.cors.allow-origin: "*"

2、启动

在这里插入图片描述

3、启动Zipkin Server

在启动Zipkin Server的时候,指定数据保存的elasticsearch的信息

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=elasticsearch --ES-HOST=localhost:9200

4、ES-head安装

为了清楚的查看es中的数据,我们需要安装一个es-head可视化工具。es5以上就需要安装node和grunt,所以安装head插件的前提,是需要把该两项配置好。此处不再赘述,有问题私聊阿Q即可。

①下载地址:https://github.com/mobz/elasticsearch-head,下载zip包,解压zip包。

②在dos窗口进入到head路径下,使用命令npm install 安装 pathomjs。

③使用命令npm start启用服务,出现如下截图,则说明服务启动成功。

在这里插入图片描述
④使用地址:localhost:9100 访问,出现如下截图,则说明head安装成功,默认端口是9100。

在这里插入图片描述

5、演示

去访问http://127.0.0.1:7000/order/order2/1?token=123链接,发现es的控制台有数据打印

在这里插入图片描述

我们去es-head中查看数据

在这里插入图片描述
停掉zinkin服务,重启查看网页数据,发现调用链接依然存在,持久化生效。

总结

到这儿,Sleuth +Zinkin 实现链路追踪并持久化的解决方案的内容就已经介绍完了。下一篇将为大家带来Rocketmq消息驱动的文章,敬请期待吧!

后续的文章,我们将继续完善我们的微服务系统,集成更多的Alibaba组件。想要了解更多JAVA后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

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

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

相关文章

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…

Revit中如何添加剖面?快速实现剖面图的方法汇总

Revit中创建剖面以及剖面视图一般有两种方法&#xff0c;一是使用Revit原生的剖面功能&#xff0c;而是使用Revit插件BIM建模助手进行便捷的剖面操作以及剖面视图创建。 Revit原生的剖面功能&#xff0c;点击后可以自由拉伸剖面方向、范围&#xff0c;放置完剖面符号后&#xf…

【ROS 最简单教程 003/300】ROS 快速体验:Hello World

开始自己的第一次尝试叭 ~ Hello World 本篇是 C 版本&#xff0c;如需 python 版本 &#x1f449; python 版本指路 ROS 中程序的实现流程&#xff1a; 创建工作空间 ( &#x1f499; 如 tutu_ws) &#xff0c;进入并编译 mkdir -p tutu_ws/src cd tutu_ws catkin_make在 src …

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

Hive之扩展函数(UDF)

Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时&#xff0c;我们通常会进行自定义函数&#xff0c;即&#xff1a;扩展函数。Hive的扩展函数可分为三种&#xff1a;UDF,UDTF,UDAF。 UDF&#xff1a;一进一出 UDTF&#xff1a;一进多出 UDAF&#xff1a…

作业帮6-19笔试-选填题

可以看到10在第一位&#xff0c;说明用的是挖坑法快速排序&#xff0c;过程如下&#xff1a; 右指针从最右边开始&#xff0c;找到第一个比30小的数10&#xff0c;与30交换。 10、15、40、28、50、30、70 左指针从位置1开始&#xff0c;找到40&#xff0c;与30互换。 10、15、3…

C语言 ——— 函数指针的定义 函数指针的使用

目录 何为函数指针 打印 函数名的地址 及 &函数名的地址 函数指针的代码&#xff08;如何正确存储函数地址&#xff09; 函数指针的使用 何为函数指针 类比&#xff1a; 整型指针 - 指向整型数据的指针&#xff0c;整型指针存放的是整型数据的地址 字符指针 - 指向字…

Lc63---1859将句子排序(排序)---Java版(未写完)

1.题目描述 2.思路 &#xff08;1&#xff09;首先将句子按空格分割成若干单词。 &#xff08;2&#xff09;每个单词的最后一个字符是它的位置索引。我们可以通过这个索引将单词恢复到正确的位置。 &#xff08;3&#xff09;按照单词的索引顺序排序这些单词。 &#xff08;4…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

shardingsphere的学习(二):sharingjdbc操作读写分离

简介 mysql配置读写分离以及使用shardingjdbc配置操作读写分离 读写分离 主数据库负责增删改操作&#xff08;写&#xff09;&#xff0c;从数据库负责查询操作&#xff08;读&#xff09;&#xff0c;主数据库和从数据库之间会数据同步&#xff08;主从复制&#xff09;。 …

【前端】一文带你了解 CSS

文章目录 1. CSS 是什么2. CSS 引入方式2.1 内部样式2.2 外部样式2.3 内联样式 3. CSS 常见选择器3.1 基础选择器3.1.1 标签选择器3.1.2 类选择器3.1.3 id 选择器3.1.4 通配符选择器 3.2 复合选择器3.2.1 后代选择器 4. CSS 常用属性4.1 字体相关4.2 文本相关4.3 背景相关4.4 设…

敢不敢跟我一起搭建一个Agent!不写一行代码,10分钟搞出你的智能体!纯配置也能真正掌握AI最有潜力的技术?AI圈内人必备技能

说一千道一万&#xff0c;不如实地转一转。学了那么久的AI Agent的概念了&#xff0c;是时候该落地一个Agent看看自己的掌握程度了对不对&#xff0c;我们都理解大脑是自动节能的&#xff0c;但是知识的确需要倒逼自己一把才能真的掌握&#xff0c;不瞒大家说&#xff0c;笔者对…

论文阅读:面向自动驾驶场景的多目标点云检测算法

论文地址:面向自动驾驶场景的多目标点云检测算法 概要 点云在自动驾驶系统中的三维目标检测是关键技术之一。目前主流的基于体素的无锚框检测算法通常采用复杂的二阶段修正模块,虽然在算法性能上有所提升,但往往伴随着较大的延迟。单阶段无锚框点云检测算法简化了检测流程,…

日程管理多源归一,服务场景一键直达

时间对于每个人来说都是非常宝贵的&#xff0c;曾经我们使用台历、挂历来标记和查看重要日程&#xff0c;通过翻页来见证时光的流逝&#xff0c;随着信息化时代的不断发展&#xff0c;更加灵活简洁的电子日历成为主流&#xff0c;日历也从一个最简单的日期看板&#xff0c;慢慢…

正余弦算法作者又提出新算法!徒步优化算法(HOA)-2024年一区顶刊新算法-公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 算法伪代码 性能测评 参考文献 …

ruoyi vue3版本web端隐藏侧边栏及其顶部导航栏

做项目时有个需求是在web端里面嵌入一个页面全屏的大屏&#xff0c;但若依web自带的侧边栏导航和顶部导航一时还不知道怎么隐藏起来&#xff0c;于是在网上到处查找资料&#xff0c;终于&#xff0c;还是在若依的gitee文档中发现了线索 怎么隐藏侧边栏和顶部导航栏实现完全的全…