SpringBoot动态配置Nacos

news2024/11/15 13:46:52

重要知识点

  • Nacos属性的简单使用
  • 将SpringBoot中的所有配置全部放入到Nacos中
  • 开发人创建单独的命名空间,修改互不影响
  • Nacos经常变动的配置抽离到外部文件中

将项目中的所有配置全部放到到

1. 首先引入包

		<!-- nacos 接入-->
           <!-- https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter -->
           <dependency>
               <groupId>com.alibaba.boot</groupId>
               <artifactId>nacos-config-spring-boot-starter</artifactId>
               <version>最新版本号</version>
           </dependency>

2. 配置Nacos的配置文件

  • 主配置; 主要是加载 静态配置 文件的; SpringBoot在启动的时候会先去Nacos中读取配置文件然后加载到Environment中; 静态配置不启用自动刷新;
 
#(下面的配置中只需要吧对应的data-ids、group、data-id 、server-addr、namespace修改为对应数据)#

## -----------------静态文件配置(启动的时候最优先加载 log-enable: true)-------------- ##
nacos:
  config:
    bootstrap:
      log-enable: true # 支持日志级别的加载时机(如果需要集成dubbo,请使用此配置加载时机)
      enable: true # 设置参数nacos.config.bootstrap.enable=true,开启配置预加载功能

    max-retry: 10 # 主配置 最大重试次数
    auto-refresh: false # 主配置 是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
    config-retry-time: 3000 # 主配置 重试时间
    config-long-poll-timeout: 30000 # 主配置 配置监听长轮询超时时间
    enable-remote-sync-config: false # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
    #允许nacos上的配置优先于本地配置; 意思是:如果nacos配置了某属性,然后在本地的application.yml配置了相同属性;那么会以nacos配置的优先;否则是本地的优先
    remote-first: true


    # 主配置 data-ids  (可以配置多个,如果多个配置文件中有相同的 属性 则优先取最前面的值)
    data-ids: application-static.properties,logback-static.xml
    group: PROJECT_EXAMPLE # 主配置 group-id
    type: yaml # 主配置 配置文件类型
    server-addr: 127.0.0.1:8848
    namespace: # 命名空间
    name: nacos
    password: nacos

上面的静态配置修改最后面的几个属性就行了;

  • 动态配置 动态配置有两种配置 一种是在yml配置文件中配置
nacos:
  config:
    ext-config[0]:
      data-id:  dynamic.properties
      group: PROJECT_EXAMPLE
      #namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间
      # 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
      auto-refresh : true
      type: properties  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

    ## 如果还想加载其他的配置  copy一下 数组改成1 例如ext-config[1]

    ext-config[1]:
      data-id:  dynamic.yaml
      group: PROJECT_EXAMPLE
      #namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间
      # 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
      auto-refresh: true
      type: yaml  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

