Day30 Spring Cloud

1. 分布式基础

1.1 什么是分布式系统

分布式系统是由多个独立计算机节点组成的系统,这些节点通过网络通信,共同完成特定的任务。分布式系统是为了解决单机系统在性能、可用性、可扩展性方面的限制而出现的。

分布式系统的特征:

  • 分布性:节点分布在不同的物理位置
  • 并发性:多个节点可以并发执行任务
  • 无全局时钟:节点间没有统一的时间基准
  • 异步通信:节点间通过消息传递进行通信
  • 故障独立性:单个节点故障不会导致整个系统崩溃

1.2 分布式系统的核心问题

问题描述解决方案
通信节点间如何高效、可靠地通信RPC、消息队列
一致性多节点数据如何保持一致分布式事务、一致性协议
可用性系统在部分故障时是否可用副本、故障转移
分区容错网络分区时系统如何应对CAP、BASE 理论

1.3 CAP 理论

mermaid
复制代码
graph TB A[CAP 理论] --> B[Consistency 一致性] A --> C[Availability 可用性] A --> D[Partition Tolerance 分区容错] B --> E[所有节点数据同一时间完全一致] C --> F[每次请求都能获取到响应] D --> G[系统在网络分区时仍能运行] H[分布式系统] --> I[AP: 可用性 + 分区容错] H --> J[CP: 一致性 + 分区容错] H --> K[CA: 一致性 + 可用性]

CAP 三要素详解:

要素说明示例
一致性所有节点在同一时间看到的数据相同主从复制同步
可用性每次请求都能获取到响应(不保证数据是最新的)缓存系统
分区容错系统在网络分区时仍能运行分布式数据库

CAP 不可能三角:分布式系统最多只能同时满足其中两个特性,必须在一致性和可用性之间做权衡。

CAP 组合选择:

组合特点适用场景
CP保证一致性,牺牲可用性金融系统、支付系统
AP保证可用性,牺牲一致性社交网络、内容分发
CA不考虑分区容错(单机系统)传统关系型数据库

1.4 BASE 理论

BASE 是对 CAP 中 AP 策略的延伸,强调的是最终一致性。

要素说明
Basically Available基本可用,允许部分失败
Soft state软状态,状态可以随时间变化
Eventually consistent最终一致,经过一段时间后数据达到一致

CAP vs BASE:

理论一致性要求适用场景
CAP强一致性CP:强一致性AP:弱一致性
BASE最终一致性对一致性要求不高的场景

1.5 分布式事务解决方案

mermaid
复制代码
graph LR A[分布式事务] --> B[2PC 两阶段提交] A --> C[3PC 三阶段提交] A --> D[TCC Try-Confirm-Cancel] A --> E[本地消息表] A --> F[事务消息] A --> G[Saga 模式]

分布式事务解决方案对比:

方案一致性复杂度性能适用场景
2PC强一致性传统数据库
TCC强一致性金融业务
本地消息表最终一致性异步场景
事务消息最终一致性高并发场景
Saga最终一致性长流程业务

2. Demo 搭建

2.1 版本选择

组件版本
Spring Boot2.7.18
Spring Cloud Alibaba2021.0.5.0
Spring Cloud2021.0.8
Nacos2.2.3
Sentinel1.8.6

版本兼容性说明:

Spring Cloud Alibaba 版本与 Spring Boot 版本有严格的对应关系,选择不匹配的版本会导致启动失败。官方提供了详细的版本对应表。

2.2 父工程 pom.xml

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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>spring-cloud-alibaba-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>order-service</module> <module>stock-service</module> <module>gateway-service</module> </modules> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> <spring-cloud.version>2021.0.8</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>

2.3 微服务架构流程

mermaid
复制代码
graph TD A[客户端] --> B[Gateway 网关] B --> C[路由转发] C --> D[订单服务] C --> E[库存服务] C --> F[用户服务] D --> G[Nacos 注册中心] E --> G F --> G G --> H[Nacos 配置中心]

微服务架构说明:

  1. 网关层:统一入口,负责路由、限流、认证
  2. 服务层:业务服务,按领域拆分
  3. 注册中心:服务注册与发现
  4. 配置中心:统一配置管理

3. Nacos 服务注册与配置中心

3.1 Nacos 概述

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

