【实战指南】SpringBoot结合Zookeeper/Nacos构建Dubbo微服务

1、微服务架构

微服务架构是一种设计复杂应用程序的方法,它提倡将单一应用程序开发为一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级通信(通常是HTTP协议)进行交互。每个服务都是围绕业务功能构建的,能够独立部署、扩展和维护。

上述说常用的服务间通信的协议是HTTP协议,但是目前很多公司里也会使用Dubbo作为RPC调用框架。

HTTP协议是存在于ISO模型中的应用层,应用层实现具体的应用功能,为应用程序提供服务。
Dubbo则是基于TCP协议的RPC架构,而TCP协议处于ISO模型的传输层,传输层只是建立、管理和维护端到端的连接。

所以在请求的过程中,TCP协议会比HTTP协议封装更少的内容,速度也比HTTP会快一些。

在这里插入图片描述

微服务核心特点:

  1. 模块化:微服务架构强调高内聚低耦合,每个服务专注于执行单一业务功能,这使得系统更易于理解和维护。
  2. 独立部署:每个微服务都可以独立于其他服务进行构建、测试、部署和扩展,减少了部署时的相互影响。
  3. 技术栈灵活:不同的微服务可以根据具体需求选择最适合的技术栈,不必受限于整个系统的统一技术选择。
  4. 弹性伸缩:微服务架构允许按需扩展特定的服务实例,以应对高负载情况,而无需扩展整个应用程序。
  5. 故障隔离:如果某个微服务出现故障,不会立即影响整个系统,因为其他服务仍然可以正常运行。
  6. 持续交付:由于微服务的独立性和自动化测试,团队可以更频繁地进行代码提交和部署,加速产品迭代速度。
  7. 数据管理:每个微服务通常拥有自己的数据库,遵循“数据所有权”原则,避免了全局数据模式的复杂性。

在这里插入图片描述

1.1、Dubbo在微服务架构中的角色

Dubbo在微服务架构中不仅提供了高效的服务间通信机制,还通过其全面的服务治理能力,极大地降低了构建、管理和维护复杂微服务架构的难度

  1. 服务治理:Dubbo是一个高性能、轻量级的开源服务框架,它提供了全面的服务治理解决方案,包括服务注册、服务发现、负载均衡、容错、限流、动态配置等功能,帮助构建稳定可靠的微服务架构。
  2. RPC通信:Dubbo采用高性能的RPC(Remote Procedure Call)通信机制,允许服务消费者远程调用服务提供者的接口,就像调用本地方法一样简单,极大地简化了分布式系统间的交互。
  3. 服务注册与发现:Dubbo支持多种注册中心,如Zookeeper、Nacos、Consul等,用于服务的自动注册与发现,使得服务提供者和消费者之间能够动态地找到彼此,而无需硬编码服务地址。
  4. 智能路由:Dubbo提供了丰富的路由策略,如随机、轮询、最少活跃数、一致性哈希等,可以根据不同的场景和需求,智能地选择服务实例进行调用,提高服务调用效率和系统的整体性能。
  5. 容错与重试:Dubbo内置了多种容错策略,如失败重试、失败回调、降级、熔断等,能够在服务不可用或网络异常时,提供优雅的降级方案,保证系统的稳定性和用户体验。
  6. 监控与统计:Dubbo集成了强大的监控统计功能,可以实时监控服务调用的延迟、吞吐量、异常率等关键指标,帮助开发者快速定位和解决问题。
  7. 灵活的配置管理:Dubbo支持动态配置更新,可以在不重启服务的情况下调整服务参数,提高了运维的灵活性和效率。

1.2、Zookeeper和Nacos作为服务注册与发现中心的作用。

(1)Zookeeper
Zookeeper主要用于协调分布式应用,提供了一套完整的分布式协调服务解决方案。它能够为分布式应用提供命名服务、配置管理、集群管理、分布式锁、队列管理等服务。

在微服务架构中,Zookeeper可以作为一个服务注册中心,各个微服务启动后会向Zookeeper注册自己的信息(如IP地址、端口号等),而其他需要调用这些服务的应用则可以从Zookeeper上查询到服务的信息,实现服务的自动发现。

