【业务功能107】微服务-springcloud-springboot-Sentinel容器安装-熔断降级限流

news2024/9/21 12:38:06

Sentinel

  • 在微服务架构下,会涉及到 微服务A需要远程调用其他的微服务B,C,D等的接口,比如商品服务接口,需要调用库存服务数据,秒杀服务数据等,这里就会衍生一个长链路的调用过程,那么一旦下游需要被调用的数据接口出现异常,那么就会导致整个上游的接口都会报错无法使用,所以就需要去做相应的方案措施,避免上游服务异常。

image.png

image.png

image.png

一、熔断、降级、限流

1.熔断

  服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

停止是说,当前服务一旦对下游服务进行熔断,当请求到达时,当前服务不再对下游服务进行调用,而是使用设定好的策略(如构建默认值)直接返回。

暂时是说,熔断后,并不会一直不再调用下游服务,而是以一定的策略(如每分钟调用 10 次,若均返回成功,则增大调用量)试探调用下游服务,当下游服务恢复可用时,自动停止熔断。

image.png

2.降级

  降级是指当自身服务压力增大时,采取一些手段,增强自身服务的处理能力,以保障服务的持续可用。比如,下线非核心服务以保证核心服务的稳定、降低实时性、降低数据一致性。

  为了预防某些功能出现负荷过载或者响应慢的情况,在其内部暂时舍弃一些非核心接口和数据的请求(如评论、积分),而直接返回一个提前准备好的 fallback(退路) 错误处理信息。释放CPU和内存资源,以保证整个系统的稳定性和可用性。

3.限流

  限流是指上游服务对本服务请求 QPS 超过阙值时,通过一定的策略(如延迟处理、拒绝处理)对上游服务的请求量进行限制,以保证本服务不被压垮,从而持续提供稳定服务。常见的限流算法有滑动窗口、令牌桶、漏桶等。

二、Sentinel

1.其他组件对比

image.png

2.Sentinel介绍

  随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 的历史:

  • 2012 年,Sentinel 诞生,主要功能为入口流量控制。
  • 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
  • 2018 年,Sentinel 开源,并持续演进。
  • 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
  • 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。

3. 基本概念及作用

基本概念:

资源:是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

主要作用:

  1. 流量控制
  2. 熔断降级
  3. 系统负载保护

我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

4.Sentinel应用

官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

4.1 Sentinel控制台搭建

下载对应的jar包:https://github.com/alibaba/Sentinel/releases 下载适合自己的版本

通过命令行启动:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

启动后需要输入账号密码:sentinel sentinel

image.png

登录成功后看到的页面

image.png

4.2 服务监控

  如果我们需要把自己的服务被Sentinel监控,那么我们需要添加对应的依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

然后需要添加对应的属性信息

image.png

然后我们访问请求后,在控制台就可以看到对应的监控信息了

image.png

然后我们可以指定简单的限流规则

image.png

表示1秒中内只能有一个QPS。超过就限流

image.png

测试我们发送请求快一点就会出现限流的处理

4.3 实时监控

  实时监控这块需要引入Acuator

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

endpoint端点:

image.png

4.4 限流信息自定义

@Component
public class SentinelUrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        R r = R.error(500,"访问太快,稍后再试!");
        httpServletResponse.setContentType("application/json;charset=UTF-8");
        httpServletResponse.getWriter().write(JSON.toJSONString(r));
    }
}

image.png

5.sentinel容器安装

  直接在windows中安装Sentinel启动管理还是不太方便,所以我们还是把Sentinel安装在Docker容器中

拉取对应的镜像文件

docker pull bladex/sentinel-dashboard:1.7.2

启动容器

docker run --name sentinel  -d -p 8858:8858 -d  bladex/sentinel-dashboard:1.7.2

开机自启动

docker update --restart=always sentinel

访问:

image.png

对应的客户端的使用:需要调整的配置信息

