SpringCloud Alibaba Nacos 服务注册和配置中心

一、前言

        接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十二篇,即介绍 SpringCloud Alibaba Nacos 服务注册和配置中心。

二、Nacos 简介

2.1 为什么叫 Nacos

        前四个字母分别为 Naming Configuration 的前两个字母,最后的 sService

2.2 Nacos 是什么

        Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

        Nacos 就是注册中心 + 配置中心的组合等价于 Eureka + Config  + Bus

2.3 作用

        替代 Eureka 做服务注册中心,替代 Config 做服务配置中心。

三、安装并运行 Nacos

3.1 前提

        确保本地有 Java8 Maven环境。

3.2 下载

        在官网下载合适的版本,如下图:

3.3 安装

        解压安装包,进入到 bin 目录下切换命令行,执行 startup.cmd -m standalone 命令即可,如下图:

3.4 测试

        命令运行成功后直接访问 http://localhost:8848/nacos,如下图:

        用户名和密码都是 nacos ,登录进去,如下:

四、Nacos作为服务注册中心演示

4.1 基于 Nacos 的服务提供者

4.1.1 创建工程

        创建一个服务提供者 cloudalibaba-provider-payment9001 模块,pom.xml 内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>SpringCloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloudalibaba-provider-payment9001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

        我们可以这样引入的前提是:父工程引入了 alibaba 相关的依赖,如下:

<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.1.0.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

        application.yml 内容如下所示:

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

        主启动类的代码如下所示:

package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001
{
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

        业务类 PaymentController,代码如下所示:

package com.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}

4.1.2 测试

        启动 cloudalibaba-provider-payment9001 模块,访问 http://localhost:9001/payment/nacos/1,如下图:

        打开 nacos 的控制台,可以看到服务注册的信息,如下图:

4.1.3 创建工程

        为了后面测试负载均衡,我们按照创建 9001 工程的步骤,再创建一个 9002 的工程,创建的步骤这里不再赘述。等到创建成功后,启动,打开 nacos 管理界面,如下图:

4.2 基于 Nacos 的服务消费者

4.2.1 创建工程

        创建一个服务消费模块 cloudalibaba-consumer-nacos-order83pom.xml 内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>SpringCloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloudalibaba-consumer-nacos-order83</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

        application.yml 内容如下所示:

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848


#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

        主启动类的代码如下所示:

package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83
{
    public static void main(String[] args)
    {
        SpringApplication.run(OrderNacosMain83.class,args);
    }
}

        配置类的代码如下所示:

package com.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextBean
{
    @Bean
    // 设置支持负载均衡
    @LoadBalanced
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

         业务类 controller 的代码如下所示:

package com.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
public class OrderNacosController
{
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id)
    {
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }

}

4.2.2 测试

        启动 cloudalibaba-consumer-nacos-order83 模块,打开 nacos 管理界面,如下图:

        在浏览器输入 http://localhost:83/consumer/payment/nacos/13,测试负载均衡,如下图:

        可以看到,实现了负载均衡的功能,Nacos 天生支持负载均衡的功能,如下图:

4.3 服务注册中心对比

4.3.1 Nacos 全景图

        Nacos 想要全景覆盖,每一种技术都想支持

4.3.2 Nacos 和 CAP

4.3.2 CP 和 AP 切换

        C 是所有节点在同一时间看到的数据是一致的;而 A 的定义是所有的请求都会收到响应。

        何时选择使用何种模式?一般来说,如果不需要存储服务级别的信息且服务实例是通过 nacos-client 注册,并能够保持心跳上报,那么就可以选择 AP 模式。当前主流的服务如 Spring cloudDubbo 服务,都适用于 AP 模式,AP 模式为了服务的可能性而减弱了一致性,因此 AP 模式下只支持注册临时实例。

        如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S 服务和 DNS 服务则适用于 CP 模式。CP 模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

        Nacos 支持 APCP 模式的切换,切换的命令为:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

五、Nacos 作为服务配置中心演示

5.1 Nacos 作为配置中心-基础配置

5.1.1 创建工程

        创建一个 cloudalibaba-config-nacos-client3377 模块用来演示配置中心,pom.xml 内容如下所示,只是多了一个 nacos-config 的配置。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>SpringCloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基础配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

        创建两个配置文件 application.yml bootstarp.yml,为什么创建两个呢?因为 Nacos springcloud-config 一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

        springboot 中配置文件的加载是存在优先级顺序的,bootstrap 优先级高于 application

        bootstarp.yml 的内容如下所示,里面标识出来了注册中心的地址和配置中心的地址,并标识除了读取哪种类型结尾的文件。

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置


  # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

        application.yml 内容如下所示:

spring:
  profiles:
    active: dev # 表示开发环境

        主启动类的代码如下所示:

package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

        业务类 controller 的代码如下所示:

package com.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
// 在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
@RefreshScope 
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

5.1.2 Nacos 中添加配置信息

        我们想实现动态的获取远程配置文件的最新值,我们可以在 nacos 中添加配置信息,然后再获取。

        Nacos 中的 dataid 的组成格式及与 SpringBoot 配置文件中的匹配规则,官网的地址在这,匹配规则如下:

        最后的公式可以总结为:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

        打开 nacos 的管理界面,新增一个配置,如下图:

        总结起来就是如下图:

5.1.3 测试

        运行 cloud-config-nacos-client3377 的主启动类,调用接口查看配置信息:http://localhost:3377/config/info,如下图:

        修改下 Nacos 中的 yaml 配置文件,再次调用查看配置的接口,就会发现配置已经刷新,如下图:

5.1.4 历史配置

        Nacos 会记录配置文件的历史版本默认保留 30 天,此外还有一键回滚功能,回滚操作将会触发配置更新。

5.2 Nacos 作为配置中心-分类配置

5.2.1 问题

        实际开发中,通常一个系统会准备 dev 开发环境、test 测试环境、prod 生产环境。如何保证指定环境启动时服务能正确读取到 Nacos 上相应环境的配置文件呢?

        一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......那怎么对这些微服务配置进行管理呢?

5.2.2 解决方案

        我们可以在 Nacos 的图形化管理界面通过配置命名空间、Group Data Id 来解决上述的问题。

5.2.3 设计原因

        Namespace+Group+Data ID 三者关系?为什么这么设计?这三者之间的关系类似于 Java 里面的 package 名和类名,最外层的 namespace 是可以用于区分部署环境的,Group DataID 逻辑上区分两个目标对象。如下图:

        默认情况:Namespace=publicGroup=DEFAULT_GROUP,默认 Cluster DEFAULT

        Nacos 默认的命名空间是 publicNamespace 主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace,不同的 Namespace 之间是隔离的。

        Group 默认是 DEFAULT_GROUPGroup 可以把不同的微服务划分到同一个分组里面去。

        Service 就是微服务;一个 Service 可以包含多个 Cluster(集群),Nacos 默认 ClusterDEFAULTCluster 是对指定微服务的一个虚拟划分。比方说为了容灾,将 Service 微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的 Service 微服务起一个集群名称 HZ,给广州机房的 Service 微服务起一个集群名称 GZ,还可以尽量让同一个机房的微服务互相调用,以提升性能。

        最后是 Instance,就是微服务的实例。

5.2.4 DataID 方案

        指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置,新建 pro 配置 DataID,如下图:

        新建 test 配置 DataID,如下图:

        通过 spring.profile.active 属性就能进行多环境下配置文件的读取,如下:

        输入 http://localhost:3377/config/info,进行测试,如下:

5.2.5 Group 方案

        可以通过 Group 实现环境区分,新建一个 Group,如下图:

        在 nacos 图形界面控制台上面新建配置文件 DataID,如下图:

        接下来在 config 下增加一条 group 的配置即可。可配置为 DEV_GROUP TEST_GROUP 

         输入 http://localhost:3377/config/info,进行测试,如下:

5.2.6 Namespace 方案

        新建 dev test 的 Namespace,如下图:

        接下来回到服务管理-服务列表查看,如下图:

        按照域名配置填写,如下图:

        在 bootstarp.yml 中添加 namespace 的属性,如下,值为上图生成的 id

          输入 http://localhost:3377/config/info,进行测试,如下:

 六、Nacos 集群和持久化配置

6.1 官网说明

6.1.1 架构图说明

        官网的地址在这,官网的架构图如下所示:

        看上面的架构图可能看的不是很懂,如果翻译一下,可能会更懂一些,翻译过来就是下面的这张图,如下:

6.1.2 重点说明

        默认 Nacos 使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的 Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos 采用了集中式存储的方式来支持集群化部署,目前只支持 MySQL 的存储。下图摘抄自官网。

6.2 Nacos 持久化配置解释

6.2.1 默认数据库

        Nacos 默认自带的是嵌入式数据库 derby