一种用注解的形式@NacosPropertySource 例如上面的动态配置跟下面效果一样

 
@NacosPropertySource(dataId = "dynamic.properties",groupId = "PROJECT_EXAMPLE",type = ConfigType.PROPERTIES,autoRefreshed = true)
@NacosPropertySource(dataId = "dynamic.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML,autoRefreshed = true)

两者的区别: @NacosPropertySource不可以单独指定namespace; 配置文件的方式可以单独指定namespace ; 如果他们都不指定的话,默认继承自 主配置中的namespace配置

3.Nacos的简单应用

3.1 使用@NacosConfigurationProperties将配置绑定到对象中

例子:

/**
 * @author shirenchuang
 * @date 2020/10/20  9:56 上午
 *
 * 将配置中的 list 和listMap 解析并绑定到这个对象中
 * 并可以使用 @Autowired注解使用这个对象
 *
 * nacos中的配置:
 *
 * test.list:
 *     - 1
 *     - 2
 *     - 3
 *     - 4
 * test.listMap:
 *     key-1:
 *         - 1
 *         - 2
 *         - 3
 *         - 4
 *     key-2:
 *         - aa
 *         - dd
 *         - ee
 *         - rr
 *
 *
 */

@NacosConfigurationProperties( prefix = "test1",dataId = "test.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML, autoRefreshed = true)
@Configuration
public class Apple {

    private List<String> list;

    private Map<String, List<String>> listMap;

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, List<String>> getListMap() {
        return listMap;
    }

    public void setListMap(Map<String, List<String>> listMap) {
        this.listMap = listMap;
    }

    @Override
    public String toString() {
        return "Apple{" + "list=" + list + ", listMap=" + listMap + '}';
    }
}

使用的时候就直接用注解@Autowired可以直接使用

@Autowired private Apple apple;
3.2 使用@NacosValue获取属性
    // 是否自动刷新属性 必须在每个属性上都要标注
    @NacosValue(value = "${name:66}",autoRefreshed = true)
    private String name;

如果属性值不存在就取 冒号 后面的默认值;

3.3 也可以使用@Value来获取Nacos配置中的属性值
    @NacosValue(value = "${spring.datasource.url}",autoRefreshed = true)
    private String url;

    @Value(value = "${spring.datasource.url}")
    private String url2;

例如上面的spring.datasource.url的属性是配置在nacos中的;但是上面两个注解都正常打印出来了它的值,为什么呢?@Value是从Spring容器中的Environment中获取对应的属性值,但是在启动Nacos的时候就把数据给加载到了Environment中去了; 所以通过@Value也能获取到属性值; 但是它跟@NacosValue的区别是, 它不能够实时刷新数据; 它的值一直都是启动时候第一遍加载的数据 所以我们也可以用@Value来获取我们在Nacos中配置的静态数据;作用是一样的 【SpringBoot】配置文件的加载与属性值的绑定

4.将Nacos一部分配置移动到外部文件中

我们在开发过程中,会经常涉及到配置文件的改动; 还有发布的时候不同环境用不同的配置; 这些配置写在项目的属性文件里面不太妥当; 最好是能够单独拎出来;

例如上面主配置中的 几个属性在不同环境中会经常频繁改动;那我们把他们单独拎出来存放到外部配置文件中;

在这里插入图片描述

Spring中读取外部配置文件的方式有很多;但是有一点很重要;就是加载时机的问题 例如@PropertySource()这个注解基本上是等容器都启动完成的时候才去解析的; 那么我们启动项目的时候是一开始就加载了Nacos的; 就必须我们在加载Nacos的配置文件之前就必须把Nacos需要的配置数据准备好并加载到 Environment 中去; 相关知识点可以参考: 【Spring Boot 四】启动之准备系统环境environmentPrepared 【SpringBoot】SpringBoot启动流程图和扩展点说明

那么最终决定我们可以选择 实现一个 EnvironmentPostProcessor扩展类;

NacosEnvPostProcessor扩展类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;

import java.io.IOException;

/**
 * @author shirenchuang
 * @date 2020/7/22  4:58 下午
 *
 * 这个优先级必须要比 NacosConfigEnvironmentProcessor 的优先级高
 * 不然的话 NacosConfigEnvironmentProcessor 执行的时候 会取不到 Nacos的这几个配置属性
 * 将文件中的属性放到 系统环境变量中; 优先级只会比StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME低
 */



import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.logging.DeferredLog;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import org.springframework.util.StringUtils;

import java.io.IOException;

/**
 * @author shirenchuang
 * @date 2020/7/22  4:58 下午
 * 在最初的时候将 外部配置文件属性加载到容器中
 *
 * 这个优先级必须要比 NacosConfigEnvironmentProcessor 的优先级高
 * 不然的话 NacosConfigEnvironmentProcessor 执行的时候 会取不到 Nacos的这几个配置属性
 * 将文件中的属性放到 系统环境变量中; 优先级只会比StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME低
 */


public class ExternalFilePostProcessor implements EnvironmentPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {


    /**
     * 这个时候Log系统还没有初始化  使用DeferredLog来记录  并在onApplicationEvent进行回放
     * */
    private static final DeferredLog LOGGER = new DeferredLog();

    private  ResourceLoader resourceLoader = new DefaultResourceLoader();




    @Override
    public int getOrder() {
        return 0;
    }


    /**
     * 将文件中的nacos配置文件 加载到 environment中;
     * 方便Nacos可以拿到 静态配置
     *
     * @param environment
     * @param application
     */

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        String filePath = environment.getProperty("nacos_file_path");
        if(StringUtils.isEmpty(filePath)){
            LOGGER.info("\n [----未配置外部属性路径-----] \n");
            return;
        }
        String resolvedLocation = environment.resolveRequiredPlaceholders(filePath);
        resolvedLocation = "file:"+resolvedLocation;
        PropertySourceFactory factory = new DefaultPropertySourceFactory();
        Resource resource = this.resourceLoader.getResource(resolvedLocation);
        try {
            addPropertySource(factory.createPropertySource(filePath, new EncodedResource(resource)),environment);
        } catch (IOException e) {
            LOGGER.error(" 外部配置路径 - Properties location [" + filePath + "] not resolvable: " + e.getMessage());
        }


    }

    private void addPropertySource(PropertySource<?> propertySource,ConfigurableEnvironment environment) {
        MutablePropertySources propertySources = environment.getPropertySources();
        //添加到 systemEnvironment  优先级只比 系统属性 和命令行属性等等的低
        propertySources.addAfter(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, propertySource);
    }


    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        LOGGER.replayTo(ExternalFilePostProcessor.class);
    }
}