image.png

image.png

6.Sentinel监控所有服务

在公共微服务中引入以上说明的两个依赖,使得每个需要进行限流降级操作的微服务进入sentinel监控中。

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

  在每一个服务都添加Sentinel的配置 以及 Acuator实时监控的端点配置,这里都是重复的配置信息,也可以配置在nacos配置中心

spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        client-ip: 192.168.56.1     
        dashboard: 192.168.56.100:8858
management:
  endpoints:
    web:
      exposure:
        include: '*'

image.png

7.熔断降级

https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

场景一 远程服务调用异常 熔断降级实例: 刷新商品页面详情会调用到多个接口包括远程服务接口
商品服务product中–>>会调用本身服务多个接口方法–>>同时也会通过fegin调用到其他的微服务 比如秒杀服务,假如此时秒杀服务接口异常(异常有很多种,比如我们模拟的时候,可以直接把秒杀服务关了…或者接口代码去抛异常…),那么商品服务的请求链路会因为秒杀服务异常而导致整个接口请求异常,页面报错,那么我们通过代码的方式 设置熔断机制,使得即使fegin远程调用的接口异常返回一个回调相应数据,来确保业务逻辑不报错

1.添加对应的配置

feign:
  sentinel:
    enabled: true

image.png

2.将涉及fegin远程调用的秒杀服务查询接口添加托底的方法,回调类

@Slf4j
@Component
public class SeckillFeignServiceFallback implements SeckillFeignService {
    @Override
    public R getSeckillSessionBySkuId(Long skuId) {
        log.error("熔断降级....SeckillFeignService:{}",skuId);
        return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
    }
}

image.png

3.在商品服务的调用远程服务接口中增加注解的属性值指定前面定义的回调类:fallback = SeckillFeignServiceFallback.class

@FeignClient(value = "mall-seckill",fallback = SeckillFeignServiceFallback.class)
public interface SeckillFeignService {

    @GetMapping("/seckill/seckillSessionBySkuId")
    R getSeckillSessionBySkuId(@RequestParam("skuId") Long skuId);
}

image.png


4.设置好回调类信息,需要进一步的优化业务逻辑的响应,避免出现空指针异常,需要先判断返回值的响应代码,如果是正常的r.getCode() == 0再做进一步的调用

CompletableFuture<Void> seckillFuture = CompletableFuture.runAsync(() -> {
            // 查询商品的秒杀活动
            R r = seckillFeignService.getSeckillSessionBySkuId(skuId);
            if(r.getCode() == 0){
                SeckillVO seckillVO = JSON.parseObject(r.get("data").toString(),SeckillVO.class);
                vo.setSeckillVO(seckillVO);
            }
        }, threadPoolExecutor);

场景二 远程服务调用慢 延时 熔断降级实例:刷新商品页面详情会调用到多个接口包括远程服务接口
与场景一相同,只不过此时我们模拟远程调用接口时长久一些,调用线程睡眠方法,比如设置500毫秒,然后
可以通过我们安装好的sentinel启动访问客户端,访问商品服务接口中调用到的 远程服务接口,点击编辑降级规则,熔断策略设置:慢调用比例, 最大RT200毫秒,比例阈值0.1 ,熔断时长10s,最小请求数5

熔断策略
Sentinel 提供以下几种熔断策略:

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

手动配置:客户端的Sentinel版本需要和服务器的版本要保持一致。

    @ResponseBody
    @GetMapping("/seckillSessionBySkuId")
    public R getSeckillSessionBySkuId(@RequestParam("skuId") Long skuId){
        System.out.println("seckillSessionBySkuId -----------------------");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        SeckillSkuRedisDto dto = seckillService.getSeckillSessionBySkuId(skuId);
        return  R.ok().put("data",JSON.toJSONString(dto));
    }

image.png

8.自定义资源

详情看官网
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E5%AE%9A%E4%B9%89%E8%B5%84%E6%BA%90

