Java中的分布式(概念说明)

打印 上一主题 下一主题

主题 1043|帖子 1043|积分 3129

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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),同一处置惩罚路由、鉴权、流量控制


  • 服务间通信方式

    • 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 的简易分布式锁代码(示例性,不是完整生产级)
  1. String lockKey = "lock:order";
  2. String lockVal = UUID.randomUUID().toString();
  3. // 尝试加锁
  4. Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 10, TimeUnit.SECONDS);
  5. if (Boolean.TRUE.equals(success)) {
  6.     try {
  7.         // 执行业务逻辑
  8.     } finally {
  9.         // 解锁时,先判断锁是否是自己加的
  10.         String val = redisTemplate.opsForValue().get(lockKey);
  11.         if (lockVal.equals(val)) {
  12.             redisTemplate.delete(lockKey);
  13.         }
  14.     }
  15. }
复制代码

3.6 分布式事务

在单体应用中,事务只需要依靠数据库的当地事务(ACID)即可。但在分布式系统中,大概一个操作需要 跨多个微服务、跨多个数据库,这时就出现了 分布式事务 问题:


  • 例如,在电阛阓景下,创建订单 时,要同时扣减库存、生成支付记载等,这些操作都在差异微服务里完成;如果此中某一步出错,就需要回滚之前的操作。
常见分布式事务方案:


  • 2PC(两阶段提交):和谐者告诉全部到场者先预提交,然后再同一提交或回滚。实现复杂,性能损耗大,适合对同等性要求极高的场景。
  • TCC(Try-Confirm-Cancel):业务系统自己实现各个操作的 “Try, Confirm, Cancel”,实现灵活,但开辟成本高。
  • Seata:阿里开源的分布式事务框架,提供 AT 模式(对 JDBC 层做署理),也提供 TCC 等模式。
Seata 示例
  1. @GlobalTransactional
  2. public void placeOrder(Order order) {
  3.     // 跨服务调用
  4.     inventoryService.decreaseStock(order.getProductId(), order.getQuantity());
  5.     paymentService.processPayment(order);
  6.     orderMapper.insert(order);
  7.     // Seata 会在这里把整个调用过程进行管理,可做到成功或回滚
  8. }
复制代码
在执行过程中,如果此中一个调用报错,Seata 就会通知其他服务举行回滚。

3.7 分布式消息队列

消息队列 (Message Queue) 用于解耦系统、异步处置惩罚和削峰填谷。常见的 MQ 方案有:


  • RabbitMQ:轻量级,支持事务与确认机制,适合传统企业应用以及对消息可靠性要求高的场景。
  • Apache Kafka:高吞吐,大规模数据流处置惩罚的“事实标准”,更多用于大数据、日记收集、流式处置惩罚等场景。
  • RocketMQ:阿里开源的分布式消息中间件,和 Kafka 类似,也有较高的吞吐。
MQ 的作用


  • 解耦:好比,用户下单后,需要发送优惠券、通知物流、通知商家等,而如果全部这些操作都放在下单接口里,会导致耦合过高;使用 MQ,每个消耗者服务负责监听消息并执行相应的业务逻辑。
  • 削峰填谷:在高峰时段,订单系统可以快速写入消息队列,配景处置惩罚系统再慢慢消耗,制止直接压垮数据库或其他服务。
  • 异步:不需要同步等候消息处置惩罚完成,加速用户哀求的响应速率。

3.8 API 网关与负载均衡

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


  • 服务网关(如 Spring Cloud GatewayNginxKong):

    • 同一对外提供访问入口
    • 举行路由分发,鉴权,限流,监控等
    • 在微服务复杂时,可以屏蔽内部服务接口的变化,对外提供稳定的 API。

  • 负载均衡

    • 当某个微服务有多个实例时,网关或负载均衡器需要把哀求分散到各个实例上,制止此中一个实例被打满。
    • 常见方式:Nginx 反向署理Spring Cloud Ribbon (新版 Spring Cloud LoadBalancer)都可实现负载均衡。


四、团体流程与示例

4.1 典型电商微服务调用链

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

  • 用户 访问 API 网关(或 Nginx),哀求 /api/order/create 接口。
  • 网关剖析路由规则,将哀求转发给 OrderService
  • OrderService 调用 UserService 检查用户信息(好比积分、等级等)。
  • OrderService 调用 ProductService 检查库存、扣减库存;同时查询商品代价。
  • OrderService 写入订单数据库,当地事务或分布式事务处置惩罚。
  • OrderServiceMQ 发送消息,用于通知其他服务(如物流、积分系统等)。
  • 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)举行管理


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表