java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java分布式

Java中的分布式概念说明

作者:阿乾之铭

在Java中,分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统,这种系统架构的目的是利用更多的机器处理更多的数据,从而解决单个计算机无法应对的计算、存储任务,本文给大家介绍Java中的分布式概念说明,感兴趣的朋友一起看看吧

1. 分布式的基本概念

1.1 什么是分布式系统?

1.2 分布式 vs. 单体架构

类型描述举例
水平拆分(微服务)一个系统被拆成多个功能模块,部署在不同节点上订单服务、用户服务、商品服务各自部署
垂直扩展(集群)同一个程序部署多份,提高并发能力多个 Tomcat 实例同时跑一个 SpringBoot 项目
混合型微服务 + 每个服务本身也集群部署现在主流架构

 (1)是一个程序拆分成多个模块,每个模块部署在不同虚拟机上,这叫分布式吗?

✔️ 是的,这是最典型的分布式方式,叫“微服务架构”。

每个模块(比如订单、用户、商品服务)可以独立开发、部署、伸缩,节点之间通过 REST API 或 RPC 调用通信。

(2)如果是一个程序本身部署多个虚拟机实例,这算分布式吗?

✔️ 这叫集群部署,也算分布式的一种,但更准确说是“分布式部署”或者“高可用集群”

多个实例共享负载,提高并发处理能力和可用性,但它们属于同一个服务模块。

(3)多个虚拟机放在一台云服务器上,还算分布式吗?

✔️是的,从系统架构角度看,只要是多个独立进程/服务协同工作,就算分布式

但从容错和可用性角度看:

(4)Redis 的哨兵模式可以部署在一个云服务器上吗?

✔️可以,但不推荐。

Redis 的部署模式

模式特点说明
单机模式开发测试用不适合生产
主从复制(Master-Slave)读写分离一主多从,提高读取性能
哨兵模式(Sentinel)自动故障转移监控主节点,自动主从切换
集群模式(Cluster)真正分布式多主多从,分片存储,高可用、高扩展

(5)数据库的分库也能部署在一个云服务器上吗?

✔️,但也不推荐。

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 分布式架构的实现方式

3.1 分布式服务(微服务)

微服务(Microservices)是 架构设计理念,它强调将一个大型应用拆分成多个 独立部署独立运行 的小型服务,每个服务负责特定的业务逻辑。是否是微服务 不取决于是否运行在 同一台云服务器,而取决于它们是否是独立的服务实例

微服务的特点

1. 微服务必须部署在不同的服务器上才算微服务吗?不是,微服务可以部署在同一台服务器上,只要它们是独立的进程(不同的 JVM 实例)。

例如:

这些都是微服务,即使它们都在同一台服务器上运行。

2. 只要是同一个 JVM 里的多个模块,就不能算是微服务?

3. 多个微服务共享同一个数据库,还叫微服务吗?

在 Spring Boot 中如何实现微服务?

3.2 服务注册与发现(Service Discovery)

当我们有了多个微服务之后,问题来了:如何让它们相互找到对方?

常见的注册中心:

在 Spring Boot + Spring Cloud 中配置服务注册发现,大致流程:

  1. pom.xml 中引入对应的依赖(例如 spring-cloud-starter-alibaba-nacos-discovery)。
  2. application.yml 中配置好注册中心地址 server-addr: localhost:8848 等。
  3. 启动时,服务会自动注册到 Nacos(或其他注册中心)。

3.3 分布式配置中心

配置中心 主要解决的是“在分布式环境中,如何统一管理各个微服务的配置”,避免每个服务都各自持有不同的配置文件,难以维护。

好处:

3.4 分布式缓存(Redis 等)

在分布式环境下,数据库通常成为性能瓶颈。为减少对数据库的直接访问和压力,需要一个 高性能的分布式缓存。Redis 是最常用的选择,它具有以下优势:

  1. 内存存储,读写速度快。
  2. 丰富的数据结构(字符串、哈希、列表、集合、有序集合等)。
  3. 支持 主从复制Cluster 集群,适合分布式部署。
  4. 常用于 缓存热点数据、分布式 Session、分布式锁 等场景。

使用 Redis 的关键点:

3.5 分布式锁

在分布式环境中,如果多个节点同时对同一个资源进行写操作,就容易出现数据不一致或并发冲突。因此,需要一种分布式锁来保证 在同一时间,只有一个节点可以获取锁,进行资源操作

常见方案:

示例:基于 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)即可。但在分布式系统中,可能一个操作需要 跨多个微服务、跨多个数据库,这时就出现了 分布式事务 问题:

常见分布式事务方案:

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 方案有:

MQ 的作用

3.8 API 网关与负载均衡

当服务拆分越来越多,我们往往需要一个统一的 网关 来管理请求:

4、整体流程与示例

4.1 典型电商微服务调用链

电商订单 流程为例,来看看分布式系统下的一般调用。

  1. 用户 访问 API 网关(或 Nginx),请求 /api/order/create 接口。
  2. 网关解析路由规则,将请求转发给 OrderService
  3. OrderService 调用 UserService 检查用户信息(比如积分、等级等)。
  4. OrderService 调用 ProductService 检查库存、扣减库存;同时查询商品价格。
  5. OrderService 写入订单数据库,本地事务或分布式事务处理。
  6. OrderServiceMQ 发送消息,用于通知其他服务(如物流、积分系统等)。
  7. MQ 的消费者(如 LogisticsService)消费消息并执行下一步操作。

在这个过程中,会用到:

4.2 部署模式

到此这篇关于Java中的分布式(概念说明)的文章就介绍到这了,更多相关java分布式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文