然后配置一下spring.factories;

org.springframework.boot.env.EnvironmentPostProcessor=com.daimler.example.service.common.NacosEnvPostProcessor

在这里插入图片描述

相关知识点 【SpringBoot 二】spring.factories加载时机分析

然后本地创建一个文件 aml

在yml中配置文件路径

#nacos 的基本配置(放在服务器本地文件上, 包含  nacos.config.server-addr、 nacos.config.namespace、 username、password)
nacos_file_path: /**/**/nacos_static/project_example-nacos.properties
Spring中实现上面的功能没有那么复杂
@EnableNacosConfig(globalProperties = @NacosProperties(username = "${nacos.config.username}", password = "${nacos.config.password}",
    serverAddr = "${nacos.config.server-addr}",namespace = "${nacos.config.namespace}"   ))
@NacosPropertySource(dataId = "dynamic.yaml",groupId = "PROJECT_EXAMPLE",type = ConfigType.YAML,autoRefreshed = true)
public class NacosConfig {

}


@Configuration
@PropertySource(value = "file:/etc/nacos.properties")
@ComponentScan(basePackages = "com.xx")
@Import( value = {NacosConfig.class})
public class SpringConfig {

}

然后外部配置文件配置 aml

5.每个开发人员一套自己的配置

在本地开发过程中,我们可能会经常修改配置文件;但可能改了之后会影响到别人;就有这样的需求;我改配置的时候 只影响我自己;

我们可以看到上面的配置中 有一个配置 nacos.config.namespace= ; 这个是命名空间;通过这样一个属性我们可以应用不同的配置;

具体用法

  • 新建一个属于自己的命名空间 在这里插入图片描述
  • 将需要克隆的配置 从指定空间克隆到自己刚刚创建的空间 在这里插入图片描述
  • 将自己本地nacos属性配置的namespace 改成自己刚刚创建的命名空间id(注意是 ID)
  • 重新启动,搞定!

完整的yml配置

#nacos 的基本配置(放在服务器本地文件上, 包含  nacos.config.server-addr、 nacos.config.namespace、 username、password)
nacos_file_path: /**/**/nacos_static/project_example-nacos.properties



#(下面的配置中只需要吧对应的data-ids、group、data-id 修改为对应数据)#