6.2.2 数据库切换

        derby mysql 切换配置步骤,首先在安装包的 nacos\conf 目录下找到 sql 脚本,如下:

        在 mysql 的客户端中执行里面的 sql 脚本,执行完毕后如下图:

        修改 nacos\conf 目录下的 application.properties 文件,填写自己的数据库信息,如下:

        修改完毕后重新启动 nacos,然后打开 nacos 的管理界面,如下图,可以看见,我们以前创建的配置列表都没有了,证明切换成功了。

6.3 Linux 版 Nacos + MySQL 生产环境配置

        我们此次搭建 1Nginx + 3nacos 注册中心 + mysql

ip 地址用途
192.168.229.1Mysql 数据库服务器
192.168.229.166安装 nacos 节点
192.168.229.169安装 nacos 节点
192.168.229.172安装 nacos 节点和 Nginx

6.3.1 Nacos 下载 Linux 版

        下图摘抄自官网,可以从官网选取合适的 linux 版本,下载完成后拷贝到 linux 环境里面,如下图:

        分别拷贝三份到不同的服务器里面,并解压安装包并将解压后的文件拷贝到 opt 文件夹下,如下图: 

6.3.2 集群配置

6.3.2.1 mysql 数据库配置

        首先确保你的数据库的版本为 5.x 版本,若为 8.0 版本可能会出问题。

        然后进行 linux 服务器上 mysql 数据库配置,sql 语句在如下的位置

        运行上面的 mysql 数据库脚本,会创建一个 nacos_config 的数据库,如下:

6.3.2.2 application 配置

        分别修改三个服务器上的 /opt/nacos/conf/application.properties 文件,位置如下:

        在配置文件中添加如下的内容,修改完成后记得保存退出

spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://192.168.229.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
6.3.2.3 集群配置

        接下来需要修改 cluster.conf 配置文件,文件位置如下所示:

        每台服务器都需要添加一样的内容,内容如下:

192.168.229.166:8848
192.168.229.169:8848
192.168.229.172:8848

6.3.2.4 启动验证

        在启动 nacos 之前,先将虚拟机里面三台服务器的防火墙关掉,命令如下:

systemctl status firewalld

systemctl stop firewalld

        分别启动三台服务器里面的 nacos,如下图:

        可以输入 tail -f /opt/nacos/logs/start.out  命令来查看日志的输出,当出现下面的提示时,就证明启动成功了。

        然后在浏览器分别访问刚刚开启的这三台 nacos,如下图:

6.3.2.5 nginx 配置

        Nginx 的下载和安装,请参考我的这篇博客,安装完成后,进入到 conf 文件夹下,准备修改 nginx.conf 配置文件,如下图:

        修改的内容如下图: 

        修改完成后,启动 nginx,如下图:

        在浏览器输入 http://192.168.229.172:1111/nacos,如下图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++初阶:vector相关练习

目录 1. 只出现一次的数2. 杨辉三角3. 删除有序数组中的重复项4. 只出现一次的数II5. 只出现一次的数III6. 数组中出现次数超过一半的数7. 电话号码的字母组合&#xff08;多叉树遍历&#xff09; 1. 只出现一次的数 题目信息&#xff1a; 题目链接&#xff1a; 只出现一次的数…

【python】flask服务端响应与重定向处理

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Leetcode 3.15

Leetcode hot100 二叉树1.二叉搜索树中第K小的元素2.二叉树展开为链表3.从前序与中序遍历序列构造二叉树 二叉树 1.二叉搜索树中第K小的元素 二叉搜索树中第K小的元素 最重要的知识点&#xff1a;二叉树搜索树的中序遍历是升序的。 方法一&#xff1a;我们只需存储升序遍历&…

【蓝桥杯备赛】Day15:递推与递归(倒计时23天)