Zookeeper的核心是其数据模型和Watcher机制,通过维护一个层次化的命名空间来存储数据,并且提供了实时的数据变更通知机制。但是,Zookeeper的性能并不适合高并发场景,且其API相对复杂,需要一定的学习成本。

(2)Nacos
Nacos是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它结合了服务发现与配置管理的功能,旨在简化微服务和DevOps的运维工作。

Nacos提供了一个强大的服务注册与发现功能,微服务可以在启动时向Nacos注册,同时Nacos也支持健康检查,确保只返回可用的服务实例。服务消费者可以通过Nacos发现并调用服务。

Nacos具有高可用性、高性能和易用性,支持动态配置更新,无需重启服务即可生效。此外,Nacos还提供了丰富的可视化界面,方便用户管理和监控服务。

2、环境准备

1、IDEA编码工具。
2、Maven依赖管理工具

2.1、安装和配置Zookeeper和Nacos。

2.1.1、Zookeeper

(1)下载
Zookeeper是Apache旗下的产品,下载地址:Apache Zookeeper
在这里插入图片描述
(2)解压并启动
将Zookeeper压缩包下载好后进行解压。
在这里插入图片描述
解压好后还不能直接启动,还需要修改配置文件,一个很简单的修改操作。将conf目录下的zoo_sample.cfg文件改为zoo.cfg文件即可。

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
进入bin目录,在windows系统中直接双击zkServer.cmd文件启动Zookeeper,而在Linux系统下则需要运行zkServer.sh文件。

2.1.2、Nacos

(1)下载
Nacos 是阿里的产品,现在是 SpringCloud 中的一个组件。它的功能要比 Eureka、Zookeeper 更加丰富,在国内比较受欢迎。
下载地址:Nacos GitHub下载地址
在这里插入图片描述

(2)下载后解压
在这里插入图片描述
(3)修改数据库配置
进入conf目录下,打开application.properties文件,需要在这里面修改数据库的配置。
在这里插入图片描述
在修改数据库配置之前需要走一个必不可少的流程,就是将conf目录下的mysql-schema.sql在指定的数据库中执行一次,让数据库中有所需要的表。

数据库的配置信息从33行开始。

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=mysql
spring.sql.init.platform=mysql
db.num=1
db.url=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456

(4)启动Nacos
在bin目录下执行指定的命令:
1、单机模式:startup.cmd -m standalone
2、集群模式:startup.cmd -m cluster,需要开启集群模式。
在这里插入图片描述
看到上述情况则表示Nacos启动成功,可以访问:http://localhost:8848/nacos,用户名和密码如果没有设置的话都是:nacos/nacos。
在这里插入图片描述

2.2、依赖版本选择

  1. SpringBoot依赖版本:2.7.17
  2. JDK版本:JDK 17
  3. Dobbu依赖版本:2.7.17(nacos)、3.2.12(zookeeper)
  4. Nacos依赖版本:2021.0.5.0

2.2.1、Zookeeper版本下父pom依赖

<?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.tt</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <packaging>pom</packaging>

    <artifactId>zookeeper-registry</artifactId>

    <modules>
        <module>provider</module>
        <module>interface-api</module>
        <module>Consumer</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>3.2.12</version>
            </dependency>

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

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-zookeeper</artifactId>
                <version>3.2.12</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>3.2.5</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.32</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

2.2.2、Nacos模式下父pom依赖

<?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.tt</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <packaging>pom</packaging>

    <artifactId>nacos-registry</artifactId>

    <modules>
        <module>nacos-interface-api</module>
        <module>nacos-provider</module>
        <module>nacos-consumer</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>2.7.17</spring.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.32</version>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
                <version>${spring.version}</version>
            </dependency>

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

        </dependencies>
    </dependencyManagement>

</project>

3、Dubbo与SpringBoot集成

将阿里巴巴开源的高性能、轻量级的微服务框架Dubbo,与流行的Spring Boot框架结合使用,以构建分布式服务应用。这种集成可以充分利用Dubbo的RPC(远程过程调用)功能和Spring Boot的快速开发特性,实现服务的自动注册、发现、负载均衡、容错、降级等功能。

3.1、整体项目结构

在这里插入图片描述

3.2、公共模块

公共模块主要是提供接口和公共的对象。

3.2.1、Nacos模式下的公共模块

在这里插入图片描述

// 提供公共的接口,具体业务由实现类完成。
public interface UserService {