## -----------------静态文件配置(启动的时候最优先加载 log-enable: true)-------------- ##
nacos:
  config:
    bootstrap:
      log-enable: true # 支持日志级别的加载时机(如果需要集成dubbo,请使用此配置加载时机)
      enable: true # 设置参数nacos.config.bootstrap.enable=true,开启配置预加载功能

    max-retry: 10 # 主配置 最大重试次数
    auto-refresh: false # 主配置 是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
    config-retry-time: 3000 # 主配置 重试时间
    config-long-poll-timeout: 30000 # 主配置 配置监听长轮询超时时间
    enable-remote-sync-config: false # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
    #允许nacos上的配置优先于本地配置; 意思是:如果nacos配置了某属性,然后在本地的application.yml配置了相同属性;那么会以nacos配置的优先;否则是本地的优先
    remote-first: true


    # 主配置 data-ids  (可以配置多个,如果多个配置文件中有相同的 属性 则优先取最前面的值)
    data-ids: 静态配置1,静态配置2,logback.xml
    group: 自己的group # 主配置 group-id
    type: yaml # 主配置 配置文件类型


    ## ---------------如果 使用配置方式就是下面的; 如果用@NacosPropertySource注解方式就删掉下面的 ---------------------------  ##
    ext-config[0]:
      data-id:  自己的data-id
      group: 自己的group
      #namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间
      # 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
      auto-refresh : true
      type: properties  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

    ## 如果还想加载其他的配置  copy一下 数组改成1 例如ext-config[1]

    ext-config[1]:
      data-id:  自己的data-id
      group: 自己的group
      #namespace:  # 命名空间 该属性如果为空 或者注释该属性  会继承主属性的命名空间
      # 该属性不继承上面的主配置    是否开启自动刷新 (false:不监听属性变化,true:监听属性变化,但是对应的属性注解上也必须设置autoRefreshed = true才可以实时更新)
      auto-refresh: true
      type: yaml  # 类型 {@link com.alibaba.nacos.api.config.ConfigType}

外部配置文件 /**/**/nacos_static/project_example-nacos.properties

# 主配置服务器地址
   nacos.config.server-addr=127.0.0.1:8848
   nacos.config.username=nacos
   nacos.config.password=nacos
   # 命名空间 (空为默认的public)
   nacos.config.namespace=

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

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

相关文章

网络安全服务基础Windows--第14节-数字签名

散列函数&#xff08;Hash Function&#xff09;&#xff0c;也称为哈希函数&#xff0c;是密码学中⼀个重要的⼯具。它能够将任意⻓度的输⼊数据转换为固定⻓度的输出&#xff08;散列值或哈希值&#xff09;。这种转换过程具有单向性&#xff0c;即很难从输出推断出输⼊&…

uniapp scroll-view滚动页面

页面滚动固定距离&#xff08;scrollTop&#xff09; <template><view><button click"Test">测试</button><scroll-view style"height: 100px;" :scroll-top"scrollTop" scroll-y"true" class"scrol…

大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Cadence Virtuoso添加工艺库、转换工艺库格式

系统环境&#xff1a;Red Hat 操作软件&#xff1a;Virtuoso 工艺库&#xff1a;tsmc18rf 1、准备好工艺库文件&#xff0c;放在任意文件夹内&#xff0c;记住文件路径&#xff1a; 2、打开Virtuoso软件&#xff1a; 在桌面右键打开终端&#xff0c;输入&#xff1a; virtuo…

Web3D 技术发展瓶颈在哪里?

Web3D 技术的发展瓶颈主要集中在以下几个方面&#xff1a; 1、性能和优化&#xff1a;尽管现代浏览器和硬件逐步提高了性能&#xff0c;但高质量的3D渲染仍可能导致性能瓶颈。特别是在移动设备上&#xff0c;图形渲染和计算可能会受到限制。建议合理控制好项目资源量&#xff…

DataGridView用法合集【精品】

