Java中的分布式(概念说明)
1. 分布式的基本概念
1.1 什么是分布式系统?
- 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。
- 不同节点之间通过网络通信来协同处理请求或共享数据,相对于「单体应用」而言,可以带来更高的吞吐量、可用性和灵活扩展能力。
1.2 分布式 vs. 单体架构
-
单体架构
- 所有业务模块部署在同一应用实例中,垂直扩容(升级服务器硬件)成为主要的扩展方式。
- 优点:开发调试较简单,部署方便。
- 缺点:当应用规模过大时,任何一个模块出现故障或性能瓶颈,都会影响整个系统,并且无法灵活扩容单个模块。
-
分布式架构
- 将系统拆分成若干服务或节点,每个节点可以独立运行、独立扩容、独立维护。
- 优点:更好的可扩展性、可靠性,能处理更高并发和数据量。
- 缺点:系统变得复杂,需要处理 网络通信、数据一致性、运维管理 等问题。
1.3 分布式系统的核心挑战
- 数据一致性:多节点同时修改同一数据,如何保证最终数据正确?
- 可用性:某个节点失败不会影响整体服务。
- 可扩展性:需要随业务增长快速增加节点处理能力。
- 网络延迟与可靠性:网络抖动、分区故障等异常场景必须做好应对策略(如重试、降级)。
- 系统复杂度:日志监控、调试、部署都更加繁琐。
2. 分布式架构的主要组成部分
Spring Boot 下的分布式架构通常包含以下几个关键部分:
组件 | 作用 |
---|---|
分布式服务(微服务) | 业务拆分,避免单体架构的复杂性 |
分布式缓存(Redis) | 提高查询性能,减少数据库压力 |
分布式锁(Redis/Zookeeper) | 解决多个节点同时修改数据的一致性问题 |
分布式事务(Seata) | 保障数据一致性,避免并发冲突 |
分布式消息队列(RabbitMQ/Kafka) | 异步处理任务,提升系统吞吐量 |
服务注册与发现(Nacos/Eureka) | 让服务可以自动发现彼此,不需要手动配置 |
分布式配置中心(Nacos/Spring Cloud Config) | 统一管理配置,提高可维护性 |
负载均衡(Nginx/Spring Cloud Gateway) | 把请求合理分配到多个服务实例 |
分布式任务调度(ElasticJob/Xxl-Job) | 让多个服务器协同执行定时任务 |
3. Spring Boot 分布式架构的实现方式
- Redis 提供缓存和分布式锁,提升性能
- Nacos/Eureka 让微服务可以互相发现
- MQ 让服务之间异步通信,减少耦合
- Seata 保证分布式事务一致性
- 负载均衡 + API 网关 让服务更高效
3.1 分布式服务(微服务)
- 含义:把一个庞大的单体应用拆分成若干个服务,每个服务只负责一个“相对独立的业务领域或功能”,称之为“微服务”。
- 示例:
UserService
:专注处理用户登录、注册、用户信息管理OrderService
:负责订单的创建、查询、支付信息对接ProductService
:管理产品、库存、定价等PaymentService
:处理支付渠道、账务、对账逻辑
- 示例:
- 好处:
- 解耦:每个服务都可独立部署、升级,互不影响。
- 独立扩展:哪块业务压力大就扩容对应服务的节点,而不是整合到一起。
- 技术栈灵活:不同服务甚至可以用不同的语言或框架。
在 Spring Boot 中如何实现微服务?
-
Spring Boot + Spring Cloud
- Spring Cloud 提供了微服务生态,包括:
- 服务注册与发现(Eureka, Nacos, Consul),让各微服务在一个注册中心上登记并获取彼此的地址
- 负载均衡(Ribbon 或 Spring Cloud LoadBalancer),在调用某个微服务时自动从多个实例中选一台
- 服务调用(Feign),通过 HTTP/REST 的方式去请求其他微服务
- 熔断、限流(Hystrix, Sentinel),在调用失效时防止雪崩
- 网关(Spring Cloud Gateway),统一处理路由、鉴权、流量控制
- Spring Cloud 提供了微服务生态,包括:
-
服务间通信方式
- HTTP/REST:最常见的形式,每个微服务暴露 RESTful API,其他微服务通过 HTTP 调用。
- RPC:部分场景需要高性能的调用,可以使用 RPC(例如 Dubbo、gRPC),减少网络开销,提升效率。
- 消息队列:如果是异步调用场景,还会结合 MQ 来实现解耦与异步化。
3.2 服务注册与发现(Service Discovery)
当我们有了多个微服务之后,问题来了:如何让它们相互找到对方?
- 传统做法:在配置文件里写死每个服务的地址。但一旦服务集群扩容或 IP 地址变动,就要重新修改配置,非常麻烦。
- 分布式做法:服务注册与发现。各个微服务在启动时,自动向“注册中心”报到,注册中心会保存当前可用的服务实例列表。其他服务要调用它时,只需要从注册中心查到目标服务的地址就行。
常见的注册中心:
- Eureka(Netflix OSS)
- Nacos(阿里巴巴开源,功能更强大,也能做配置中心)
- Zookeeper(Apache 基金会项目,也能做服务注册,但更多用于分布式协调)
在 Spring Boot + Spring Cloud 中配置服务注册发现,大致流程:
- 在
pom.xml
中引入对应的依赖(例如spring-cloud-starter-alibaba-nacos-discovery
)。 - 在
application.yml
中配置好注册中心地址server-addr: localhost:8848
等。 - 启动时,服务会自动注册到 Nacos(或其他注册中心)。
3.3 分布式配置中心
配置中心 主要解决的是“在分布式环境中,如何统一管理各个微服务的配置”,避免每个服务都各自持有不同的配置文件,难以维护。
- Spring Cloud Config:早期常用的配置中心,基于 Git 存储配置
- Nacos Config:Nacos 同时提供注册发现和配置管理
- Apollo(携程开源)或 Disconf 等也可以
好处:
- 统一管理:所有配置信息都在一个地方(配置中心),修改后可实时生效。
- 动态更新:微服务在运行时能监控到配置变动,自动刷新,无需重启。
- 区分环境:如 DEV, TEST, PROD 环境对应不同配置。
3.4 分布式缓存(Redis 等)
在分布式环境下,数据库通常成为性能瓶颈。为减少对数据库的直接访问和压力,需要一个 高性能的分布式缓存。Redis 是最常用的选择,它具有以下优势:
- 内存存储,读写速度快。
- 丰富的数据结构(字符串、哈希、列表、集合、有序集合等)。
- 支持 主从复制、Cluster 集群,适合分布式部署。
- 常用于 缓存热点数据、分布式 Session、分布式锁 等场景。
使用 Redis 的关键点:
- 设计 合理的缓存键(key),比如
product:detail:{productId}
。 - 设置 过期时间,避免缓存数据与数据库数据长期不一致。
- 考虑 缓存穿透、缓存雪崩、缓存击穿 等问题,并进行对应的防护(如 Bloom Filter, 加互斥锁, 合理限流等)。
3.5 分布式锁
在分布式环境中,如果多个节点同时对同一个资源进行写操作,就容易出现数据不一致或并发冲突。因此,需要一种分布式锁来保证 在同一时间,只有一个节点可以获取锁,进行资源操作。
常见方案:
- Redis 分布式锁
- 使用
SETNX
(set if not exist) +EXPIRE
或SET key value NX PX time
命令实现。 - 注意要设置超时时间,避免锁无法释放导致死锁。
- 也要考虑锁的续约和解锁时的原子性操作(Lua 脚本),以避免误删他人的锁。
- 使用
- Zookeeper 分布式锁
- 利用 ZK 的临时顺序节点来竞争锁,监听事件,一旦获取锁的节点断开连接,就自动删除节点,其他节点立即感知到并可重新竞争。
示例:基于 Redis 的简易分布式锁代码(示例性,不是完整生产级)
String lockKey = "lock:order";
String lockVal = UUID.randomUUID().toString();// 尝试加锁
Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 10, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(success)) {try {// 执行业务逻辑} finally {// 解锁时,先判断锁是否是自己加的String val = redisTemplate.opsForValue().get(lockKey);if (lockVal.equals(val)) {redisTemplate.delete(lockKey);}}
}
3.6 分布式事务
在单体应用中,事务只需要依赖数据库的本地事务(ACID)即可。但在分布式系统中,可能一个操作需要 跨多个微服务、跨多个数据库,这时就出现了 分布式事务 问题:
- 例如,在电商场景下,创建订单 时,要同时扣减库存、生成支付记录等,这些操作都在不同微服务里完成;如果其中某一步出错,就需要回滚之前的操作。
常见分布式事务方案:
- 2PC(两阶段提交):协调者告诉所有参与者先预提交,然后再统一提交或回滚。实现复杂,性能损耗大,适合对一致性要求极高的场景。
- TCC(Try-Confirm-Cancel):业务系统自己实现各个操作的 “Try, Confirm, Cancel”,实现灵活,但开发成本高。
- Seata:阿里开源的分布式事务框架,提供 AT 模式(对 JDBC 层做代理),也提供 TCC 等模式。
Seata 示例
@GlobalTransactional
public void placeOrder(Order order) {// 跨服务调用inventoryService.decreaseStock(order.getProductId(), order.getQuantity());paymentService.processPayment(order);orderMapper.insert(order);// Seata 会在这里把整个调用过程进行管理,可做到成功或回滚
}
在执行过程中,如果其中一个调用报错,Seata 就会通知其他服务进行回滚。
3.7 分布式消息队列
消息队列 (Message Queue) 用于解耦系统、异步处理和削峰填谷。常见的 MQ 方案有:
- RabbitMQ:轻量级,支持事务与确认机制,适合传统企业应用以及对消息可靠性要求高的场景。
- Apache Kafka:高吞吐,大规模数据流处理的“事实标准”,更多用于大数据、日志收集、流式处理等场景。
- RocketMQ:阿里开源的分布式消息中间件,和 Kafka 类似,也有较高的吞吐。
MQ 的作用:
- 解耦:比如,用户下单后,需要发送优惠券、通知物流、通知商家等,而如果所有这些操作都放在下单接口里,会导致耦合过高;使用 MQ,每个消费者服务负责监听消息并执行相应的业务逻辑。
- 削峰填谷:在高峰时段,订单系统可以快速写入消息队列,后台处理系统再慢慢消费,避免直接压垮数据库或其他服务。
- 异步:不需要同步等待消息处理完成,加快用户请求的响应速度。
3.8 API 网关与负载均衡
当服务拆分越来越多,我们往往需要一个统一的 网关 来管理请求:
- 服务网关(如 Spring Cloud Gateway、Nginx、Kong):
- 统一对外提供访问入口
- 进行路由分发,鉴权,限流,监控等
- 在微服务复杂时,可以屏蔽内部服务接口的变化,对外提供稳定的 API。
- 负载均衡:
- 当某个微服务有多个实例时,网关或负载均衡器需要把请求分散到各个实例上,避免其中一个实例被打满。
- 常见方式:Nginx 反向代理 或 Spring Cloud Ribbon (新版 Spring Cloud LoadBalancer)都可实现负载均衡。
四、整体流程与示例
4.1 典型电商微服务调用链
以 电商订单 流程为例,来看看分布式系统下的一般调用。
- 用户 访问 API 网关(或 Nginx),请求
/api/order/create
接口。 - 网关解析路由规则,将请求转发给 OrderService。
- OrderService 调用 UserService 检查用户信息(比如积分、等级等)。
- OrderService 调用 ProductService 检查库存、扣减库存;同时查询商品价格。
- OrderService 写入订单数据库,本地事务或分布式事务处理。
- OrderService 向 MQ 发送消息,用于通知其他服务(如物流、积分系统等)。
- MQ 的消费者(如 LogisticsService)消费消息并执行下一步操作。
在这个过程中,会用到:
- 服务注册中心(保证 OrderService 能动态发现 ProductService 的地址)
- 分布式缓存(可能在 OrderService、ProductService 的查询环节做缓存)
- 分布式锁(避免多次重复扣减库存)
- 分布式事务(如要保证扣库存与下单一致)
- 消息队列(通知其他异步任务)
4.2 部署模式
- 开发/测试环境:一般都是在本地 Docker 或者虚拟机里把注册中心、MQ、Redis、数据库等组件跑起来即可。
- 生产环境:会把各个服务独立部署在多台服务器(或容器云)上:
- 注册中心、配置中心(Nacos/Consul/Eureka)集群
- Redis 高可用集群(主从+哨兵模式或 Redis Cluster)
- MQ 集群(RabbitMQ 集群或 Kafka 集群)
- 分布式文件系统(如 MinIO, FastDFS, OSS 等)
- 后端数据存储(MySQL 或者多分片数据库),需要做读写分离或分库分表
- 若干微服务集群(UserService、OrderService...),通过容器编排(Kubernetes 或 Docker Swarm)进行管理
相关文章:
Java中的分布式(概念说明)
1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...

Field ‘id‘ doesn‘t have a default value
1.程序测试时,运行到向数据库插入数据时,报以下异常 是id没有默认值; 在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位 2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获…...
蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)
一、栈的基本概念 栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...

Hive之分区表
Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…...

Redis之持久化
1.前言 Redis⽀持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。本文内容: • 介绍RDB、AOF的配置和运⾏流程,以及控制持久化的命令,…...
有关计算机的英语单词、短语、句子
基本计算机术语 Computer – 计算机 Hardware – 硬件 Software – 软件 Operating System (OS) – 操作系统 Processor (CPU) – 处理器(中央处理单元) Memory (RAM) – 内存(随机存取存储器) Storage – 存储 Disk Drive – 硬…...
String、StringBuffer、StringBuilder 区别
在 Java 编程中,String、StringBuffer 和 StringBuilder 是处理字符串时常用的类。它们在功能上有相似之处,但在内部实现、性能、线程安全性等方面存在显著差异。理解这些差异有助于开发者在不同的场景下做出合适的选择,提高代码的性能和效率…...

shell——分支语句
文章目录 基本语法常用判断条件(1)两个整数之间比较(2)按照文件权限进行判断(3)按照文件类型进行判断(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令…...

【vue3】实现pdf在线预览的几种方式
今天一天对当前可用的pdf预览插件做了测试,主要需求是只能预览不能下载,但对于前端来说,没有绝对的禁止,这里只罗列实现方式。 目前采用vue3版本为:3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的…...
(学习总结22)Linux 基本指令1
Linux 基本指令1 基本指令当前目录信息指令 ls查看路径指令 pwd改变当前所在目录指令 cd创建或更改文件时间指令 touch创建目录指令 mkdir删除空目录指令 rmdir删除指令 rm查阅手册指令 man拷贝文件指令 cp移动文件指令 mv打印内容指令 echo 查看指令查找文件指令 find查看指令…...

Linux:用 clang 编译带 sched_ext 功能内核
文章目录 1. 前言2. 编译过程2.1 准备内核源代码2.2 安装编译工具2.3 配置、编译、运行2.3.1 配置2.3.2 编译2.3.3 运行 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 编译过程 …...

Redis 的集群 --- 数据分开扛
序言 上一章内容中我们介绍到了 哨兵 来保证我们主机在发生故障时能够及时地选出一个新的主机,但是哨兵地加入只是提供了 高可用性 和 故障转移,并没有真正的提升架构的性能。如果不断地加入新的数据的话,主机的压力会很大,一方面…...
微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍: 1. 数据缓存的类型 微信小程序提供了两种数据缓…...
LeetCode 每日一题 2025/2/10-2025/2/16
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/10 913. 猫和老鼠2/11 1728. 猫和老鼠 II2/12 1760. 袋子里最少数目的球2/13 1742. 盒子中小球的最大数量2/14 1552. 两球之间的磁力2/15 1706. 球会落何处2/16 1299. 将…...
使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
1. 项目设置 首先,确保你的项目已经配置好 Maven 或 Gradle 依赖管理工具,并添加以下依赖: Maven 依赖 <dependencies><!-- Shiro 核心库 --><dependency><groupId>org.apache.shiro</groupId><artifactI…...

DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...

141,【1】buuctf web [SUCTF 2019]EasyWeb
进入靶场 代码审计 <?php // 定义函数get_the_flag,功能是处理文件上传相关操作 function get_the_flag() {// 注释说明:webadmin会每隔20分钟删除用户上传的文件$userdir "upload/tmp_" . md5($_SERVER[REMOTE_ADDR]);// 检查用户目录…...
破解微服务疑难杂症:2025年全解决方案
微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等…...
Node.js 中的 Event 模块详解
Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...