    public String userLogin(String username, String password);

}

3.2.2、Zookeeper模式下的公共模块

在这里插入图片描述

public interface UserService {

    String userLogin(String username, String password);

}

3.2、构建服务提供者

服务提供者,先导入公共模块的依赖同时实现相应的接口,并将实现类的信息上传到注册中心。

3.2.1、Nacos模式服务提供者

(1)导入API公共模块依赖
在服务提供者的pom文件中导入API模块的依赖

<dependency>
     <groupId>com.tt</groupId>
     <artifactId>nacos-interface-api</artifactId>
     <version>0.0.1-SNAPSHOT</version>
 </dependency>

(2)实现接口,完成业务逻辑

@DubboService
public class UserServiceImpl implements UserService {

    @Override
    public String userLogin(String username, String password) {
		// 省略具体的业务逻辑
        return username + "登录成功";
    }

}

@DubboService是Dubbo Spring Boot Starter提供的一个注解,用于标记一个接口的实现类为Dubbo的服务提供者。

(3)开启Dubbo服务并设置配置中心

@SpringBootApplication
@EnableDubbo // 在启动类上开启Dubbo服务
public class NacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}
server:
  port: 8081

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec
        file-extension: yaml
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec
dubbo:
  registry:
    address: nacos://${spring.cloud.nacos.config.server-addr}
  protocol:
    port: 20880 # dubbo服务端口
    name: dubbo # 协议
#  monitor:
#    protocol: registry
  scan:
    base-packages: com.tt.service

3.2.2、Zookeeper模式服务提供者

Zookeeper模式下的服务提供者除了配置文件与Nacos模式的服务提供者不同,其他基本一致。

spring:
  application:
    name: tt-provider

dubbo:
  protocol:
    name: dubbo
    port: -1
#    serialization: kryo
  registry:
    address: zookeeper://127.0.0.1:2181
  application:
    qos-port: 2222
  provider:
    timeout: 5000
  scan:
    base-packages: com.tt.service

3.3、构建服务消费者

在Dubbo模式下,服务消费者调用服务提供者的路径是一个涉及多个组件和步骤的过程。下面是一个典型的调用流程概述:

  1. 服务注册
    服务提供者启动时,它会向注册中心(如Zookeeper)注册其提供的服务,包括服务的接口名、版本、所在主机、端口等信息。
  2. 服务发现
    当服务消费者启动时,它会向注册中心订阅所需服务的接口信息。
    注册中心返回服务提供者列表给消费者。
  3. 代理创建
    消费者根据服务接口生成动态代理对象(Proxy),这个代理对象对用户透明,看起来就像在本地调用一样。
  4. 调用路由
    当消费者通过代理对象调用服务时,调用会被转发到Invoker。
    Invoker使用集群路由策略(如轮询、最少活跃数、一致性哈希等)选择一个服务提供者。
  5. 远程调用
    选定提供者后,调用请求通过网络传输到提供者,通常使用Netty等高性能网络框架。
    提供者接收到请求后,执行本地调用并返回结果。
  6. 结果处理
    结果被编码并通过网络返回给消费者。
    消费者接收到结果,完成整个调用链路。

3.3.1、Nacos模式下消费者

(1)开启Dubbo服务并配置注册中心

@SpringBootApplication
@EnableDubbo
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }

}
server:
  port: 8082

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec
        file-extension: yaml
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 2cb71f92-6787-40bd-b9df-ccc2be92e0ec
dubbo:
  registry:
    address: nacos://${spring.cloud.nacos.config.server-addr}
  protocol:
    port: 20880 # dubbo服务端口
    name: dubbo # 协议
#  monitor:
#    protocol: registry
#  scan:
#    base-packages: com.tt.service

(2)进行Dubbo调用

@RestController
public class UserController {

    @DubboReference // 通过接口进行代理对象的注入,然后进行RPC调用
    private UserService userService;

    @GetMapping(value = "/login/{username}/{password}")
    public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
        return userService.userLogin(username, password);
    }
}

3.3.2、Zookeeper模式下消费者

同Nacos模式下的消费者类似。

4、Dubbo特性

4.1、Dubbo的负载均衡策略

