Java基礎(十四)分布式

一、CAP 理論

CAP 原則,又稱 CAP 定理,指出在分布式系統中,Consistency(一致性)、Availability(可用性)和 Partition tolerance(分區容錯性)這三個特性無法同時滿足,最多只能滿足其中兩項。

  • 一致性(Consistency):所有節點在同一時刻具有相同的數據副本。即任何客戶端在任何節點讀取到的都是最新寫入的數據。
  • 可用性(Availability):系統始終能夠對請求做出響應,即使部分節點發生故障。
  • 分區容錯性(Partition tolerance):系統在遇到網絡分區(節點間無法通信)時仍能繼續運行。

由于網絡分區在分布式環境中難以避免,系統通常需要在 C 和 A 之間做出權衡。例如,銀行系統可能選擇 CP(強一致性),而互聯網應用可能選擇 AP(高可用性)。

在這里插入圖片描述


二、Spring Cloud Alibaba 生態體系

Spring Cloud Alibaba 為分布式應用開發提供了一站式解決方案,集成了阿里巴巴眾多開源組件。

1. 核心組件概覽

組件功能替代方案特點
Nacos服務注冊與發現、配置管理Eureka + Config支持AP/CP模式切換,實時配置推送
Sentinel流量控制、熔斷降級Hystrix可視化控制臺,實時監控
Seata分布式事務-AT、TCC、Saga多種模式
RocketMQ消息隊列Kafka、RabbitMQ順序消息,事務消息
DubboRPC框架Spring Cloud OpenFeign高性能,服務治理

2. Spring Cloud Alibaba 項目搭建

<!-- pom.xml 依賴配置 -->
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
</dependencies>

3. Nacos 服務注冊與發現

# application.yml 配置
spring:application:name: user-servicecloud:nacos:discovery:server-addr: localhost:8848namespace: devgroup: DEFAULT_GROUPconfig:server-addr: localhost:8848file-extension: yamlrefresh-enabled: true
// 服務注冊與發現示例
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {@RestController@RequestMapping("/users")public class UserController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/services")public List<String> getServices() {return discoveryClient.getServices();}@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}}public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}
}

4. Sentinel 流量控制與熔斷

// Sentinel 配置與使用
@Configuration
public class SentinelConfig {@PostConstructpublic void init() {// 配置流量控制規則List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("getUser");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(10); // 每秒最多10次請求rules.add(rule);FlowRuleManager.loadRules(rules);// 配置熔斷規則List<DegradeRule> degradeRules = new ArrayList<>();DegradeRule degradeRule = new DegradeRule();degradeRule.setResource("getUser");degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);degradeRule.setCount(5); // 5個異常觸發熔斷degradeRule.setTimeWindow(10); // 熔斷10秒degradeRules.add(degradeRule);DegradeRuleManager.loadRules(degradeRules);}
}@Service
public class UserService {@SentinelResource(value = "getUser", blockHandler = "handleBlock", fallback = "getUserFallback")public User getUserById(Long id) {// 業務邏輯return userRepository.findById(id);}// 限流處理public User handleBlock(Long id, BlockException ex) {throw new RuntimeException("系統繁忙,請稍后重試");}// 熔斷降級處理public User getUserFallback(Long id, Throwable ex) {return new User(id, "默認用戶", "default@example.com");}
}

5. Seata 分布式事務

// Seata 分布式事務示例
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate AccountService accountService;@Autowiredprivate StorageService storageService;@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)public void createOrder(Order order) {// 1. 創建訂單orderMapper.insert(order);// 2. 扣減庫存storageService.deduct(order.getProductId(), order.getCount());// 3. 扣減余額accountService.debit(order.getUserId(), order.getMoney());// 4. 更新訂單狀態orderMapper.updateStatus(order.getId(), 1);}
}// 配置 seata
@Configuration
public class SeataConfig {@Beanpublic DataSourceProxy dataSourceProxy(DataSource dataSource) {return new DataSourceProxy(dataSource);}
}

三、分布式鎖的實現

1. 基于 Redis 的分布式鎖

Redis 通過 SET 命令的 NXPX 選項實現分布式鎖:

// 加鎖示例(Java + Redis)
public boolean tryLock(String key, String value, long expireTime) {String result = jedis.set(key, value, "NX", "PX", expireTime);return "OK".equals(result);
}// 釋放鎖(使用 Lua 腳本保證原子性)
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList(value));