Nacos 核心功能:

  • 服务注册与发现:支持 DNS 和 RPC 服务发现
  • 动态配置服务:支持配置的热更新
  • 动态 DNS 服务:支持权重路由
  • 服务及其元数据管理:管理服务的元数据

3.2 Nacos 架构

mermaid
复制代码
graph TB A[客户端应用] --> B[Nacos Server] A --> C[获取配置/监听配置] B --> D[服务注册表] B --> E[配置存储] F[Nacos Console] --> B subgraph Nacos 集群 B1[Node 1] B2[Node 2] B3[Node 3] end B1 <--> B2 B2 <--> B3 B3 <--> B1 subgraph 存储层 G[Derby 默认存储] H[MySQL 生产存储] end E --> G E --> H

Nacos 架构分层:

层级组件说明
接入层SDK客户端 SDK
服务层Core核心功能实现
数据层Storage数据持久化

3.3 服务注册与发现

服务注册流程

mermaid
复制代码
sequenceDiagram participant App as 应用启动 participant Nacos as Nacos Server participant DB as 数据存储 App->>Nacos: 发起服务注册 Nacos->>DB: 保存服务实例信息 DB-->>Nacos: 保存成功 Nacos-->>App: 返回注册成功 loop 心跳检测 App->>Nacos: 发送心跳(5秒间隔) Nacos-->>App: 心跳响应 end Note over Nacos,DB: 超过15秒未收到心跳<br/>实例不健康 Note over Nacos,DB: 超过30秒未收到心跳<br/>实例被剔除

服务注册关键参数:

参数说明默认值
服务名服务标识spring.application.name
IP实例 IP自动获取
端口实例端口server.port
健康检查健康检查 URL/actuator/health
命名空间环境隔离public
分组服务分组DEFAULT_GROUP

服务发现示例

java
复制代码
@RestController @RequestMapping("/order") public class OrderController { @Autowired private DiscoveryClient discoveryClient; @Autowired private LoadBalancerClient loadBalancerClient; /** * 获取所有服务列表 */ @GetMapping("/services") public List<String> getServices() { return discoveryClient.getServices(); } /** * 获取指定服务的实例 */ @GetMapping("/instances/{serviceName}") public List<ServiceInstance> getInstances(@PathVariable String serviceName) { return discoveryClient.getInstances(serviceName); } /** * 使用负载均衡器获取服务地址 */ @GetMapping("/stock-url") public String getStockUrl() { ServiceInstance instance = loadBalancerClient.choose("stock-service"); return instance.getHost() + ":" + instance.getPort(); } }

3.4 配置中心

配置中心特性

特性说明
热更新配置变更实时推送
版本管理配置版本历史记录
灰度发布按比例发布配置
配置监听支持配置变更监听
配置加密敏感配置加密存储

配置中心使用示例

java
复制代码
@RestController @RefreshScope // 支持配置动态刷新 public class ConfigController { @Value("${order.timeout:3000}") private Integer timeout; @Value("${order.maxRetry:3}") private Integer maxRetry; @Autowired private ConfigurableApplicationContext applicationContext; @GetMapping("/config") public Map<String, Object> getConfig() { Map<String, Object> config = new HashMap<>(); config.put("timeout", timeout); config.put("maxRetry", maxRetry); config.put("environment", applicationContext.getEnvironment()); return config; } }

3.5 Nacos 配置

yaml
复制代码
spring: application: name: order-service cloud: nacos: server-addr: 127.0.0.1:8848 discovery: namespace: dev group: DEFAULT_GROUP enabled:true # 心跳配置 heart-beat-interval:5000 # 心跳间隔 heart-beat-timeout:15000 # 心跳超时 ip-delete-timeout:30000 # 实例删除超时 config: namespace: dev group: DEFAULT_GROUP file-extension: yaml # 配置刷新 refresh-enabled:true # 共享配置 shared-configs: -dataId: common.yaml group: DEFAULT_GROUP refresh:true

3.6 命名空间和分组

命名空间:

用于隔离不同环境或租户的配置和服务。

类型说明适用场景
public默认命名空间开发测试
自定义自定义命名空间生产环境隔离

分组:

在命名空间下进一步分组,通常用于区分不同业务线或应用组。

text
复制代码
dev 命名空间 ├── DEFAULT_GROUP ├── ORDER_GROUP └── USER_GROUP

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP