一、spring的传播行为
- 定义
-
- 在 Spring 框架中,事务的传播行为(Propagation Behavior)定义了在嵌套方法调用时,事务应该如何传播。它决定了一个事务方法被另一个事务方法调用时,事务如何在这些方法之间进行交互。
- 主要的传播行为类型
-
- REQUIRED(默认)== required
- 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。例如,有方法 A 和方法 B,方法 A 调用方法 B,当方法 A 已经在一个事务中时,方法 B 就会加入到这个事务中;如果方法 A 没有在事务中,那么方法 B 会创建一个新的事务。
- SUPPORTS == supports
- 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。假设方法 C 调用方法 D,当方法 C 处于事务中时,方法 D 会参与到这个事务;若方法 C 不在事务中,方法 D 就会以没有事务的普通方式执行。
- MANDATORY == mandatory
- 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。例如,方法 E 调用方法 F,当方法 E 没有事务时,方法 F 执行时就会抛出异常,因为它要求必须在一个事务环境下运行。
- REQUIRES_NEW == requires_new
- 创建一个新的事务,如果当前存在事务,则挂起当前事务。比如,方法 G 调用方法 H,不管方法 G 是否在事务中,方法 H 都会创建自己独立的新事务,并且如果方法 G 有事务,这个事务会被暂时挂起,直到方法 H 的事务完成。
- NOT_SUPPORTED == not_supported
- 以非事务方式执行,如果当前存在事务,则挂起当前事务。例如,方法 I 调用方法 J,若方法 I 在事务中,方法 J 执行时会挂起方法 I 的事务,并且以非事务的方式运行。
- NEVER == never
- 以非事务方式执行,如果当前存在事务,则抛出异常。假设方法 K 调用方法 L,当方法 K 处于事务中时,方法 L 执行就会抛出异常,因为它不能在事务环境下运行。
- NESTED == nested
- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则行为类似于 REQUIRED。嵌套事务是外部事务的一个子事务,外部事务回滚时,嵌套事务也会回滚;而嵌套事务回滚时,外部事务可以选择继续提交或者回滚。例如,方法 M 调用方法 N,当方法 M 在事务中时,方法 N 会在一个嵌套事务中运行。
- REQUIRED(默认)== required
二、springboot和springcloud的区别!
- 基础定位方面
-
- Spring Boot
- Spring Boot 是一个快速开发框架,旨在简化 Spring 应用的初始搭建以及开发过程。它通过提供默认的配置和自动配置机制,让开发者能够快速构建独立的、生产级别的 Spring 应用程序。例如,使用 Spring Boot 创建一个简单的 Web 应用,只需添加少量的依赖(如 Spring Web Starter),并编写简单的业务逻辑代码,就可以快速启动一个可运行的 Web 服务,不需要繁琐的配置文件来定义各种 Bean 和依赖关系。
- Spring Cloud
- Spring Cloud 是一系列框架的集合,用于构建分布式系统中的各个微服务组件以及管理这些微服务之间的关系。它侧重于解决分布式系统中的常见问题,如服务治理(包括服务注册与发现、配置管理、断路器等)、微服务之间的通信、分布式链路追踪等。例如,在一个包含多个微服务的电商系统中,Spring Cloud 可以帮助管理各个微服务(如订单服务、商品服务、用户服务等)之间的交互,确保系统的高可用性和可扩展性。
- Spring Boot
- 功能特性方面
-
- Spring Boot
- 自动配置:Spring Boot 的自动配置是其核心特性之一。它会根据项目中引入的依赖自动配置相关的 Spring 组件。例如,当引入了数据库连接相关的依赖(如 MySQL 驱动和 Spring Data JPA),Spring Boot 会自动配置数据源、JPA 实体管理器等,减少了开发者手动配置的工作量。
- 嵌入式容器:Spring Boot 可以将 Web 应用嵌入到一个轻量级的容器(如 Tomcat、Jetty 或 Undertow)中。这意味着不需要单独部署 Web 容器,直接运行 Spring Boot 应用就可以提供 Web 服务,方便开发和测试过程。
- 简化依赖管理:通过提供 starter 依赖,Spring Boot 将相关的依赖组合在一起。例如,Spring Boot Web Starter 包含了开发 Web 应用所需的 Spring MVC、Jackson(用于 JSON 处理)等依赖,开发者只需要引入这个 starter,就可以快速开始 Web 开发。
- Spring Cloud
- 服务注册与发现:Spring Cloud 提供了如 Eureka、Consul 等服务注册与发现工具。在微服务架构中,各个微服务启动时会将自己的信息(如服务名称、IP 地址、端口等)注册到服务注册中心,其他微服务可以从注册中心获取到需要调用的服务的信息,方便微服务之间的通信。
- 配置管理:Spring Cloud Config 允许将配置文件集中管理,并且可以动态刷新配置。例如,在一个大型分布式系统中,所有微服务的配置文件(如数据库连接配置、日志配置等)可以存储在一个配置中心,当需要修改配置时,可以在配置中心进行修改,各个微服务能够实时获取到更新后的配置。
- 断路器:Spring Cloud Circuit Breaker(如 Hystrix 或 Resilience4j)可以防止微服务之间的调用因为某个服务的故障而导致整个系统崩溃。当一个微服务调用另一个微服务出现故障时,断路器会打开,暂时停止对故障服务的调用,直接返回默认值或者执行降级逻辑,保护整个系统的稳定性。
- Spring Boot
- 使用场景方面
-
- Spring Boot
- 适用于快速构建各种类型的独立 Spring 应用,无论是简单的 Web 应用、命令行应用还是数据访问层应用等。例如,开发一个小型的企业内部管理系统的后端服务,或者是一个简单的 RESTful API 服务,Spring Boot 可以让开发者迅速上手并完成开发任务。
- Spring Cloud
- 专门用于构建和管理分布式微服务架构的系统。在大型企业级应用、互联网应用等需要将系统拆分为多个微服务进行开发、部署和管理的场景中,Spring Cloud 发挥着重要的作用。例如,构建一个大规模的电商平台,包含众多微服务如订单处理、商品管理、用户认证等,Spring Cloud 可以有效地协调这些微服务之间的关系,确保系统的高效运行。
- Spring Boot
三、springcloud有哪些组件
- 服务注册与发现组件
-
- Eureka
- Eureka 是 Netflix 开源的服务注册与发现组件,在 Spring Cloud 中被广泛应用。它包含 Eureka Server 和 Eureka Client。Eureka Server 作为服务注册中心,各个微服务(Eureka Client)在启动时会将自己的服务信息(如服务名称、IP 地址、端口等)注册到 Eureka Server 上。其他微服务可以从 Eureka Server 获取需要调用的服务的信息,从而实现服务间的调用。例如,在一个包含订单服务、商品服务和用户服务的微服务架构中,这些服务作为 Eureka Client 将自己注册到 Eureka Server,当订单服务需要调用商品服务时,它可以从 Eureka Server 查询到商品服务的信息然后进行调用。
- Consul
- Consul 除了具备服务注册与发现功能外,还提供了分布式系统中的健康检查、键 - 值存储等功能。它是一个多数据中心的服务发现和配置工具。与 Eureka 相比,Consul 使用 Raft 一致性算法来保证数据的一致性。在一些对数据一致性要求较高的场景下,Consul 是一个不错的选择。例如,在一个跨国企业的分布式系统中,需要在多个数据中心之间进行服务注册与发现,Consul 可以满足这种需求。
- Zookeeper
- Zookeeper 是一个分布式协调服务框架,在 Spring Cloud 中也可用于服务注册与发现。它主要通过维护一个类似于文件系统的树形结构来管理分布式系统中的数据和服务信息。Zookeeper 具有高可靠性、高性能等特点,适用于大规模分布式系统中的服务管理。例如,在一个大型互联网公司的微服务架构中,众多微服务可以利用 Zookeeper 进行注册与发现,同时 Zookeeper 还可以用于管理分布式系统中的配置信息等其他功能。
- Eureka
- 配置管理组件
-
- Spring Cloud Config
- Spring Cloud Config 提供了集中式的外部配置管理支持。它可以将各个微服务的配置文件(如数据库连接配置、日志配置等)存储在一个或多个配置中心(可以是本地文件系统、Git 仓库等)。微服务可以从配置中心获取自己所需的配置信息,并且支持配置的动态刷新。例如,在一个微服务架构中,所有微服务的配置文件都存储在一个基于 Git 的 Spring Cloud Config 服务器上,当需要修改某个微服务的数据库连接配置时,只需要在配置中心修改相应的配置文件,微服务就可以获取到更新后的配置,无需重新启动。
- Spring Cloud Config
- 断路器组件
-
- Hystrix(已停止维护,部分被 Resilience4j 取代)
- Hystrix 是 Netflix 开源的一款断路器框架。在微服务架构中,当一个微服务调用另一个微服务时,如果被调用的微服务出现故障(如响应时间过长、不可用等),Hystrix 会防止故障的蔓延,它会打开断路器,停止对故障微服务的继续调用,并提供降级逻辑(如返回默认值或者执行缓存中的数据),从而保护整个系统的稳定性。例如,在一个电商系统中,订单服务调用库存服务,如果库存服务出现故障,Hystrix 会阻止订单服务不断地对库存服务进行无效调用,而是直接返回库存充足的默认值或者执行其他预先定义好的降级策略。
- Resilience4j
- Resilience4j 是一个轻量级的、反应式的断路器框架,是 Hystrix 的替代品之一。它提供了类似的功能,如断路器、限流器、重试等功能。与 Hystrix 相比,Resilience4j 具有更小的内存占用和更灵活的配置方式。在新的 Spring Cloud 项目中,Resilience4j 逐渐被更多地采用。例如,在构建一个对资源占用要求较为严格的微服务系统时,Resilience4j 可以在保证系统稳定性的同时,减少对系统资源的占用。
- Hystrix(已停止维护,部分被 Resilience4j 取代)
- 网关组件
-
- Spring Cloud Gateway
- Spring Cloud Gateway 是 Spring Cloud 的网关组件,它位于微服务架构的前端,作为所有微服务的统一入口。它可以进行路由转发、请求过滤、负载均衡等操作。例如,外部客户端的所有请求首先到达 Spring Cloud Gateway,然后根据预先定义的路由规则,Gateway 将请求转发到相应的微服务。同时,Gateway 可以对请求进行身份验证、权限检查等过滤操作,保证只有合法的请求能够到达微服务。
- Spring Cloud Gateway
- 分布式链路追踪组件
-
- Spring Cloud Sleuth
- Spring Cloud Sleuth 与 Zipkin 或其他分布式追踪系统(如 Jaeger)配合使用,用于在分布式系统中跟踪请求的调用链路。它会为每个请求生成一个唯一的跟踪标识(traceId),并在整个请求的调用过程中(如从前端到后端的多个微服务之间的调用)传递这个标识,从而可以跟踪每个请求在系统中的具体路径、每个微服务的响应时间等信息。例如,在一个复杂的微服务架构中,当用户请求出现问题时,可以通过 Spring Cloud Sleuth 和 Zipkin 来确定是哪个微服务出现了延迟或者故障,以便进行问题排查。
- Spring Cloud Sleuth
四、springcloud中alibaba的组件
- Nacos
-
- 服务注册与发现
- Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。在 Spring Cloud Alibaba 体系中,Nacos 作为服务注册与发现中心,微服务启动时会将自身的服务信息(如服务名、IP 地址、端口等)注册到 Nacos 服务器。其他微服务可以从 Nacos 获取所需服务的信息以实现调用。例如,在一个电商系统的微服务架构中,订单服务、商品服务等微服务都将自己注册到 Nacos,当订单服务需要调用商品服务时,它能从 Nacos 查询到商品服务的相关信息。
- 配置管理
- 同时,Nacos 也用于集中式的配置管理。开发人员可以将各个微服务的配置文件存储在 Nacos 中,如数据库连接配置、日志配置等。微服务在启动时从 Nacos 获取配置,并且支持动态配置更新。例如,当需要修改某个微服务的数据库连接字符串时,只需在 Nacos 中修改相应配置,微服务就能实时获取到更新后的配置,无需重启。
- 服务注册与发现
- Sentinel
-
- 流量控制
- Sentinel 是面向分布式、微服务架构的轻量级流量控制框架。它可以对微服务的入口流量进行控制,例如限制单位时间内的请求数量。在 Spring Cloud Alibaba 应用中,Sentinel 可以根据设定的规则,如 QPS(每秒查询率)阈值,当请求流量超过这个阈值时,采取相应的策略,如直接拒绝多余的请求、排队等待或者进行流量的平滑处理等。
- 熔断降级
- 类似于 Spring Cloud 中的 Hystrix,Sentinel 也具备熔断降级功能。当被调用的微服务出现故障或者响应时间过长时,Sentinel 会熔断对该服务的调用链路,保护调用方微服务不被故障服务影响。同时,它还可以定义降级策略,如返回预设的默认值或者执行本地的降级逻辑,确保系统整体的稳定性。
- 流量控制
- Seata
-
- 分布式事务处理
- Seata 是一款开源的分布式事务解决方案,在 Spring Cloud Alibaba 框架下用于解决微服务架构中的分布式事务问题。在一个包含多个微服务的业务场景中,例如电商系统中的订单创建涉及订单服务、库存服务和支付服务,Seata 可以确保这几个微服务之间的事务操作的一致性。当其中一个微服务的事务操作失败时,Seata 能够协调其他微服务回滚事务,保证整个业务逻辑的正确性。
- 分布式事务处理
- Dubbo
-
- 高性能 RPC 框架
- Dubbo 是一个高性能、轻量级的开源 RPC(远程过程调用)框架。在 Spring Cloud Alibaba 中,Dubbo 可以用于微服务之间的通信。它提供了高效的服务调用机制,支持多种序列化方式和负载均衡策略。例如,在企业级的微服务架构中,不同微服务之间使用 Dubbo 进行通信,可以实现快速的方法调用和数据传输,提高整个系统的运行效率。
- 高性能 RPC 框架
五、项目中nacos是如何使用的
- 服务注册与发现方面的使用
-
- 服务提供者注册
- 添加依赖:在基于 Spring Cloud Alibaba 的项目中,首先要在服务提供者的项目中添加spring - cloud - alibaba - nacos - discovery依赖。例如,在 Maven 项目的pom.xml文件中添加以下依赖:
- 服务提供者注册
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring - cloud - alibaba - nacos - discovery</artifactId> <version>对应版本号</version> </dependency>
- **配置注册信息**:在服务提供者的配置文件(`application.properties`或`application.yml`)中配置Nacos服务器的地址和服务自身的注册信息。 - 如果是`application.properties`: - `spring.cloud.nacos.discovery.server - addr = 127.0.0.1:8848`(这里假设Nacos服务器地址为`127.0.0.1:8848`) - `spring.cloud.nacos.discovery.service - name = your - service - name`(指定服务名称) - 如果是`application.yml`: - ```yaml spring: cloud: nacos: discovery: server - addr: 127.0.0.1:8848 service - name: your - service - name
- 启动注册:当服务提供者启动时,会自动将自身的服务信息(包括服务名称、IP 地址、端口等)注册到 Nacos 服务注册中心。
- 服务消费者发现服务并调用
- 添加依赖:同样在服务消费者项目中添加spring - cloud - alibaba - nacos - discovery依赖。
- 配置发现信息:在服务消费者的配置文件中配置 Nacos 服务器地址。
- 例如在application.yml中:
spring: cloud: nacos: discovery: server - addr: 127.0.0.1:8848
- **服务调用**:在服务消费者的代码中,可以使用`@LoadBalanced`注解(如果使用Spring Cloud的负载均衡机制)结合`RestTemplate`或者Feign(一种声明式的Web服务客户端)来调用服务。例如,使用`RestTemplate`时: - 首先在配置类中创建`RestTemplate`实例并添加`@LoadBalanced`注解: - ```java 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 RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
- 然后在业务代码中使用RestTemplate调用服务:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class YourController { @Autowired private RestTemplate restTemplate; @GetMapping("/call - service") public String callService() { return restTemplate.getForObject("http://your - service - name/endpoint", String.class); } }
2. **配置管理方面的使用** - **配置添加到Nacos** - **登录Nacos控制台**:打开Nacos的管理控制台(通常通过`http://127.0.0.1:8848/nacos`访问,假设Nacos服务器地址为`127.0.0.1:8848`),在配置管理模块中创建配置文件。需要指定配置的`Data ID`(一般为服务名称加上配置文件类型,如`your - service - name.properties`或`your - service - name.yml`)、`Group`(可自