注意:需確保 value 具有唯一性(如 UUID + 線程ID),避免誤釋。

2. 基于 ZooKeeper 的分布式鎖

ZooKeeper 通過臨時順序節點和 Watch 機制實現分布式鎖:

  1. /locks 下創建臨時順序節點。
  2. 判斷當前節點是否為最小序號節點,若是則獲取鎖。
  3. 若非最小,則監聽前一個節點。
  4. 業務完成后刪除節點,釋放鎖。

ZooKeeper 提供強一致性(CP),適用于對一致性要求高的場景,但性能低于 Redis。

在這里插入圖片描述


四、分布式事務解決方案

方案一致性性能復雜度適用場景
2PC強一致性傳統數據庫、金融系統
3PC強一致性中低需減少阻塞的場景
TCC最終一致性高并發業務(支付、庫存)
Saga最終一致性長事務、跨服務流程
消息隊列最終一致性事件驅動架構
本地消息表最終一致性異步通知(如訂單-積分)

Seata 框架

Seata 是阿里開源的分布式事務解決方案,支持以下模式:

  • AT 模式:基于數據庫快照和回滾日志,無需業務侵入。
  • TCC 模式:需實現 Try、Confirm、Cancel 接口。
  • Saga 模式:通過補償事務回滾長事務。

示例(AT 模式):

@GlobalTransactional
public void placeOrder(Order order) {orderDao.insert(order);inventoryService.deduct(order.getProductId(), order.getCount());
}

五、服務注冊與發現

1. 注冊中心核心功能

服務注冊與發現是微服務架構的核心組件,主要功能包括:

  • 服務注冊:服務實例啟動時向注冊中心注冊自身信息
  • 服務發現:消費者從注冊中心獲取可用服務實例列表
  • 健康檢查:定期檢測服務實例健康狀態,剔除異常實例
  • 負載均衡:提供多種負載均衡策略

2. 常見注冊中心對比

組件CAP模型一致性協議特點適用場景
EurekaAP簡單易用,自我保護機制高可用性要求場景
NacosAP/CP切換Raft功能豐富,支持配置管理云原生微服務
ZooKeeperCPZAB強一致性,可靠性高金融、對一致性要求高的系統
ConsulCPRaft多數據中心,服務網格集成復雜分布式系統

3. Nacos 注冊示例

// 服務提供者注冊
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}// 服務消費者發現
@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/call")public String callService() {return restTemplate.getForObject("http://service-provider/hello", String.class);}
}

六、API 網關

1. 網關核心功能

API 網關是微服務架構的入口,主要功能包括:

  • 路由轉發:將請求路由到相應的微服務
  • 認證鑒權:統一身份驗證和權限控制
  • 限流熔斷:保護后端服務免受過載影響
  • 日志監控:集中收集請求日志和監控指標
  • 協議轉換:支持不同協議間的轉換

2. Spring Cloud Gateway 配置示例

spring:cloud:gateway:routes:- id: user_routeuri: lb://user-servicepredicates:- Path=/api/users/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20- name: CircuitBreakerargs:name: userServiceCircuitBreakerfallbackUri: forward:/fallback/user

七、熔斷器

1. 熔斷器模式

熔斷器是防止分布式系統雪崩效應的重要組件,工作原理類似電路熔斷器:

  • 關閉狀態:正常請求通過,統計失敗率
  • 打開狀態:失敗率超過閾值,直接拒絕請求
  • 半開狀態:定期嘗試放行部分請求,檢測是否恢復

2. Resilience4j 熔斷器示例