Dubbo是一个高性能、轻量级的开源微服务框架,它支持多种负载均衡策略来优化服务调用的分布,从而提高系统的整体性能和稳定性。以下是Dubbo支持的主要负载均衡策略:

  1. 随机(Random)
    这是Dubbo默认的负载均衡策略,它随机选择一个可用的服务实例进行调用。如果配置了权重,那么权重较大的服务实例被选中的概率也更大。
  2. 轮询(RoundRobin)
    也称为循环调度,按顺序逐一分配请求到不同的服务实例,保证每个实例都能公平地接收请求。当配置了权重时,权重高的实例会有更高的机会被选中。
  3. 最少活跃数(LeastActive)
    选择活跃数最少的服务实例,即正在处理请求最少的那个实例,这样可以避免某些服务实例过载。
  4. 一致性哈希(ConsistentHash)
    基于请求参数的哈希值进行路由,将请求分配给距离当前哈希值最近的下一个服务实例。这种策略可以减少服务实例变化带来的重新分配成本。
  5. 加权轮询(WeightedRoundRobin)
    这是轮询策略的一种扩展,根据服务实例的权重进行轮询,权重大的实例被选中的频率更高。
  6. 加权随机(WeightedRandom)
    类似于随机策略,但是根据服务实例的权重来随机选择,权重越高的实例被选中的概率越大。

在实际应用中,你可以根据服务的具体需求和场景选择合适的负载均衡策略,也可以自定义实现以满足更复杂的需求。这些策略可以通过Dubbo的配置文件或者注解来指定,例如在@Reference注解中使用loadbalance属性来指定负载均衡策略。

@RestController
public class UserController {

    @DubboReference(loadbalance = "random") // 声明使用的负载均衡策略
    private UserService userService;

    @GetMapping(value = "/login/{username}/{password}")
    public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
        return userService.userLogin(username, password);
    }
}

负载均衡是分布式系统中一个关键的部分,它有助于提升系统的可用性、伸缩性和性能。

4.2、容错机制和重试策略。

Dubbo提供了多种容错机制和重试策略,用于处理服务调用时可能遇到的故障和异常情况。这些机制可以帮助服务保持高可用性和稳定性,尤其是在分布式系统中。下面是几种主要的容错和重试策略:

  1. Failover(失败自动切换)
    当调用失败时,Dubbo会自动切换到其他可用的服务提供者进行重试。
    这种策略通常用于读操作,因为重试可能会带来额外的延迟。
    可以通过retries参数来设置重试次数(不包括首次调用)。
  2. Failfast(快速失败):
    只发起一次调用,如果调用失败,则立即抛出异常并终止后续调用。
    适用于非幂等性的写操作,例如新增记录。
  3. Failsafe(失败安全):
    出现异常时,直接忽略并返回一个默认结果或空结果。
    通常用于写入审计日志等操作,即使失败也不影响系统的主要功能。
  4. Failback(失败自动恢复):
    请求失败后,会自动记录在失败队列中,并由一个定时线程在后台重试。
    这种策略适用于那些可以延后处理且不会造成严重后果的操作。
  5. Forking(并行调用):
    同时调用多个服务提供者,只要其中一个成功即返回。
    适用于实时性要求较高的读操作,但需要消耗更多的服务资源。
  6. Broadcast(广播调用):
    广播调用所有服务提供者,逐个调用,任意一台报错则报错。
    通常用于通知所有提供者更新缓存或日志等本地资源信息。

在实际应用中,可以根据服务的特性和业务需求选择合适的容错策略。例如,对于查询语句,推荐使用默认的Failover策略,而对于增删改操作,建议使用Failfast策略,或者使用Failover策略但将retries设为0,以防止数据重复添加。

这些策略可以通过Dubbo的配置文件或代码中的注解来指定,例如在@DubboReference或@DubboService注解中使用cluster属性来设置容错策略。

@RestController
public class UserController {

// 随机的负载均衡策略,失败自动切换的容错机制,5次的重试机制
    @DubboReference(loadbalance = "random", cluster = "failover", retries = 5)
    private UserService userService;

    @GetMapping(value = "/login/{username}/{password}")
    public String userLogin(@PathVariable("username") String username, @PathVariable("password") String password){
        return userService.userLogin(username, password);
    }
}

如果项目中使用的是XML,可以使用以下写法:

<dubbo:reference id="demoService" interface="com.example.DemoService"  cluster="failover" retries="2"/>