定义资源

  • 方式一:主流框架的默认适配
    为了减少开发的复杂程度,我们对大部分的主流框架,例如 Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor 等都做了适配。您只需要引入对应的依赖即可方便地整合 Sentinel。可以参见: 主流框架的适配。 比如前面结合Feign

  • 方式二:抛出异常的方式定义资源
    SphU 包含了 try-catch 风格的 API。用这种方式,当资源发生了限流之后会抛出 BlockException。这个时候可以捕捉异常,进行限流之后的逻辑处理。示例代码如下:


// 1.5.0 版本开始可以利用 try-with-resources 特性(使用有限制)
// 资源名可使用任意有业务语义的字符串,比如方法名、接口名或其它可唯一标识的字符串。
try (Entry entry = SphU.entry("resourceName")) {
  // 被保护的业务逻辑
  // do something here...
} catch (BlockException ex) {
  // 资源访问阻止,被限流或被降级
  // 在此处进行相应的处理操作
}
  • 方式四:注解方式定义资源
    Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler 和 fallback 函数来进行限流之后的处理。示例:
// 原本的业务方法.
@SentinelResource(blockHandler = "blockHandlerForGetUser")
public User getUserById(String id) {
    throw new RuntimeException("getUserById command failed");
}

// blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
public User blockHandlerForGetUser(String id, BlockException ex) {
    return new User("admin");
}

带入实际业务接口 秒杀商品信息接口实例:

 public List<SeckillSkuRedisDto> blockHandler(BlockException blockException){
        log.error("限流执行的 blockHandler 方法 ....{}",blockException.getMessage());
        return null;
    }

    /**
     * 查询出当前时间内的秒杀活动及对应的商品SKU信息
     * @return
     */
    @SentinelResource(value = "currentSeckillSkusResources",blockHandler = "blockHandler")
    @Override
    public List<SeckillSkuRedisDto> getCurrentSeckillSkus() {
        // 1.确定当前时间是属于哪个秒杀活动的
        long time = new Date().getTime();

        try (Entry entry = SphU.entry("getCurrentSeckillSkusResources")) {
            // 被保护的业务逻辑
            // 从Redis中查询所有的秒杀活动
            Set<String> keys = redisTemplate.keys(SeckillConstant.SESSION_CHACE_PREFIX + "*");
            for (String key : keys) {
                //seckill:sessions1656468000000_1656469800000
                String replace = key.replace(SeckillConstant.SESSION_CHACE_PREFIX, "");
                // 1656468000000_1656469800000
                String[] s = replace.split("_");
                Long start = Long.parseLong(s[0]); // 活动开始的时间
                Long end = Long.parseLong(s[1]); // 活动结束的时间
                if(time > start && time < end){
                    // 说明的秒杀活动就是当前时间需要参与的活动
                    // 取出来的是SKU的ID  2_9
                    List<String> range = redisTemplate.opsForList().range(key, -100, 100);
                    BoundHashOperations<String, String, String> ops = redisTemplate.boundHashOps(SeckillConstant.SKU_CHACE_PREFIX);
                    List<String> list = ops.multiGet(range);
                    if(list != null && list.size() > 0){
                        List<SeckillSkuRedisDto> collect = list.stream().map(item -> {
                            SeckillSkuRedisDto seckillSkuRedisDto = JSON.parseObject(item, SeckillSkuRedisDto.class);
                            return seckillSkuRedisDto;
                        }).collect(Collectors.toList());
                        return collect;
                    }
                }
            }
        } catch (BlockException ex) {
            // 资源访问阻止,被限流或被降级
            log.error("getCurrentSeckillSkusResources被限制访问了...");
            // 在此处进行相应的处理操作
        }
        return null;
    }