// 配置熔斷器
CircuitBreakerConfig config = CircuitBreakerConfig.custom().failureRateThreshold(50) // 失敗率閾值50%.waitDurationInOpenState(Duration.ofMillis(1000)) // 熔斷持續時間1s.slidingWindowSize(10) // 滑動窗口大小.build();CircuitBreaker circuitBreaker = CircuitBreaker.of("userService", config);// 使用熔斷器保護服務調用
Supplier<String> decoratedSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> userService.getUser(userId));try {String result = decoratedSupplier.get();
} catch (CallNotPermittedException e) {// 處理熔斷器打開時的異常return "fallback response";
}

3. 熔斷器監控

熔斷器狀態可通過指標和事件進行監控:

// 事件監聽
circuitBreaker.getEventPublisher().onStateTransition(event -> {log.info("CircuitBreaker state changed from {} to {}",event.getStateTransition().getFromState(),event.getStateTransition().getToState());});// 指標收集
Metrics metrics = circuitBreaker.getMetrics();
float failureRate = metrics.getFailureRate();
int numberOfBufferedCalls = metrics.getNumberOfBufferedCalls();

八、ZooKeeper 的應用與原理

應用場景

  • 配置管理:集中存儲配置,動態更新。
  • 服務注冊與發現:微服務實例注冊,消費者動態發現。
  • 分布式鎖:通過臨時順序節點實現。

核心原理

  • 數據模型:類似文件系統的樹形結構(Znode)。
  • 節點類型
    • 持久節點(PERSISTENT)
    • 臨時節點(EPHEMERAL)
    • 順序節點(SEQUENTIAL)
  • ZAB 協議
    • 消息廣播:Leader 廣播提案,多數確認后提交。
    • 崩潰恢復:Leader 故障后選舉新 Leader,保證數據一致性。

在這里插入圖片描述


九、限流算法

1. 固定窗口算法

每單位時間窗口內計數,超限則拒絕。簡單但存在窗口臨界問題。

2. 滑動窗口算法

將窗口劃分為更小時間片,平滑流量,避免臨界問題。

3. 漏桶算法

以固定速率處理請求,超出容量則丟棄。適合平滑流量,但無法應對突發流量。

4. 令牌桶算法

以固定速率生成令牌,請求獲取令牌后執行。允許突發流量,推薦使用。

Java 實現示例(Guava RateLimiter):

RateLimiter limiter = RateLimiter.create(10.0); // 每秒10個令牌
if (limiter.tryAcquire()) {// 處理請求
} else {// 限流
}

在這里插入圖片描述


十、分布式一致性算法

Raft 協議

  • 角色:Leader、Follower、Candidate。
  • 流程
    1. Leader 選舉:超時未收到心跳則發起選舉。
    2. 日志復制:Leader 同步日志,多數確認后提交。
    3. 安全性:保證日志一致性。

應用:Etcd、Consul。

Paxos 協議

  • 角色:Proposer、Acceptor、Learner。
  • 階段
    1. Prepare:Proposer 發送提案編號。
    2. Accept:Acceptor 接受提案并廣播。
    3. Learn:Learner 學習已接受的提案。

Paxos 更通用但實現復雜,Raft 更易理解與實現。


十一、總結

分布式系統設計需在一致性、可用性、性能之間權衡。Spring Cloud Alibaba 提供了一整套完善的分布式系統解決方案:

  • 服務治理:Nacos(注冊中心+配置中心)
  • 流量控制:Sentinel(限流+熔斷+降級)
  • 分布式事務:Seata(AT/TCC/Saga模式)
  • 消息隊列:RocketMQ(順序消息+事務消息)
  • RPC框架:Dubbo(高性能服務調用)
  • API網關:Spring Cloud Gateway(路由+過濾)

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94483.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

接口自動化測試(一)

接口測試1.接口的概念程序內部的接口:程序內部接口指同一程序或系統內不同模塊、組件或類之間的交互點&#xff0c;用于數據傳遞、功能調用或資源共享系統對外的接口:是不同系統、模塊或服務之間進行交互的邊界定義&#xff0c;通常通過預定義的協議、數據格式和通信方式實現。…