4.3、服务降级和熔断

Dubbo的服务降级和服务熔断是微服务架构中用于增强系统稳定性和防止雪崩效应的关键机制。它们通过限制或改变服务调用行为,来保护系统免受异常服务实例的影响。

4.3.1、服务降级

服务降级是指在服务调用遇到问题时,主动降低服务的功能或性能,返回一个默认或简化的响应,而不是等待服务响应或重试。这有助于避免服务调用方因等待无响应的服务而导致的资源耗尽。

在Dubbo中,服务降级可以通过多种方式实现:

  1. Mock机制:Dubbo允许你配置一个Mock对象,当服务调用失败时,Mock对象会返回一个预定义的响应,而不是抛出异常。这可以通过在@DubboReference注解中设置mock属性,或者在XML配置中使用mock标签来实现。
  2. 自定义降级逻辑:你也可以编写自定义的降级逻辑,例如,当服务不可用时,返回一个静态的错误页面或默认值。
4.3.1.1、简单的降级
@DubboReference(mock = "return null")
private MyService myService;

当myService调用失败时立马返回null。

4.3.1.2、自定义Mock

(1)实现降级方法

public class MyServiceMock implements MyService {
    @Override
    public String someMethod(String param) {
        return "Mocked response for: " + param;
    }
}

(2)配置mock

@DubboReference(mock = "com.example.service.MyServiceMock$someMethod")
private MyService myService;

4.3.2、服务熔断

服务熔断是一种保护机制,当一个服务的调用失败率达到一定程度时,Dubbo会自动“断开”对该服务的调用,直接返回错误或预定义的响应,而不是继续尝试调用可能已失败的服务。这可以防止大量请求涌向已知有问题的服务,避免进一步的系统崩溃。

Dubbo可以通过集成Hystrix来实现服务熔断。Hystrix是Netflix开源的一个容错库,它可以监控服务调用的健康状态,并在必要时触发熔断机制。

要使用Hystrix进行熔断,你需要做以下几点:

  1. 引入Hystrix依赖:在项目中添加Hystrix的依赖。
  2. 配置Hystrix:配置Hystrix的规则,比如失败率阈值、熔断时间窗口等。
  3. 使用@HystrixCommand注解:在服务调用方法上添加@HystrixCommand注解,指定熔断的逻辑和回退方法。
  4. 定义回退方法:当服务调用被熔断时,Hystrix会调用你定义的回退方法来处理请求。

在Dubbo中,你还可以通过配置circuitBreaker相关属性来控制熔断的行为:

@DubboReference(circuitBreaker = "on", timeout = 3000, retries = 0)
private DemoService demoService;

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

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

相关文章

绘唐3官网体验入口绘唐官网

绘唐3官网体验入口绘唐官网 绘唐3官网体验入口是指进入绘唐3官网的入口。绘唐是一款中国传统绘画软件&#xff0c;绘唐3是绘唐系列的最新版本。通过绘唐3官网&#xff0c;用户可以了解绘唐3的功能特点、下载安装包、查看新闻动态、参与社区讨论等。以下是绘唐3官网的体验入口&…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间&#xff0c;2024年各大云服务器厂商都有哪些活动呢&#xff1f;有哪些活动包括香港服务器呢&#xff1f;带着这些问题&#xff0c;小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方&#xff0c;如果对你有帮助&#xff0c;欢迎点赞…

Spring Bean详解

Spring Bean作用域 默认情况下&#xff0c;所有的 Spring Bean 都是单例的&#xff0c;也就是说在整个 Spring 应用中&#xff0c; Bean 的实例只有一个 如果我们需要创建多个实例的对象&#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype&#xff0c;如果 Spring 需…

【STM32】矩阵计算器

【STM32】矩阵计算器 资料链接请在文章末尾获取~ 1.说明 使用元器件&#xff1a;stm32f103c8t6最小系统板x1&#xff0c;0.96寸OLED显示屏四角x1&#xff0c;4x4矩阵按键x1; 参考&#xff1a;正点原子有关4脚OLED驱动float型数据的驱动文件&#xff0c;CSDN有关矩阵横向扫描…

【LeetCode:394. 字符串解码 + 栈 | 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

SpringMVC 写个 HelloWorld

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

NoMaD: Goal Masked Diffusion Policies for Navigation and Exploration

引言 机器人学习的背景和挑战 本文的研究重点 现有方法的局限性 本文的创新点 相关工作 事先准备 视觉目标条件策略 ViNT在目标条件导航中表现出最先进的性能&#xff0c;但它不能执行无方向探索&#xff0c;需要外部的子目标建议机制。Nomad扩展了Vint&#xff0c;同时支持目…

HMI之王 STM32H7S7

还要什么自行车啊 感谢原厂精彩培训和慷慨赠板&#xff01; 以下列示几个关注的点&#xff0c;计划做成系列&#xff0c;随缘更新&#xff0c;尽量填。 0&#xff09;1024*600分辨率配5寸触屏&#xff1b;Type-C with USB 2.0 HS interface, dual‑role‑power 终于不用2根线…

读AI新生:破解人机共存密码笔记06人工智能生态系统

1. 深蓝 1.1. “深蓝”的胜利虽然令人印象深刻&#xff0c;但它只是延续了几十年来显而易见的趋势 1.2. 国际象棋算法的基本设计是由克劳德香农在1950年提出的 1.2.1. 这一基本设计在20世纪60年代初实现了重大改进 1.2.2. 最优秀的国际象棋程序的等级评分稳步提高&#xff…

tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明

一个这样的组件 我直接上代码了 <template><t-loading size"small" :loading"loading" show-overlay><div class"container" click"refresh"><div v-if"svg" class"svg" v-html"svg&…

YOLOV8 目标检测:训练自定义数据集

1、下载 yolov8项目&#xff1a;ultralytics/ultralytics&#xff1a;新增 - PyTorch 中的 YOLOv8 &#x1f680; > ONNX > OpenVINO > CoreML > TFLite --- ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreM…

Git pull下来时合并分支

执行git pull时报错如下 解决方法&#xff1a; VSCode git中手动选取分支&#xff0c;完成合并 git add .; git commit -m “resolve”git push -u origin main

【机器学习系列】Python实战:使用GridSearchCV优化AdaBoost分类器及其基分类器

目录 一、AdaBoost的标准实现中是否支持使用不同类型的基分类器&#xff1f; 二、Adaboost的参数 三、Python实现Adaboost (一)导入库和数据集 &#xff08;二&#xff09; 划分训练集 &#xff08;三&#xff09;选择基分类器--决策树 &#xff08;四&#xff09;创建Ada…

ADOP带你了解:数据中心的高速互联解决方案

随着大语言模型和AIGC的飞速发展&#xff0c;数据中心对于高速、高可靠性的网络连接需求日益增长。ADOP系列产品正是在这样的背景下应运而生&#xff0c;为现代数据中心提供了全面的连接解决方案。 ADOP系列产品概览 ADOP系列产品旨在为云、高性能计算、Web 2.0、企业、电信、…

镁光全球扩张HBM3E内存生产,提升市场占有率

镁光科技&#xff08;Micron&#xff09;近期透露了其在高性能内存领域的大胆布局&#xff0c;意图显著提升其在高带宽内存&#xff08;HBM&#xff09;市场的份额。根据《Nikkei》的最新报道&#xff0c;这家内存巨头正计划在全球范围内扩大HBM3E内存的生产能力&#xff0c;一…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

高速公路收费图片分析系统深入理解

当今社会&#xff0c;随着交通运输业的快速发展&#xff0c;高速公路已成为人们出行的重要选择。而高速公路收费系统作为保障道路可持续运营的重要组成部分&#xff0c;其效率和准确性对于保障道路畅通和交通安全至关重要。近年来&#xff0c;随着技术的不断进步&#xff0c;高…

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

Java | Leetcode Java题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; class Solution {public String convertToTitle(int columnNumber) {StringBuffer sb new StringBuffer();while (columnNumber ! 0) {columnNumber--;sb.append((char)(columnNumber % 26 A));columnNumber / 26;}return sb.reverse().t…

信息打点web篇----企业宏观资产打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 专栏描述&#xff1a;因为第一遍过信息收集的时候&#xff0c;没怎么把收集做回事 导致后来在实战中&#xff0c;遭遇资产获取少&#xff0c;可渗透点少的痛苦&#xff0c;如今决定 从头来过&#xff0c;全面全方位…