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 Boot | 2.7.18 |
| Spring Cloud Alibaba | 2021.0.5.0 |
| Spring Cloud | 2021.0.8 |
| Nacos | 2.2.3 |
| Sentinel | 1.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 配置中心]
微服务架构说明:
- 网关层:统一入口,负责路由、限流、认证
- 服务层:业务服务,按领域拆分
- 注册中心:服务注册与发现
- 配置中心:统一配置管理
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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