單片機外設(七)RTC時間獲取

文章目錄一.RTC介紹二.IMX6ull RTC介紹1.SNVS_HP (high power domain)2.SNVS_LP (low power domain)3.SNVS interrupts and alarms三. SNVS重點寄存器介紹1.SNVS_HP Command(HPCOMR)2.SNVS_HP/SNVS_LP Control register (SNVS_HPCR/SNVS_LPCR)3.SNVS_HP/SNVS_LP 狀態寄存器&…

第1篇:走進日志框架的世界 - 從HelloWorld到企業級應用

前言 在現代企業級應用開發中&#xff0c;日志系統扮演著至關重要的角色。無論是問題排查、性能監控&#xff0c;還是業務分析&#xff0c;都離不開完善的日志記錄。今天&#xff0c;我們將從零開始&#xff0c;手把手教你構建一個現代化的注解驅動日志框架。 為什么需要自定義…

173-基于Flask的微博輿情數據分析系統

基于Flask的微博輿情數據分析系統 - 技術實現與架構設計 本文詳細介紹了一個基于Flask框架開發的微博輿情數據分析系統&#xff0c;包含數據爬取、情感分析、可視化展示等完整功能模塊。 &#x1f4cb; 目錄 項目概述技術棧系統架構目錄結構核心功能模塊代碼實現數據可視化部署…

美股期權歷史市場數據波動特性分析

標題&#xff1a;基于本地CSV數據的美股期權分析與應用實踐 在金融量化研究領域&#xff0c;本地CSV數據的高效應用是開展美股期權研究的重要基礎。本文將圍繞美股期權日級別行情數據、波動率分析及策略構建的核心流程&#xff0c;詳細介紹從數據預處理到實際場景落地的關鍵方…

VUE從入門到精通二:ref、reactive、computed計算屬性、watch監聽、組件之間的通信

目錄 一、ref、reactive創建響應式對象 1、ref() 2、reactive() 3、ref和reactive的區別 二、computed計算屬性 1、什么是計算屬性computed 2、計算屬性computed和函數方法的區別 3、計算屬性computed的優勢 三、watch監聽函數 1、什么是watch&#xff1f; 2、基本語…

構建AI智能體:十二、給詞語繪制地圖:Embedding如何構建機器的認知空間

我們理解“蘋果”這個詞&#xff0c;能聯想到一種水果、一個公司、或者牛頓的故事。但對計算機而言&#xff0c;“蘋果”最初只是一個冰冷的符號或一串二進制代碼。傳統的“One-Hot”編碼方式&#xff08;如“蘋果”是[1,0,0,...]&#xff0c;“香蕉”是是[0,1,0,...]&#xff…

突擊復習清單(高頻核心考點)

&#x1f512; 鎖的作用與使用&#xff08;synchronized vs ReentrantLock&#xff09; 面試官為什么問&#xff1a;考察你對并發編程基礎的掌握程度。 速記答案&#xff1a; 作用&#xff1a;保證線程安全&#xff0c;解決多線程環境下對共享資源訪問的數據不一致問題。 synch…

2025年視頻大模型匯總、各自優勢及視頻大模型競爭焦點

文章目錄一、國際主流視頻大模型1. OpenAI Sora Turbo2. Google Veo 33. Runway Gen-3 Alpha二、國內主流視頻大模型1. 快手可靈AI2. 愛詩科技PixVerse V33. 阿里巴巴通義萬相2.14. 生數科技Vidu Q15. 字節跳動即夢AI三、核心趨勢與競爭焦點一、國際主流視頻大模型 1. OpenAI …

Android - 用Scrcpy 將手機投屏到Windows電腦上

工作生活當中&#xff0c;常常需要操作手機&#xff0c;但是用手操作顯然不如用鍵盤快。 再一個&#xff0c;你看視頻的時候&#xff0c;想做一些筆記&#xff0c;那你也得截個圖啦之類的&#xff0c; 那如果直接在電腦上能看也是非常方便的&#xff0c;這都需要投屏手機到電…