9.网关流控

  • 前面所做的限流都是基于具体的业务微服务中,在业务代码去限制,而我们微服务架构中也有网关服务Gateway,请求通过网关来转发到具体的微服务中,我们也可以在网关处做限流动作,可以参考官网的指南: 网关流量控制

这里演示一个简单的例子,在网关服务pom文件,导入一个依赖,然后与前面介绍的使用方式一致,直接请求我们的电商首页等接口信息,因为这些都是通过网关转发,然后在sentinel客户端页面刷新,就可以打开看的网关服务的接口信息,请求链路栏目中可以看的API的名称,是网关服务定义的路由id 值如:- id: msbmall_host_route1,点击 流控 按钮 进行相应的 阈值设置即可生效

网关服务依赖引入:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
            <version>2021.1</version>
        </dependency>

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

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

相关文章

Haproxy负载均衡集群 超详细 (附部署实例)

Haproxy 一、Web集群调度器1.1 常用的Web集群调度器1.2 常用集群调度器的优缺点&#xff08;LVS ,Nginx,Haproxy)1.2.1 Nginx1.2.2 LVS1.2.3 Haproxy 1.3 LVS、Nginx、Haproxy的区别 二、Haproxy2.1 简介2.2 Haproxy的主要特性2.3 Haproxy应用分析2.4 Haproxy的调度算法(负载均…

[npm]package.json文件

[npm]package.json文件 生成 package.jsonpackage.json 必须属性nameversion 描述信息descriptionkeywordsauthorcontributorshomepagerepositorybugs 依赖配置dependenciesdevDependenciespeerDependenciesoptionalDependenciesbundledDependenciesengines 脚本配置scriptscon…

使用IDEA开发Servlet

一、新建工程 二、填写新工程的基本信息 javaee8的项目可以运行在tomcat9 三、配置tomcat 1、编辑server信息 “On frame deactivation”的意思是idea窗口发生切换时。 2、编辑部署信息 war exploded方式&#xff0c;这种方式是以文件夹方式部署的&#xff0c;支持热加载。 …

RabbitMQ及各种模式

目录 一、MQ的基本概念 1.1 MQ概述 1.2 MQ的优势和劣势 1.3 MQ的优势 1.应用解耦 2.异步提速 3.削峰填谷 1.4 MQ的劣势 小结 1.5 常见的 MQ 产品 1.6 RabbitMQ 简介 1.7 JMS 小结 二、RabbitMQ管控台 三、Hello World简单模式 ​编辑 1、生产者 ​编辑 2、消费…

PV操作-同步与互斥

浅记学习PV操作的部分题目。 消费者与生产者 单生产者与单消费者 理解PV操作可以从消费者与生产者之间的关系入手。 一个生产者与消费者的情况 消费者想要获取一份商品&#xff0c;需要检查市场中该商品是否有余量&#xff1a; 如果剩余商品足够&#xff0c;则获取该商品。如…

Vue.js和TypeScript:如何完美结合

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

msvcp120.dll怎么修复?msvcp120.dll丢失的解决方法

在当今这个信息化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着电脑技术的不断发展&#xff0c;我们也会遇到各种各样的问题。其中&#xff0c;msvcp120.dll丢失是一个常见的问题。一、msvcp120.dll 文件介绍 1 msvcp120.dll 文件的定…

windows7远程连接linux可视化界面——vnc使用教程(华为云服务器实测通过)

** CentOS系统 ** 首先&#xff0c;我们将安装VNC服务系统所需的库文件&#xff0c;这里我们将使用系统自带的yum包管理器进行安装。 yum install xorg-x11-xauth xterm libXi libXp libXtst libXtst-devel libXext libXext-devel -y接下来&#xff0c;我们将安装xvfb服务&…

采用Linux 6.5 内核的Manjaro Linux 23.0正式上线

据了解&#xff0c;当前Manjaro Linux 23.0已正式发布&#xff0c;代号“Uranos”&#xff0c;该版本采用的是Linux 6.5 内核。 依据相关资料可知&#xff0c;Manjaro Linux是一款“快速、用户友好、面向桌面、基于 Arch Linux”的发行版&#xff0c;并且还拥有诸多的显著特征…

python爬虫大作业爬取豆豆影评

python爬虫大作业爬取豆豆影评 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 1)数据描述 数据来源&#xff1a;豆豆最受欢迎的影评 数据获取&#xff1a;豆豆最受欢迎的影评并将获取的这些信息&#xff08;评论链接、电影名、电影详细地址、评论标题以…

基于YOLOv8模型的深海鱼目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型和BDD数据集的自动驾驶目标检测系统可用于日常生活与海洋中检测与定位深海鱼目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv…

高德地图实现-微信小程序地图导航

效果图&#xff1a; 一、准备阶段 1、在高德开放平台注册成为开发者2、申请开发者密钥&#xff08;key&#xff09;。3、下载并解压高德地图微信小程序SDK 高德开放平台&#xff1a; 注册账号(https://lbs.amap.com/)) 申请小程序应用的 key 应用管理(https://console.ama…

【unocss】apply聚合语法,unocss配置

前言 最近在使用unocss时&#xff0c;我感觉原子化CSS把这些类名堆在一个标签里&#xff0c;实在谈不上精致美观&#xff0c;那我们有没有办法将这些样式类名搬到style里呢&#xff1f;有的&#xff0c;unocss、tailwindCSS都给出了一种语法 #apply 操作方法 这个不可以直接…

狮子鱼社区团购小程序v18.1独立全开源版+小程序前端

狮子鱼社区团购商城系统小程序V18.1独立开源版&#xff0c;该系统本身就非常完善也没更新的必要&#xff0c;此系统拿来即用非常方便&#xff0c;同一版一样人类小徐特别优化很多细节首页美化了下&#xff0c;如小程序端授权窗口美化了下&#xff0c;该版本用户授权接口正常。功…

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

全文链接:http://tecdat.cn/?p27384 在本文中&#xff0c;数据包含有关葡萄牙“Vinho Verde”葡萄酒的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 介绍 该数据集&#xff08;查看文末了解数据获取方式&#xff09;有1599个观测值和12个变量&#xf…

ubuntu中如何用docker下载华为opengauss数据库(超简单)

ubuntu中如何下载华为opengauss数据库 前言一、安装docker1.方法一&#xff1a;2.方法二 二、拉取openguass镜像三、创建容器四、连接数据库 ,切换到omm用户 &#xff0c;用gsql连接到数据库五.最后用DateGrip远程连接测试(1&#xff09;选择数据源(2&#xff09;查看虚拟机ip地…

ITIL 4指导、计划和改进—评估和计划

第3章 评估和计划 当规划改进或其他倡议时&#xff0c;了解当前状态至关重要。这使组织能够&#xff1a; ● 比较当前状态与期望的未来状态&#xff1b; ● 找出两个状态之间的差距&#xff1b; ● 开发符合逻辑的计划以弥补这些差距。 3.1 评估的基础 评估用于测量、分析…

Slim-neck by GSConv:自动驾驶车辆检测器架构的更好设计范式(文末附代码)

Slim-neck by GSConv:自动驾驶车辆检测器架构的更好设计范式 摘要引言相关工作本文方法GSConv的优势在于轻量级检测器&#xff0c;这些检测器通过添加DSC层和Shuffle来增加非线形表达能力。但是&#xff0c;如果GSConv在模型的所有阶段都使用&#xff0c;模型的网络层会变得更深…

Django系列:Django开发环境配置与第一个Django项目

Django系列 Django开发环境配置与第一个Django项目 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1328…

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时&#xff0c;如何在减少数据量的同时&#xff0c;保证或提升数据质量是一大挑战。以下为一些提升数据质量的方法分析&#xff1a; 改进几何简化算法&#xff1a;在进行几何简化…