1.当前的单元格属性取得、变更 [VB.NET] Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex) Console.WriteLine(DataGridView1.CurrentCell.RowIndex) DataGridView1.CurrentCell DataGridView1(0, 0) [C#] Con…

毕业设计选题系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《毕业设计选题系统》。 毕业论文选题是大学教学管理中的重要环节&#xff0c;关系到高校的教学质量。传统的手工管理方式工作效率低下、管理繁琐&#xff0c;浪费教师和学生的时间与精力的问题。本系统以提高…

鸿蒙HarmonyOS使用地图服务

1. 生成签名证书指纹 按照步骤生成签名证书指纹 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a;Key store file为生成的*.p12文件的存储路径&#xff0c;可以自己选择路径并自定义文件名&#xff0c;输入并确认密码后&#xff0c;点击确认 步骤4&#xff1a;Key s…

代码随想录算法day28 | 动态规划算法part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、 746. 使用最小花费爬楼梯

理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪…

关于位结构体及位操作总结

#include <stdio.h> #pragma pack(1) struct stu{char a:4; // a占用char的低4位 char b:4; // b占用char的高4位&#xff08;注意&#xff0c;这里实际上是与a共享同一个char的空间&#xff09; }; #pragma pack(4) int main() {struct stu s{.a2, //a:0010.b3, …

如何对单片机程序进行加密(防止别人破解)

单片机程序的破解无非就是非法途径获得源代码或者可执行文件&#xff08;hex文件&#xff09;。本文主要介绍两个方法防止别人从单片机fash中获取可执行文件&#xff08;hex文件&#xff09;。一方面保证别人不能获取你的hex文件&#xff0c;另一面就算别人非法获取你的hex文件…

Windows下的Redis启动报错Redis service failed to start

报错原因&#xff1a;Redis服务没有找到log文件 解决方案&#xff1a; 1、在Redis目录下打开redis.windows-service.conf文件 2、找到logfile存放目录&#xff0c;一般默认为Logs/redis_log.txt 3、在Redis目录创建Logs文件夹&#xff0c;在Logs文件夹下创建redis_log.txt文件…

工业图像输出卡设计原理图:FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡

FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡 一、板卡概述   基于FMC兼容1.8V IO的Full Camera Link 输出子卡支持Base、Middle、Full Camera link信号输出&#xff0c;兼容1.8V、2.5V、3.3V IO FPGA信号输出。适配xilinx不同型号开发板和公司内部各FMC载板。板…

Flutter修改Android包名

一、前言 我在将Android打包上传到google商店的时候提示我“com.example”已受到限制&#xff0c;请换一个软件包名称。“的错误。因此我们需要去修改flutter的Android包名。 二、操作流程 1.修改路径 android ——> app ——> src ——> debug ——> AndroidMa…

LearnOpenGL学习笔记

LearnOpenGL学习笔记 入门认识OpenGL核心模式和立即渲染模式扩展状态机对象 创建窗口视口渲染循环释放资源输入事件渲染 你好&#xff0c;三角形基本概念顶点输入顶点着色器编译着色器片段着色器链接顶点属性顶点数组对象索引缓冲对象 着色器GLSL数据类型输入与输出Uniform 纹理…

深度学习从入门到精通——yolov3算法介绍

YOLO v3 论文地址&#xff1a;https://pjreddie.com/media/files/papers/YOLOv3.pdf论文&#xff1a;YOLOv3: An Incremental Improvement 先验框 (1013)&#xff0c;(1630)&#xff0c;(3323)&#xff0c;(3061)&#xff0c;(6245)&#xff0c;(59 119)&#xff0c; (116 9…

C++代码规范 头文件

1. 头文件 通常每个 .cc 文件应该有一个配套的 .h 文件. 常见的例外情况包括单元测试和仅有 main() 函数的 .cc 文件. 正确使用头文件会大大改善代码的可读性和执行文件的大小、性能. 下面的规则将带你规避头文件的各种误区. 1.1. 自给自足的头文件 Tip 头文件应该自给自…

[某度信息流]SQL164,2021年11月每天新用户的次日留存率

牛客网在线编程 思路&#xff1a; 首先找出用户的注册日期&#xff0c;即date(min(in_time)) 转成date形式 建立两个辅助表&#xff0c;我先放代码&#xff0c;然后进行解释 withuser_reg as (selectuid,date(min(in_time)) as first_datefromtb_user_loggroup by1),…

【路径规划】在二维环境中快速探索随机树和路径规划的示例

摘要 本文介绍了快速探索随机树&#xff08;Rapidly-exploring Random Tree, RRT&#xff09;算法在二维环境中的路径规划应用。RRT是一种随机采样算法&#xff0c;能够快速构建从起点到目标点的路径&#xff0c;特别适用于复杂环境中的机器人路径规划。通过在随机方向上扩展树…

Vue3实时更新时间(年-月-日 时:分:秒)

代码案例 <script lang"ts" setup> import { ref,onMounted } from vue; const timer ref() const date ref("")//年月日 const moreTime ref("")//时分秒 onMounted(()>{//创建定时器1秒执行一次timer.value setInterval(() >…