AlmaLinux 上 Python 3.6 切換到 Python 3.11

在 AlmaLinux 上將默認的 Python 3.6 升級或切換到 Python 3.11 是一個常見的需求。請注意&#xff0c;直接替換系統自帶的 Python 3.6 是非常危險的&#xff0c;因為許多系統工具&#xff08;如 yum/dnf 包管理器&#xff09;都依賴于它&#xff0c;盲目刪除或修改可能會導致系…

基于RBF-GA的鋁/鎂異材FSLW工藝參數優化研究

課題&#xff1a;基于RBF-GA的鋁/鎂異材FSLW工藝參數優化研究 1. 引言 (Introduction) 研究背景與意義&#xff1a; 輕量化需求&#xff1a;鋁&#xff08;Al&#xff09;和鎂&#xff08;Mg&#xff09;合金是航空航天、新能源汽車等領域實現輕量化的關鍵材料。實現二者的可靠…

【Prometheus】Prometheus監控Docker實戰

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年8月23日 &#x1f47b;擅長領域&#xff1a;運維 目錄前言什么是Prometheus和cAdvisorPrometheuscAdvisor部署操作部署cAdvisor部署Prometheus指標說明cpu相關指標內存相關指標磁盤相關指標網絡…

2.7 提示詞調優編碼實戰(二)

目錄 四,提示詞模版優化 - 格式化 4.1 代碼示例 4.2 任務描述 4.3 模型輸出格式化 4.4 用戶輸入 4.5 輸出結果 四,提示詞模版優化 - 格式化 在簡單提示詞的基礎上,我們對提示詞模版中各部分進行格式化。包括任務描述增加了相應的字段。 同時對輸出增加了更多的定義和…

Kafka如何保證「消息不丟失」,「順序傳輸」,「不重復消費」,以及為什么會發生重平衡(reblanace)

前言 上一篇文章總結了kafka為什么快&#xff0c;下面來總結一下&#xff0c;kafka高頻的常見的問題。內容有點多&#xff0c;全部看完需要有一定的耐心。 kafka如何保證消息不丟失 Producer端 要保證消息不丟失&#xff0c;第一點要做的就是要保證消息從producer端發送到了…

原子操作匯編實現:原理、流程與代碼解析

&#x1f52c; 原子操作匯編實現&#xff1a;原理、流程與代碼解析 引用&#xff1a;VC/C Intel x86 內聯匯編實現 “Interlocked” 原子變量各種操作 &#x1f31f; 引言&#xff1a;原子操作的重要性 在多線程編程中&#xff0c;原子操作是確保數據一致性的關鍵機制。本文…

【WRF理論第十九期】內陸湖泊、水體的處理方式

目錄 WRF 模型中湖泊模擬概述 湖泊模型(Lake Model)集成 新增湖泊數據支持(如 WUDAPT + MODIS) LAKE_DEPTH Noah-MP + 湖泊模型聯合使用 namelist.input 配置說明 WRF 代碼更新 參考 論壇-WRF 湖泊模型(WRF-Lake model)與 SST 更新 WRF 模型中湖泊模擬概述 湖泊模型(La…

【滲透測試】SQLmap實戰:一鍵獲取MySQL數據庫權限

注&#xff1a;所有技術僅用于合法安全測試與防御研究&#xff0c;未經授權的攻擊行為屬違法犯罪&#xff0c;將承擔法律責任。一、SQLmap常規用法注意存放路徑&#xff1a;C:\Users\neo\AppData\Local\sqlmap\output1、列出詳細過程和數據庫列表sqlmap -u http://192.168.61.2…

LeetCode 第464場周賽 第三天

1. 3658 奇數和與偶數和的最大公約數&#xff08;歐幾里得&#xff09; 鏈接&#xff1a;題目鏈接 題解&#xff1a; 題解時間復雜度O(logmin(a, b))&#xff1a; 獲得前n個奇、偶數的總和&#xff0c;由于數列為等差數列&#xff0c;等差數列和公式&#xff1a;(a1 an) * n …