题目1:题目 2335: 信息学奥赛一本通T1422-活动安排 设有n个活动的集合E{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;如演讲会场等&#xff0c;而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi…

管易云·奇门对接打通金蝶云星空发货单查询接口与销售出库新增接口

管易云奇门对接打通金蝶云星空发货单查询接口与销售出库新增接口 ​​ ​​ 对接源平台:管易云奇门 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-W…

HarmonyOS卡片刷新服务,信息实时更新一目了然

如今衣食住行娱乐影音等App占据了大多数人的手机&#xff0c;一部手机可以满足日常大多需求&#xff0c;但对需要经常查看或进行简单操作的场景来说&#xff0c;总需要用户点开App操作未免过于繁琐。 针对该问题&#xff0c; HarmonyOS SDK为用户提供了Form Kit&#xff08;卡…

为啥很多人觉得编程难学?

看到推特上网友菜脯写的一条推文&#xff1a; 菜脯&#xff1a;我大概知道&#xff0c;为啥很多人觉得编程难学了。 因为对我来说&#xff0c;编程过程就是 看资料——开始写——遇到问题——查资料——解决问题——继续写——继续遇问题——继续查资料… 这个循环似乎会一直持…

Retrieval Augmented Thoughts(RAT):检索增强思维,实现长视野生成中的上下文感知推理

论文地址&#xff1a;https://arxiv.org/pdf/2403.05313.pdf 原文地址&#xff1a;rat-retrieval-augmented-thoughts Github&#xff1a;Implementation of RAT 2024 年 3 月 14 日 介绍 让我首先从一些一般性观察开始...... 在生成式人工智能应用程序中实现效率与生成响应…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2010-3863)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.1.0以前的版本中&#xff0c;shiro 进行权限验证前未对url 做标准化处理&#xff0c;攻击者可以构造/、//、…

YOLOV9训练自己的数据集

1.代码下载地址GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 2.准备自己的数据集 这里数据集我以SAR数据集为例 具体的下载链接如下所示&#xff1a; 链接&#xff1a;https:/…

广州市高质量发展大会,东纺企服系统提出数智化新思路

近日&#xff0c;广州市海珠区凤阳街道高质量发展大会暨企业联盟沙龙荟在海珠区珠江国际纺织城D区6楼时尚馆召开。东纺科技作为海珠区企业代表&#xff0c;受邀出席参与活动。 本次大会对今年的高质量发展进行亮诺和展望。海珠区委常委、区纪委书记、区监委主任杨清谦以及海珠区…

【环境搭建和安装】thingsboard二次开发环境搭建

文章目录 1.安装JAVA2.安装maven环境3.安装nodeJS4.安装git环境5.安装npm依赖关系 提示&#xff1a; 1.我自己下载存放路径比较混乱&#xff0c;下载的文件尽量在一个新建的文件夹存放&#xff0c;目录全英更好。 2.环境是为了开源物联网平台&#xff0c;环境搭建和安装部署是成…

ETH网络 之 Gas花费实例

求关注&#xff0c;关注我&#xff0c;一起进入Web3的世界 前文回顾 GasBaseFee & PriorityFee部署ERC-721 交易Gas解析 部署NFT的交易 钱包Gas解读 费用清单 ItemValueDesc基础费用(BaseFee)0.102349622 Gwei基础费用是动态的&#xff0c;我们发送交易时是不确定的&…

想进阿里?先了解这个!@SpringMybatis注解面试解析

如有疑问或者更多的技术分享,欢迎关注我的微信公众号“知其然亦知其所以然”! 嗨,大家好!我是小米,今天要和大家聊一聊阿里巴巴面试题中的一个热门话题:@SpringMybatis注解。如果你是一个对技术充满好奇心的小伙伴,那么这篇文章一定会给你带来不少启发和收获! 在开始…

1、编写jsp文件,熟悉jsp页面的基本结构H编写看电影2、编写jsp文件,熟悉jsp动作标记、param传值的使用,计算机三角形的面积。

1、看电影 watchMovie.jsp: <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert ti…

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…

41 物体检测和目标检测数据集【李沐动手学深度学习v2课程笔记】

目录 1. 物体检测 2. 边缘框实现 3.数据集 4. 小结 1. 物体检测 2. 边缘框实现 %matplotlib inline import torch from d2l import torch as d2ld2l.set_figsize() img d2l.plt.imread(../img/catdog.jpg) d2l.plt.imshow(img);#save def box_corner_to_center(boxes):&q…

小白向软件开发教学实战:企业培训APP的设计与开发

随着信息技术的迅猛发展&#xff0c;软件开发已经成为了一个日益重要的技能。无论是个人还是企业&#xff0c;都希望能够掌握一定的软件开发能力&#xff0c;以满足自身的需求。尤其是在企业培训领域&#xff0c;定制化的软件应用能够提高培训效率和质量。 一、需求分析 在设计…

Vue.js前端开发零基础教学(二)

目录 前言 2.1 单文件组件 2.2 数据绑定 2.2.2 响应式数据绑定 2.3 指令 2.3.1 内容渲染指令 2.3.2 属性绑定指令 ​编辑 2.3.3 事件绑定指令 2.3.4 双向数据绑定指令 2.3.5 条件渲染指令 2.3.6 列表渲染指令 2.4 事件对象 2.5 事件修饰符 学习目标&am…

#Linux(帮助手册)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;键入命令man man查看手册目录&#xff08;按q退出&#xff09; &#xff08;2&#xff09;查看手册需要先安装依赖包&#xff08;root权限安…