99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Spring多數(shù)據(jù)源路由實(shí)戰(zhàn):三層可控切換與分庫(kù)分表落地

Spring多數(shù)據(jù)源路由實(shí)戰(zhàn):三層可控切換與分庫(kù)分表落地 簡(jiǎn)介本資源是一份面向Java后端開(kāi)發(fā)者與數(shù)據(jù)庫(kù)架構(gòu)初學(xué)者的分庫(kù)分表實(shí)戰(zhàn)教學(xué)包聚焦企業(yè)級(jí)大數(shù)據(jù)量場(chǎng)景下的數(shù)據(jù)庫(kù)水平擴(kuò)展難題以Sharding-JDBC為核心框架實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換與透明化分片。資源共73個(gè)文件涵蓋18個(gè)Java業(yè)務(wù)與配置類、21個(gè)編譯后class文件、18個(gè)XML配置與映射文件含MyBatis映射及Sharding規(guī)則定義以及SQL建表腳本、Maven項(xiàng)目配置pom.xml、Eclipse工程元數(shù)據(jù).project/.classpath等關(guān)鍵開(kāi)發(fā)資產(chǎn)整體僅66KB輕量易導(dǎo)入。已有2068人學(xué)習(xí)下載適合快速搭建SSMDemo環(huán)境并理解分片路由、數(shù)據(jù)源初始化、YAML分片規(guī)則配置等核心實(shí)踐環(huán)節(jié)。讀者可直接復(fù)用項(xiàng)目結(jié)構(gòu)掌握從多數(shù)據(jù)源聲明、分庫(kù)分表策略配置到跨庫(kù)CRUD調(diào)用的完整鏈路尤其適用于SpringMyBatisSharding-JDBC技術(shù)棧的中小規(guī)模分片落地參考。1. 分庫(kù)分表多數(shù)據(jù)源的切換不是加個(gè)注解就完事而是讓每個(gè)DAO層調(diào)用都清楚自己該連哪張表、哪個(gè)庫(kù)你剛接手一個(gè)日增300萬(wàn)訂單的電商后臺(tái)MySQL單表已超2800萬(wàn)行慢查詢從“偶發(fā)”變成“每分鐘必報(bào)”DBA甩來(lái)一句“上分庫(kù)分表吧?!薄Y(jié)果你興沖沖引入ShardingSphere配置好邏輯表、分片鍵、分片算法一跑測(cè)試發(fā)現(xiàn)用戶中心查user_info正常但訂單服務(wù)里一個(gè)帶JOIN的報(bào)表SQL直接報(bào)錯(cuò)“無(wú)法路由到具體數(shù)據(jù)源”更玄學(xué)的是同一個(gè)Service方法里前半段insert走的是ds0后半段update卻連到了ds1事務(wù)根本沒(méi)法提交。這不是配置沒(méi)生效而是分庫(kù)分表的本質(zhì)從來(lái)不是“自動(dòng)拆分”而是“顯式聲明精準(zhǔn)控制”。這個(gè)項(xiàng)目就是一套可落地、可調(diào)試、可驗(yàn)證的多數(shù)據(jù)源切換實(shí)戰(zhàn)方案它不依賴黑匣子中間件的自動(dòng)路由而是用Spring原生AbstractRoutingDataSource 自定義ThreadLocal上下文 顯式數(shù)據(jù)源標(biāo)記把“哪個(gè)線程該用哪個(gè)庫(kù)”這件事從配置文件里拽出來(lái)寫進(jìn)代碼里、打在日志里、壓測(cè)時(shí)能一眼看穿。適合正在被跨庫(kù)JOIN、讀寫分離、歷史庫(kù)歸檔、灰度發(fā)布數(shù)據(jù)隔離等問(wèn)題卡住的后端開(kāi)發(fā)者尤其適合那些已經(jīng)踩過(guò)ShardingSphere規(guī)則配置陷阱、想回歸可控性的團(tuán)隊(duì)。2. 架構(gòu)設(shè)計(jì)與核心模塊拆解三層路由機(jī)制讓數(shù)據(jù)源選擇不再靠猜這個(gè)項(xiàng)目不是簡(jiǎn)單封裝了一個(gè)DynamicDataSource而是構(gòu)建了上下文驅(qū)動(dòng) 規(guī)則匹配 手動(dòng)覆蓋的三級(jí)路由體系。它把“用哪個(gè)庫(kù)”這件事拆成三個(gè)可獨(dú)立驗(yàn)證、可組合使用的環(huán)節(jié)最外層是業(yè)務(wù)語(yǔ)義標(biāo)記比如TargetDataSource(write)中間層是分片鍵自動(dòng)識(shí)別比如方法參數(shù)含userId且當(dāng)前策略為user_id分片最內(nèi)層是線程級(jí)強(qiáng)制綁定比如開(kāi)啟事務(wù)時(shí)鎖定主庫(kù)。三者優(yōu)先級(jí)從高到低沖突時(shí)以手動(dòng)標(biāo)記為準(zhǔn)。這種設(shè)計(jì)避免了“全局默認(rèn)庫(kù)”帶來(lái)的隱式耦合也繞開(kāi)了中間件對(duì)SQL語(yǔ)法的強(qiáng)約束——你寫原生MyBatis XML它照樣能路由你用JdbcTemplate手寫復(fù)雜UNION它也能按需切庫(kù)。整個(gè)結(jié)構(gòu)輕量無(wú)額外jar依賴、透明所有路由決策可打日志、可測(cè)試Mock ThreadLocal即可覆蓋全部分支。2.1 核心路由引擎AbstractRoutingDataSource的深度定制Spring原生的AbstractRoutingDataSource只提供一個(gè)determineCurrentLookupKey()抽象方法返回String類型的key。但本項(xiàng)目在此基礎(chǔ)上做了三處關(guān)鍵增強(qiáng)key不再是簡(jiǎn)單字符串而是自定義的DataSourceKey類包含type(READ/WRITE)、shardId(如shard_01)、sourceId(如ds_master_v2)三個(gè)維度determineCurrentLookupKey()內(nèi)部不直接返回key而是委托給RouterChain執(zhí)行鏈?zhǔn)脚袛嗝看蝛ey生成后自動(dòng)記錄到MDC中供日志追蹤如[ds_keyWRITE:shard_01:ds_master_v2]。public class DynamicRoutingDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { // 1. 檢查線程局部變量是否已強(qiáng)制綁定 DataSourceKey forcedKey DataSourceContextHolder.getForcedKey(); if (forcedKey ! null) { log.debug(Route forced: {}, forcedKey); return forcedKey; } // 2. 嘗試從方法參數(shù)/注解提取分片上下文 DataSourceKey contextKey ContextRouter.routeByContext(); if (contextKey ! null) { log.debug(Route by context: {}, contextKey); return contextKey; } // 3. 回退到默認(rèn)策略如讀寫分離下的READ DataSourceKey defaultKey DefaultRouter.routeByDefault(); log.debug(Route by default: {}, defaultKey); return defaultKey; } }提示DataSourceKey必須實(shí)現(xiàn)equals()和hashCode()否則Spring緩存的targetDataSource Map會(huì)失效——這是血淚經(jīng)驗(yàn)曾因忘記重寫導(dǎo)致同一key反復(fù)創(chuàng)建新連接池DB連接數(shù)暴增。2.2 上下文管理器ThreadLocal MDC雙保險(xiǎn)DataSourceContextHolder是整個(gè)路由的“開(kāi)關(guān)中樞”。它不只存一個(gè)String而是維護(hù)三個(gè)ThreadLocal變量forcedKey: 用于Transactional或TargetDataSource注解觸發(fā)的強(qiáng)制綁定shardContext: 存儲(chǔ)當(dāng)前請(qǐng)求的分片標(biāo)識(shí)如userId12345 → shardIdshard_03routeTrace: 布爾值開(kāi)啟后自動(dòng)記錄每次路由決策路徑用于排查“為什么沒(méi)走預(yù)期庫(kù)”。public class DataSourceContextHolder { private static final ThreadLocalDataSourceKey FORCED_KEY_HOLDER new NamedThreadLocal(forcedDataSourceKey); private static final ThreadLocalShardContext SHARD_CONTEXT_HOLDER new NamedThreadLocal(shardContext); private static final ThreadLocalBoolean ROUTE_TRACE_HOLDER ThreadLocal.withInitial(() - false); public static void setForcedKey(DataSourceKey key) { FORCED_KEY_HOLDER.set(key); // 同步寫入MDC確保日志可追溯 MDC.put(ds_key, key.toString()); } public static void setShardContext(ShardContext context) { SHARD_CONTEXT_HOLDER.set(context); MDC.put(shard_id, context.getShardId()); MDC.put(shard_key, context.getShardKey()); } public static void enableRouteTrace() { ROUTE_TRACE_HOLDER.set(true); MDC.put(route_trace, enabled); } }NamedThreadLocal是自定義類繼承ThreadLocal并重寫toString()方便在Arthas或jstack線程dump中快速識(shí)別該ThreadLocal用途——這點(diǎn)在生產(chǎn)環(huán)境排查“某個(gè)線程死鎖在數(shù)據(jù)庫(kù)連接上”時(shí)極其關(guān)鍵。2.3 分片上下文注入從Controller到Mapper的全鏈路透?jìng)鞣制I如userId、orderId通常來(lái)自HTTP請(qǐng)求參數(shù)或RPC上下文不能靠DAO層自己猜。本項(xiàng)目采用“入口攔截顯式傳遞”模式Web層ShardParam(userId)注解標(biāo)注Controller方法參數(shù)由ShardArgumentResolver解析并注入ShardContextRPC層Dubbo Filter或gRPC Interceptor從Attachment或Metadata中提取分片信息內(nèi)部調(diào)用Service方法簽名強(qiáng)制要求傳入ShardContext杜絕“隱式上下文”。RestController public class OrderController { GetMapping(/order/{orderId}) public OrderVO getOrder( PathVariable Long orderId, ShardParam(userId) Long userId) { // ← 此注解觸發(fā)ShardContext注入 return orderService.getOrder(orderId, userId); } } Service public class OrderServiceImpl implements OrderService { Override public OrderVO getOrder(Long orderId, Long userId) { // 1. 主動(dòng)構(gòu)造ShardContext確保下游能路由 ShardContext context ShardContext.builder() .shardKey(userId) .shardValue(userId) .shardId(ShardAlgorithm.calculateShardId(userId)) // 如 userId % 4 → shard_02 .build(); DataSourceContextHolder.setShardContext(context); // 2. 執(zhí)行實(shí)際查詢此時(shí)DynamicRoutingDataSource已能獲取shardId return orderMapper.selectById(orderId); } }注意ShardAlgorithm.calculateShardId()必須是純函數(shù)無(wú)狀態(tài)、無(wú)外部依賴否則在多線程下可能產(chǎn)生不一致分片結(jié)果——這是分庫(kù)分表最隱蔽的翻車點(diǎn)之一。3. 數(shù)據(jù)源配置與初始化YAML驅(qū)動(dòng) 運(yùn)行時(shí)熱加載支持項(xiàng)目摒棄了XML硬編碼數(shù)據(jù)源的方式采用Spring Boot原生ConfigurationProperties綁定YAML配置同時(shí)預(yù)留了運(yùn)行時(shí)刷新接口如POST /actuator/datasource/refresh無(wú)需重啟即可更新數(shù)據(jù)源連接池參數(shù)。配置結(jié)構(gòu)清晰分層頂層定義邏輯組如master-slave-group中層定義物理實(shí)例如ds_master_v2底層定義JDBC屬性。這種結(jié)構(gòu)天然支持灰度發(fā)布場(chǎng)景——你可以先將新庫(kù)ds_master_v3加入配置但不啟用待壓測(cè)通過(guò)后再修改group.default-write-source: ds_master_v3。3.1 application.yml核心配置片段# 多數(shù)據(jù)源基礎(chǔ)配置 spring: datasource: dynamic: primary: master # 默認(rèn)寫庫(kù) strict: false # 非嚴(yán)格模式未匹配到數(shù)據(jù)源時(shí)回退到primary datasource: # 主庫(kù)寫 master: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-master:3306/order_db_v2?useSSLfalseserverTimezoneAsia/Shanghai username: app_rw password: ${DB_MASTER_PWD} hikari: maximum-pool-size: 20 minimum-idle: 5 # 從庫(kù)集群讀 slave-01: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-slave-01:3306/order_db_v2?useSSLfalseserverTimezoneAsia/Shanghai username: app_ro password: ${DB_SLAVE_PWD} hikari: maximum-pool-size: 15 slave-02: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-slave-02:3306/order_db_v2?useSSLfalseserverTimezoneAsia/Shanghai username: app_ro password: ${DB_SLAVE_PWD} hikari: maximum-pool-size: 15 # 分片庫(kù)歷史訂單 shard-01: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-shard-01:3306/order_history_shard_01?useSSLfalseserverTimezoneAsia/Shanghai username: app_hist password: ${DB_HIST_PWD} shard-02: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://db-shard-02:3306/order_history_shard_02?useSSLfalseserverTimezoneAsia/Shanghai username: app_hist password: ${DB_HIST_PWD}3.2 動(dòng)態(tài)數(shù)據(jù)源工廠支持運(yùn)行時(shí)新增/刪除數(shù)據(jù)源DynamicDataSourceFactory負(fù)責(zé)將YAML配置轉(zhuǎn)化為MapObject, DataSource并注冊(cè)到DynamicRoutingDataSource中。關(guān)鍵點(diǎn)在于使用ConcurrentHashMap存儲(chǔ)targetDataSources保證put/remove線程安全每次refresh時(shí)先關(guān)閉舊數(shù)據(jù)源調(diào)用HikariDataSource.close()再注入新實(shí)例提供getDataSource(String key)方法供其他組件如Druid監(jiān)控按需獲取特定數(shù)據(jù)源。Component public class DynamicDataSourceFactory { private final MapObject, DataSource targetDataSources new ConcurrentHashMap(); PostConstruct public void init() { loadFromConfig(); // 從YAML加載初始數(shù)據(jù)源 } public void refresh(MapString, DataSourceProperties newConfigs) { // 1. 關(guān)閉所有舊數(shù)據(jù)源 targetDataSources.values().forEach(this::closeDataSource); targetDataSources.clear(); // 2. 創(chuàng)建新數(shù)據(jù)源并注入 newConfigs.forEach((key, props) - { HikariDataSource ds createHikariDataSource(props); targetDataSources.put(key, ds); }); // 3. 通知DynamicRoutingDataSource更新 dynamicRoutingDataSource.afterPropertiesSet(); } private void closeDataSource(DataSource ds) { if (ds instanceof HikariDataSource) { ((HikariDataSource) ds).close(); } } }注意dynamicRoutingDataSource.afterPropertiesSet()必須顯式調(diào)用否則Spring不會(huì)重新初始化resolvedDataSources緩存——這是熱加載失敗最常見(jiàn)的原因。3.3 分片策略配置YAML定義規(guī)則Java實(shí)現(xiàn)算法分片邏輯不寫死在代碼里而是通過(guò)YAML聲明規(guī)則再由Java類按需加載。例如shard: rules: - table: order_info key: user_id algorithm: mod4 sources: [shard-01, shard-02, shard-03, shard-04] - table: order_detail key: order_id algorithm: hash16 sources: [shard-01, shard-02, shard-03, shard-04]對(duì)應(yīng)Java端ShardRuleLoader解析YAML后生成ShardRule對(duì)象存入內(nèi)存并由ShardAlgorithmFactory根據(jù)algorithm字段返回具體實(shí)現(xiàn)public interface ShardAlgorithm { String calculateShardId(Object shardValue); } Component public class Mod4ShardAlgorithm implements ShardAlgorithm { Override public String calculateShardId(Object shardValue) { if (!(shardValue instanceof Number)) { throw new IllegalArgumentException(Mod4 requires numeric shard value); } long value ((Number) shardValue).longValue(); int shardIndex (int) (Math.abs(value) % 4); // 避免負(fù)數(shù)取模問(wèn)題 return shard- String.format(%02d, shardIndex 1); // shard-01 ~ shard-04 } }這種解耦讓DBA可獨(dú)立修改分片規(guī)則改YAML而開(kāi)發(fā)只需維護(hù)算法實(shí)現(xiàn)雙方無(wú)需協(xié)同發(fā)布。4. 避坑指南5個(gè)真實(shí)踩過(guò)的坑省下你三天排查時(shí)間分庫(kù)分表不是配置完就能跑通的銀彈而是處處埋雷的精細(xì)活。以下是我在某高校實(shí)驗(yàn)室模擬項(xiàng)目X中連續(xù)兩周壓測(cè)時(shí)踩出的5個(gè)典型問(wèn)題每一條都附帶復(fù)現(xiàn)條件、根因分析和可立即驗(yàn)證的修復(fù)方案。4.1 現(xiàn)象事務(wù)內(nèi)跨庫(kù)操作不報(bào)錯(cuò)但部分SQL實(shí)際執(zhí)行在錯(cuò)誤庫(kù)上原因Transactional默認(rèn)傳播行為是REQUIRED當(dāng)方法A調(diào)用方法B時(shí)若B未聲明事務(wù)其數(shù)據(jù)源路由會(huì)脫離A的事務(wù)上下文導(dǎo)致B的SQL走默認(rèn)庫(kù)而非事務(wù)綁定庫(kù)。解決在Transactional方法內(nèi)所有子調(diào)用必須顯式聲明Transactional(propagation Propagation.REQUIRED)或統(tǒng)一使用TransactionTemplate手動(dòng)控制。更徹底的方案是在DataSourceInterceptor中檢測(cè)當(dāng)前是否在事務(wù)中若在則強(qiáng)制將forcedKey設(shè)為事務(wù)起始時(shí)的key。4.2 現(xiàn)象MyBatis二級(jí)緩存命中但返回的數(shù)據(jù)卻是舊庫(kù)里的臟數(shù)據(jù)原因MyBatis的CachingExecutor在查詢前會(huì)先查緩存而緩存key未包含數(shù)據(jù)源標(biāo)識(shí)如ds_key導(dǎo)致從shard-01查到的數(shù)據(jù)被緩存后續(xù)請(qǐng)求即使路由到shard-02也會(huì)命中該緩存。解決自定義CacheKey在org.apache.ibatis.cache.CacheKey.update()中加入DataSourceContextHolder.getForcedKey()的哈希值?;蛘摺扑]的做法——禁用跨庫(kù)場(chǎng)景的二級(jí)緩存在Mapper XML中添加cache evictionFIFO flushInterval60000 size1000 readOnlytrue blockingfalse/并設(shè)置useCachefalse。4.3 現(xiàn)象Druid監(jiān)控頁(yè)面顯示連接池活躍數(shù)為0但應(yīng)用日志瘋狂打印“getConnection timeout”原因DynamicRoutingDataSource的determineCurrentLookupKey()方法拋出異常如NullPointerException導(dǎo)致Spring fallback到defaultTargetDataSource而該項(xiàng)目未配置defaultTargetDataSource最終返回nullDruid拿到null后靜默失敗。解決在DynamicRoutingDataSource構(gòu)造時(shí)強(qiáng)制設(shè)置setDefaultTargetDataSource(defaultDs)并在determineCurrentLookupKey()最外層加try-catch捕獲所有異常并返回默認(rèn)key同時(shí)記錄ERROR日志“Failed to determine data source key, fallback to default”。4.4 現(xiàn)象單元測(cè)試中Test方法能正確路由但集成測(cè)試SpringBootTest總是走默認(rèn)庫(kù)原因Spring Boot Test默認(rèn)使用Mockito代理而DataSourceContextHolder的ThreadLocal在線程切換如Async、CompletableFuture時(shí)未做透?jìng)鲗?dǎo)致異步線程丟失上下文。解決在測(cè)試配置中注入TaskExecutorBean并重寫execute()方法在提交任務(wù)前拷貝ThreadLocalBean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setBeanName(testTaskExecutor); executor.setTaskDecorator(runnable - () - { // 拷貝主線程的DataSource上下文 DataSourceKey key DataSourceContextHolder.getForcedKey(); if (key ! null) { DataSourceContextHolder.setForcedKey(key); } try { runnable.run(); } finally { DataSourceContextHolder.reset(); } }); return executor; }4.5 現(xiàn)象分庫(kù)后SELECT COUNT(*) FROM order_info返回結(jié)果比單庫(kù)少一半原因該SQL未帶WHERE條件ShardAlgorithm無(wú)法提取分片鍵路由引擎按默認(rèn)策略如READ隨機(jī)選一個(gè)庫(kù)執(zhí)行而非廣播到所有分片庫(kù)。解決對(duì)這類全量聚合SQL必須顯式使用TargetDataSource(broadcast)注解并在BroadcastRouter中實(shí)現(xiàn)遍歷所有匹配分片庫(kù)分別執(zhí)行SQL再合并結(jié)果集。注意COUNT(*)需用SUM()聚合GROUP BY需用UNION ALL去重。5. 運(yùn)行與驗(yàn)證從啟動(dòng)到壓測(cè)五步確認(rèn)路由完全受控光跑通不算成功必須驗(yàn)證每條SQL都落在預(yù)期庫(kù)上。本項(xiàng)目提供了一套開(kāi)箱即用的驗(yàn)證流水線不依賴外部工具全部基于Spring Boot Actuator和自研Endpoint實(shí)現(xiàn)。5.1 啟動(dòng)檢查確認(rèn)數(shù)據(jù)源已正確加載啟動(dòng)應(yīng)用后訪問(wèn)GET /actuator/datasource/info返回應(yīng)包含所有配置的數(shù)據(jù)源及其狀態(tài){ status: UP, details: { master: {status:UP,active:0,idle:5}, slave-01: {status:UP,active:0,idle:3}, shard-01: {status:UP,active:0,idle:2}, shard-02: {status:UP,active:0,idle:2} } }若某個(gè)數(shù)據(jù)源狀態(tài)為DOWN檢查日志中是否有HikariPool-1 - Failed to validate connection常見(jiàn)原因是密碼錯(cuò)誤或網(wǎng)絡(luò)不通。5.2 路由追蹤開(kāi)啟MDC日志實(shí)時(shí)觀察key生成過(guò)程在logback-spring.xml中配置pattern確保輸出%X{ds_key}和%X{shard_id}appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder pattern%d{HH:mm:ss.SSS} [%thread] %-5level [%X{ds_key}|%X{shard_id}] %logger{36} - %msg%n/pattern /encoder /appender發(fā)起一次請(qǐng)求日志應(yīng)類似14:22:05.123 [http-nio-8080-exec-1] DEBUG [WRITE:shard_03:ds_master_v2|shard_03] c.e.o.s.OrderServiceImpl - getOrder called with orderId1001, userId12345 14:22:05.125 [http-nio-8080-exec-1] DEBUG [WRITE:shard_03:ds_master_v2|shard_03] c.e.o.m.OrderMapper.selectById - Preparing: SELECT * FROM order_info WHERE id ?若ds_key為空或與預(yù)期不符說(shuō)明DataSourceContextHolder.setForcedKey()未被調(diào)用。5.3 SQL攔截驗(yàn)證確認(rèn)MyBatis執(zhí)行的確實(shí)是目標(biāo)庫(kù)啟用MyBatis日志logging.level.org.apache.ibatisDEBUG觀察JDBC Connection日志Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession7a8b9c0d] was not registered for synchronization because synchronization is not active JDBC Connection [HikariProxyConnection123456789 wrapping com.mysql.cj.jdbc.ConnectionImpl987654321] will not be managed by Spring Preparing: SELECT * FROM order_info WHERE id ?關(guān)鍵看wrapping com.mysql.cj.jdbc.ConnectionImplxxxxx后的hashcode對(duì)比/actuator/datasource/pools返回的各數(shù)據(jù)源連接池中活躍連接的hashcode——必須一致才證明路由正確。5.4 壓測(cè)驗(yàn)證用JMeter模擬混合流量觀測(cè)分片傾斜度編寫JMeter腳本按比例發(fā)送請(qǐng)求70%請(qǐng)求userId在1~100000區(qū)間應(yīng)均勻分布到4個(gè)shard20%請(qǐng)求userId固定為12345應(yīng)100%落到shard_0310%請(qǐng)求無(wú)userId參數(shù)應(yīng)走默認(rèn)master庫(kù)。壓測(cè)10分鐘后執(zhí)行-- 查看各分片庫(kù)的order_info表行數(shù) SELECT COUNT(*) FROM order_info; -- 在shard-01庫(kù)執(zhí)行 SELECT COUNT(*) FROM order_info; -- 在shard-02庫(kù)執(zhí)行 ...理想結(jié)果shard-01 ~ shard-04行數(shù)比值接近70%:70%:70%:70%而非出現(xiàn)shard-01: 10w, shard-02: 500的嚴(yán)重傾斜。5.5 故障注入測(cè)試模擬單庫(kù)宕機(jī)驗(yàn)證降級(jí)能力手動(dòng)停掉shard-02數(shù)據(jù)庫(kù)容器然后發(fā)送原本應(yīng)路由到shard-02的請(qǐng)求如userId20001。預(yù)期行為若配置spring.datasource.dynamic.strictfalse應(yīng)自動(dòng)fallback到primary庫(kù)master并記錄WARN日志“Shard shard-02 unavailable, fallback to primary”若配置stricttrue應(yīng)拋出DataSourceUnavailableException由上層業(yè)務(wù)捕獲并返回友好提示。此測(cè)試驗(yàn)證了系統(tǒng)在部分分片不可用時(shí)的容錯(cuò)能力而非直接雪崩。6. 二次開(kāi)發(fā)與擴(kuò)展如何安全地接入新業(yè)務(wù)、新分片規(guī)則、新數(shù)據(jù)源類型這個(gè)項(xiàng)目的設(shè)計(jì)初衷就是“可演進(jìn)”而不是一次性交付。我把它用在模擬項(xiàng)目X的三個(gè)迭代周期中每次新增需求都只改3個(gè)類以內(nèi)從未動(dòng)過(guò)核心路由引擎。以下是我沉淀下來(lái)的四條改造鐵律以及對(duì)應(yīng)的具體操作模板。6.1 接入新業(yè)務(wù)表三步完成分片配置假設(shè)要為新表user_behavior_log添加分庫(kù)分表分片鍵為user_id按mod8分到8個(gè)歷史庫(kù)Step 1擴(kuò)展YAML配置在application-prod.yml中追加shard: rules: - table: user_behavior_log key: user_id algorithm: mod8 sources: [shard-log-01, shard-log-02, ..., shard-log-08] spring: datasource: dynamic: datasource: shard-log-01: url: jdbc:mysql://db-log-01:3306/log_db_01?... # ... 共8個(gè)數(shù)據(jù)源定義Step 2實(shí)現(xiàn)新分片算法Component public class Mod8ShardAlgorithm implements ShardAlgorithm { Override public String calculateShardId(Object shardValue) { long value Math.abs(((Number) shardValue).longValue()); int index (int) (value % 8); return shard-log- String.format(%02d, index 1); } }Step 3在Mapper接口上聲明分片意圖Mapper public interface UserBehaviorLogMapper { Insert(INSERT INTO user_behavior_log (...) VALUES (...)) TargetDataSource(shard-log) // ← 告訴路由引擎此Mapper只走shard-log系列庫(kù) void insert(UserBehaviorLog record); }注意TargetDataSource(shard-log)中的值必須與YAML中sources列表的前綴一致路由引擎會(huì)自動(dòng)匹配shard-log-01等具體實(shí)例。6.2 支持新數(shù)據(jù)源類型無(wú)縫接入PostgreSQL分片庫(kù)項(xiàng)目當(dāng)前只支持MySQL但某模塊需對(duì)接PostgreSQL歷史庫(kù)。無(wú)需修改DynamicRoutingDataSource只需新增PostgreSqlDataSourceFactory繼承AbstractDataSourceFactory重寫createDataSource()方法在DynamicDataSourceFactory.refresh()中根據(jù)driver-class-name自動(dòng)選擇工廠類PostgreSQL分片算法與MySQL完全復(fù)用Mod8ShardAlgorithm不依賴數(shù)據(jù)庫(kù)特性。public class PostgreSqlDataSourceFactory extends AbstractDataSourceFactory { Override protected DataSource createDataSource(DataSourceProperties props) { HikariConfig config new HikariConfig(); config.setJdbcUrl(props.getUrl()); config.setUsername(props.getUsername()); config.setPassword(props.getPassword()); config.setDriverClassName(org.postgresql.Driver); // PostgreSQL特有參數(shù) config.addDataSourceProperty(reWriteBatchedInserts, true); return new HikariDataSource(config); } }6.3 審計(jì)增強(qiáng)記錄每次路由決策的完整證據(jù)鏈生產(chǎn)環(huán)境需要審計(jì)“某次訂單查詢?yōu)楹巫吡藄hard-03”項(xiàng)目預(yù)留了RouteTrace擴(kuò)展點(diǎn)。啟用方式// 在Controller中 GetMapping(/order/{id}) public OrderVO getOrder(PathVariable Long id) { DataSourceContextHolder.enableRouteTrace(); // ← 開(kāi)啟追蹤 return orderService.getOrder(id); }啟用后日志自動(dòng)追加route_path字段[ds_keyREAD:shard_03:slave-01|shard_idshard_03|route_pathANNOTATION→CONTEXT→DEFAULT]其中ANNOTATION→CONTEXT→DEFAULT表示先檢查了TargetDataSource注解未找到再嘗試從參數(shù)提取shardContext成功最后未觸發(fā)默認(rèn)策略。6.4 灰度發(fā)布支持按用戶ID范圍動(dòng)態(tài)切流上線新分片庫(kù)shard-05時(shí)希望先讓userId在1000000~1000010之間的用戶走新庫(kù)其余走老庫(kù)。只需擴(kuò)展ShardAlgorithmComponent public class GrayShardAlgorithm implements ShardAlgorithm { Override public String calculateShardId(Object shardValue) { long userId ((Number) shardValue).longValue(); if (userId 1_000_000 userId 1_000_010) { return shard-05; // 灰度庫(kù) } // 兜底走原有mod4算法 return new Mod4ShardAlgorithm().calculateShardId(shardValue); } }然后在YAML中將user_id表的algorithm改為gray即可?;叶冉Y(jié)束后刪掉這段if邏輯全程無(wú)需改SQL、不發(fā)版。從那以后我每次接入新業(yè)務(wù)表都強(qiáng)制走一遍這四步模板配YAML → 寫算法 → 打注解 → 壓測(cè)驗(yàn)證。哪怕凌晨三點(diǎn)上線只要日志里看到[ds_keyWRITE:shard_05:ds_master_v3]心里就踏實(shí)。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人人干Av| 亚洲无线视频| 99色日本| 色五月婷婷777| 久久性爱视频| 亭亭五月色男人| 操99| 91九色无码内射| 九九在线视频| 婷婷综合五月| A片一曲| 美女要搞搞天天搞搞搞网站| 欧美在线视频99| 丁香婷婷老司机久操| 97久久超碰| 丁香六月激情网C0W| 丁香五月首页| 欧美色色色色色色| 久久爱综合| 国产亚洲99久久精品| 综合成人小说婷婷| 激情5月婷婷| 成人做爰A片免费看网站找不到了| www.成人婷婷综合| 99热这里只有精品50| 91一起艹| 婷婷午夜| 久er免费视频| 丁香色五月直播| 中文字幕+中文在线| 亚洲无码99| 91精品久久久久久| 狠狠综合网| 亚洲天码视频www蛋播视频| 99色激| 玖玖色资源| 91九色白丝| 狠狠色婷婷7777久| 国产AV一区二区三区最新精品| 婷婷九月| 五月天婷婷久久| 成人综合AV| 六月份天丁香婷婷| 97丁香婷婷| 五月色婷婷影院| 99啪啪骑| 激情伊人| 97激情五月天| 六月久久狠狠| 丁香五月婷婷香| 免费视频这里只有精品| 精品人妻伦一二三区久久| 综合激情网激情五月。| 99综合网| 日本婷婷| 好叼操在线观看| 激情综合色五月丁香| 中文字幕在线免费看线人| 婷婷激情五月| 97超级碰| 婷婷五月香蕉| 丁香六月中文| 久久少妇视频| 婷婷在线视频| 久久丁香综合香蕉| 天天肏高清在线| 丁香五月婷婷综合精品素人| 丁香亭亭久久| 久草视频大香蕉99| 国产99久久久| 蜜乳A√| 婷婷五月色影视先锋| 狠狠色丁婷婷日日,伊人激情综合网| 婷婷丁香五月天在线视频| 夜夜骑日日夜夜| 五月婷婷综合色拍| 久久天堂| 色色色色色色综合网| 欧美精品狠狠色丁香婷婷| 五月深情久久| 99热6这里只有精品6| 激情综合五月.....| 米奇激情婷婷| 永久免费一区二区三区| 97丨九色丨国产丨PORNY| 99re视频在线精品| 丁香五月天偷拍| 久久五月丁香六月婷| 九九热精品6| 97热这里只有精品| 亚洲字幕AV一区二区三区四区| 极品嫩草| 成人欧美一区二区三区在线观看 | 亚洲熟女色| 婷婷丁香成人| 手机旧版看人妻1025| 五月婷婷大香蕉| 影音先锋 婷婷| 思思热AV| 性欧美大战久久久久久久83| 操一区| 六月丁香婷婷在线波多 | 91操人视频| 天天干夜夜b| 丁香五月偷拍| 91人人看| 日本成人小说婷婷六月| 超碰91在线| 99热传媒| peg 2区三区四区的| 99热这里只有精品搜| 色婷婷影视| 9999热在线| 九九99在线免费在线观看视频| 日本不卡五月婷婷丁香| 成人无码精品1区2区3区免费看| 女人被男人吃奶到高潮| 综合色、色综合| 1024手机在线观看看片_日韩精品| 五月丁香婷婷AV天堂| 久久久无码精品成人A片小说| 丁香五月成人| 青青草原中文字幕| 97色婷| 操逼视频网址| 成人丁香婷婷五月天| 91性高潮久久久久久久久| 91久久国产自产拍夜夜91久久精品文字>91麻豆精品国产 | 五月婷婷与六月丁香图片激情| 丰满少妇猛烈A片免费看观看| 综合色99| 久久亚洲激情五码| 亚洲第一成人无码A片| 伊人婷婷五月| 日日操夜夜擼| 久热这里只有精品66| 婷婷丁香五月亚洲| 婷婷激情肏屄网| 大香蕉久热| 日日操,夜夜爽| 99久久99九九99九九九| 色欲婷婷夜夜| 免费看欧美成人A片无码| 天天色综合天天| 这里只有视频精品| 99热这里只有精品3| 美国天天操无码| 草做免费在线观看| www.色色com| 亚洲最大五月六月丁香婷婷| 亚洲99一级无嗎特制在线| 久久婷婷五月草视频在线播放| 五月丁香影视| sewuyuejiqingwang| 激情五月天视频| 先锋五月婷婷丁香草草| 国产精品人成A片一区二区| 色丁香五月天射婷婷爱婷婷| 99∨VTV| 丁香五月天天哦| 五月丁香色色网| 99啪啪视频| 丁香五月天黄色片| 狠狠干五码| 婷婷中文字幕网站| 天天综合精品| 日日干五月天婷婷| 丰满少妇猛烈A片免费看观看| 婷婷五月深深的爱| 丁香五月婷婷高清| 日韩成人av在线| 成人短视频在线观看| 色吧五月| 99伊人婷婷在线| 激情五月丁香六月婷婷| 久久免费丁香| 色狠狠综合| 99久热这里有精品| 在线综合91| 五月丁香六月婷婷色情| 国产色丁香| 久久久亚洲精品一区二区三区浴池| 天天拍夜夜爽| 玖玖在线视| 久久婷色| 激情VA视频| 久操干| 婷婷五月天电影网| 婷婷五月情天| 激情五月天色婷婷| 亚洲综合在线视频| 成人必爱视| 99爱在线视频| 婷婷六月爽| 无码人妻精品一区二区蜜桃色欲| 亚洲激情网站| 欧洲亚洲免费视频9 | 狠狠狠狠狠狠| 亚洲AV免费国产电影| 久久狠狠干| 国产免费一区二区三区三州老师F1F1.CC | 无码婷婷五月天| 黄色av网站在线免费播放| 五月天另类图片| 成人一区在线观看| 91日本在线观看| 97深爱伊人综合| 久久久宗合视频88| 久久最新色| 婷婷五月天色色| 婷婷五月天AV| 丁香五月六月婷婷怡红院| 亚洲爱婷婷| 日韩AV大全| 九九热视频免费观看| 丁香五月手机视频| 亚洲精品色| 久久在线人妻| 丁香 婷婷 激情 综合 五月| 另类国产欧美视频| 91久久婷婷| av五月天婷婷丁香| 狠狠看狠狠| 一本色道久久88加勒比| 99日本黄站| 91啪级电影| 久久精品日| 国产亚洲色婷婷久久99精品91| 国产Va视频| 天啪色| 色99色| 亚洲丁香五月在线观看| 激情深爱综合| 丁香五月天.com| 欧美内射AAAAAAXXXXX| 色播五月婷婷| 久久99热精品a片在线观看| 国产精品操| 国产无套精品一区二区| 婷婷五月天久久| 五月丁香婷婷激情澎湃四射| 99re这里只有精品国产99| 色约约视频一区二区三区四区五区| 激情综合久久| 久9热视频| 26uuu亚洲欧美另类| 91|九色|动漫| 色婷婷第四色| 久热A片| 色情综合网| 丁香色综合| 成人五月天综合网| 色五月激情| 丁香婷婷激情四射五月| av操逼网| 丁香五月花| 九九色99| 激情五月综合网最新| 99热无码首页| 婷婷五月天另类网站| 在线观看熟女少妇| 亚洲色综合| 欧美激情 日韩无码 婷婷 五月天| 亚洲成人综合在线| 色婷婷久久| 婷婷五月大香蕉| 天天射综合网夜夜操| 久久五月天激情美女| 五月天另类图片区99| 丁香性爱在线视频| 久久久国产精品黄毛片| 蜜臀AV在线观看| 97福利视频| 色婷婷9| 婷婷丁香五月网| 九九视频这里有精品| 五月噜噜| 五月天深爱激情网| 啪到高潮激情丁香五月| 这里只有精品视频99| 操逼福利视频| 思思热在线精品视频网站| 五月天开心激情网色欲无码| 婷婷五月成人有| 大香蕉啪啪啪| 久久九九怡红院| 香蕉婷婷| 激情涩涩网| 99热色无码| 亲子乱AV一区二区三区下载| 久久色情| 九九视频精品这里只有| 狠狠狠狠狠狠狠狠草| 久久99热这里| 狠狠撸激情综合丁香五月天俺来啦| 天天干天天操天天干天天操天天干天天操| 中文aV网| 常久最新免费的色吊丝| 五月丁香五月婷婷| 97久久精品| 14色综合婷婷| 日韩啊啊啊| 久久婷婷影院| 操老逼综合网| 久久嘟嘟丁香| 九九久久精品| 婷婷五月激情基地| 五月丁香基地| 91凹凸在线| 91精品久久久久久久| 色999五月色| 精品久热| 五月婷婷综合在线亚洲视频| 99久操| 婷婷五月激情欧美| 这里只有精品日韩精品| 夜夜爽天操| 狠狠做深爱婷婷久久综合一区| 婷婷成人视频| 99视频内射三四| 精品少妇人妻AV无码专区偷人 | 六月丁香深深爱| 另类婷婷丁香| 丁香婷婷影院| 五月天com| 97精品人人A片免费看| 综合福利网| 91九色PORNY中文啦| 插逼综合网| 99热色无码| 操丝袜视频影院导航| 婷婷五月天AV| 国产AV一区二区三区日韩| 国产九月婷婷| 色色综合网站| 丁香5月婷婷| 激情婷婷五月天| 日韩中文欧美| 91人无码久久久久久| 另类图片激情五月| 日日操,夜夜爽| 久久性爱视频| 九九99久久精品| 亚洲色基地| 色婷婷香蕉| 色婷婷五月亚洲| 丁香婷婷激情| 超碰免费成人网站| 操久久网| 激情文学五月丁香六月婷婷| 九九碰九九爱97超碰| 丁香五月激情啪啪综合| 99久热在线精品| OUMEIRIHANCHENGREN| 欧美三级欧美一级| 99黄色| 色播婷婷大香蕉| 精品少妇人妻AV无码专区偷人 | 99久在线精品99re8热| 色婷婷成人网| 99色在线视频观看| 精品综合久久久久久五月天| 9999久久久久| 色色五月天婷婷丁香| 精品久久人妻热| 99精品视频网| 亚洲综合色婷婷文学| 五月丁香亚洲校园欧美| 五月天淫乱视频| 影音先锋91网站在线观看| 成人Av在线大片| 天天日天天做天天操| 五月成人网站| 五月丁香免费视频| 色99在线| 丁香六月激情国产| 五月丁香婷婷综合网色欲| 婷婷综合| 超碰人人操人人干| 五月天操逼网| 国内久久亭亭| 激情六月色| 天天干人人奸97| 台湾综合丁香五月蜜桃| www.日日夜夜.com| 91人人操.COM| 天天搞天天色综合| 超碰在线综合| www.99热视频| 色播激情婷婷| 免费观看欧美成人AA片爱我多深| 操97在线观看| 五月丁香婷庭在线| 九九色婷婷五月天| 五月丁香婷婷中文网| 综合色图区| 九九色人| 99热这里只有精品2| 九月综合| 成人婷婷| 精品人人操| 97色色综合| 精品视频网| 操逼棍操逼| 久久激情中文| 婷婷五月天啪啪| 亚洲美女裸体被操在线观看| 五月丁香婷婷激情澎湃四射| 婷婷六久久| 99热这里只有精品2016| 先锋影音男人的天堂AV| 99色色色色| www.爱婷婷.com| 五月花激情| 婷婷五月色惰| 色综合com| 91热99| 第四色激情网| 丁香六月婷婷综合色| 99性爱视频| 色欲人妻综合aaaaaaaa网| 日日天天干| 日本精品在线噜噜噜| 狠狠操狠狠操AV| 国产伦理精品高清在线观看网站一区二区 | 亚洲碰碰碰| 五月天综合激情网| 婷婷激情综合| 久久66精品| 665566 无码| 日韩九九| 婷婷五月天激情小说| WWW色综合| 中文字幕成人| 婷婷日日天天| 丁香狠狠操| 亚洲色图五月丁香| 久草久青福利| 超级久久久| 五月丁香啪啪啪| 成人av在线网站| 日韩无码专区| 日韩精品二三区| 狠狠色丁香婷婷五月| 五月婷婷色综图片| 天天婷婷天天| 欧美色碰| 精品夜夜澡人妻无码AV| 天天草比天天爽| 非洲一级AV| 婷婷成人视频| 99色免费观看全部| 久久久中文| 国产美女无遮挡裸体毛片A片| 人人人操97| 婷婷丁香色情| 99久久99热这里只有精品| 97碰碰叉| 亚洲色婷婷| 久久这里只有精品无码| 香蕉视频91| 亚洲九九夜夜| 丁香五月成人| 色五月视频无码播放| 久草丁香婷婷五月天婷| 国产激情久久久| 五月天婷婷高清无码| 综合狠狠干| A片试看120分钟做受视频红杏| 天天爽天天做| 婷婷五月色花丁香社区| www.久久婷婷| 666555。COm毛片| www.色婷婷.com| 婷婷亚洲激情在线观看视频| 99毛片| 97色干在线观看| 久久婷婷丁香| 99热精品6| 丁香婷婷大香蕉| AV片在线观看| 99视频内射三四| 久久久久这里只有精品| 婷婷五月天激情在线观看 | 精品思思久久| av超碰在线| 婷婷色综合| AVDV久久| 丁香六月婷婷综合在线| 久久6这里只有精品| www一起操在线观看| 久久99国产综合精品免费| 91青娱乐青青草| 丁香婷婷五色月| 色色五月天婷婷| 1234操逼网| 久久久国产精品黄毛片| 中文av网站| 丁香婷婷五月综合| 99热九九热| 五月婷婷丁香伦理网| 粉嫩av蜜桃av蜜臀av| 色丁香五月婷婷综合久久| 丁香五月成人| 丁香成人五月天| 狠狠香蕉| 成人婷婷| 182TV大香蕉| 久久A区B区| 狠狠狠激情网| 亚洲天堂AAA| 99热大全在线观看| 日韩成人精品中文字幕| 久热人妻| 五月婷婷六月天| 97碰碰在线观看视频| 伊人大香蕉毛片| 屁股翘好撅高迎合跪趴| 99热这里都是精品| 国产乱妇无乱码大黄AA片| 二色av| 天天肏在线观看| 亚洲丁香五月天视频| 天天干com| 69er小视频| 色综合五月在线| 99er免费在线观看| 成人欧美一区二区三区在线观看| 另类图片五月天婷婷| 中文网AV| www。88热在线视频免费观看| 丁香五月天导航| 99久久婷婷| 九九碰九九爱97超碰| 九九色逼| 日日操夜夜爽白洁| 伊人国产婷婷五月天| 六月婷伊人| 天天做天天干天天综合网| AV天堂淫乩| 人人爱天天摸摸天天爱| 色青五月天| 久久欧洲综合网| 亚洲小视频| 婷婷精品综合| 国精产品一区一区三区有限公司杨 | 久久综合九九| 五月婷婷激情网| 国产又爽又猛又粗的视频A片| 夜精品无码A片一区二区蜜桃| 欧美电影在线播放| 精品久9| 99干在线| 婷综合| 激情com| 五月的丁香六月的婷婷| 五月天激情亚洲| 色婷婷精品视频| 成人片在线播放| 97av在线视频| 丁香五月-激情综合| 超碰免费电影| 操碰99| 99热视| 97韩国久久电影院| 91干在线| 99热| 日本黄色精品| 97人人干| 丁香六月婷婷综合在线| 色综合久久综合中文综合网| 丁香网站| 久热精品在看| 青青夜夜狠狠夜夜狠狠| 丁香五月开心婷婷| 色五月琪琪| 亚洲V国产V欧美V久久久久久| 9l视频自拍九色9l黑人| 丁香五月婷婷激情网| www.色婷婷。com| 玖玖资源站中文| 色婷婷99| 精品九九久久| 狠狠做五月| cc精品国产性传播| 日狠狠| 99九九精品视频推荐| 91视频一起草| 开心五月婷婷激情网| 九九热最新| 激情深爱五月天| 免费观看高清无码| A√天堂网在线| 亚洲色优| 人妻熟人中文字幕一区二区| 91热视频色网站| 欧美综合丁香网| 久久久久激情网| 国产精品日本一区二区在线播放| 色婷婷五月天偷拍| 综合网五月天123| 久久久com| 亚洲一级 片内射网站在线观看| 五月丁香福利| 婷婷开心五月| 亚洲乱码日产精品BD| 97五月久久丁香婷婷| 99热这里只有精品69| 九九色综合网| 天天综合色99| sewuyuejiqingwang| 99ri国产| 亚洲超级碰| 色色亚卅| 人妻中文在线| 99精品热视频| 久久人妻精品| 亚洲国产成人AV在线| 国产成人AV不卡| 婷婷丁香五月天影院| 五六月丁香激情视频| 九月婷婷综合| 91精品久久久久久久久| 色色AV色色色东莞| 婷婷丁香18| 五月婷婷亚洲天堂激情在线| 五月丁香啪啪激情| 26uuu偷拍亚洲欧洲综合| 亚洲噜色| 日韩黄色影院| 狠狠干五月丁香| 婷婷深爱五月天| 97婷婷丁香| 六月激情婷婷| 国产精品A片在线| 思思99re这里只有| 国产欧美日韩综合精品一区二区| 永久的网站AAAA| 另类激情综合| 99热青青草| 久久精品系列| 久久宗合影| 婷婷激情五月综合| 99操网站| 怡红院一二三| 99视频极品在线香蕉| WWW.色婷婷.COM| 少妇人妻偷人精品无码视频新浪| 色婷婷欧美在线| 超碰人人在线| 色色色在线播放| 99热最新网址| 爱草视频在线观看| 无码成人播放器| 亚洲五月天狠狠| 亚洲婷婷性爱| 日日舔夜夜操| 激情婷婷网| 99精品在线观看视频| 99热99| 天天日夜夜爽| 夜夜资源站| 任你爽精品免费视频6| 久久精品五月天| 激情综合网五月丁香| 国产精品成人AV在线| 久热 91| 99热都是精品| 亚洲成人在线播放| 思思综合热| www,99热在线观看| 色五月天电影| 超碰人人射| 人人操av| 婷婷丁香人妻久久在线观看| 九九精品少妇| 五月丁香免费视频| 激情五月图| 成人做爰黄A片免费看直播室男男| 五月丁香婷中文字幕| 丁香五月婷婷综合激情哟哟哟| 丁香激情五月少妇| 综合激情在线| 色五月亚洲| 99久久99热这里只有精品| 精品国产a| 超碰人人99| 久久99久久99精品免视看婷婷| 99热超碰| 五月婷婷丁香瑟瑟视频| 久久久精品AV| 被强行糟蹋的女人A片| 激情五月www| 激情九月婷婷九月| 在线va网站| 五月婷婷亚洲天堂97色婷婷| 色色无码| 亚洲成人色五月天| 9久热视频| 大香蕉婷婷丁香天堂AV| 国产26uuu视频| 97在线日本| 亚洲无码色色| 九九热精品6| 99久在线观看| 伊人香大香蕉视频| www.五月婷婷久久.com| 日日干综合| 97久久久免费福利网址| 五月婷婷综合激情| 婷婷五月六| 久久视频66| 91干在线视频| 激情四射五月天| 天天狠狠夜夜狠狠2023| 五月天五月色婷婷综合| 月色色综合婷婷网| 婷婷五月丁香久久| 五月婷婷久久久| 婷婷五月丁香五月基地| 在线播放成人网站| 伊人AV五月婷| 五月婷婷五月丁香综合| 婷婷五月天精品| 狠狠精品干练久久久无码中文字幕 | 99热地址| 99激情视频| 提提热五月天婷婷| 黄网在线播放| www.婷婷五月天,com| 婷婷亚洲综合| AV成人在线播放| 天天透天天摸天天舔| 五月婷婷激情网| 久久久人人操A V| 精品夜夜澡人妻无码AV| 中文无码婷婷| 99热精品中文字幕| 激情五月天免费视频| 国产激情久久| 日韩av在线免费观看| 综合色七七| 婷婷五月天福利| 91九色中文| 九九在线这里只有精品视频| 亚洲激情电影五月天色婷婷丁香一起草| 丁香五月婷婷亚洲色图| 婷婷五月丁香成人网| 人妻久久久久久| 五月天综合久久| 久久婷婷视频| 亚洲成人人人操| 婷婷五月天激情小说网站| 丁香五月激情综合| 色琪琪一综合久久激情五月视频| 五月天堂六月丁香亚州中文字幕久久| 亚洲中文字幕在线观看| 开心五月天激情网| 亚洲成人在线播放| 97香蕉久久超级碰碰高清版| 99精品热| 夜夜骑天天操| 婷婷五月天亚洲| 六月婷婷久久大全| 精品,99| 六月丁香激情婷婷| 丁香亚洲婷婷五月| 激情五月伊人婷婷| 综合亚洲五月天| 夜夜夜天天操| 六月婷婷天天操夜夜爽视频| 99热99在线| av在线资源| 99精品久久久久久久婷婷| 182TV亚洲| 色噜噜狠狠色综合网| 伊人综合色干| 日本久久人| 婷婷久久精品| 伊人久久大香蕉网| 中文字幕av在线| 日韩九区| 性色欲情 网站| 丁香五月激情宗合网| 日本综合久| 免费国产VA国产免费| 丁香五月天天哦| 五月伊人综合| 天色综合网站| 99热这里只有精品热| 97好吊操| 丁香婷婷噜噜| 天天干天天拍| 色婷五月天| 五月综合无码| 丰满少妇猛烈A片免费看观看| 日韩av一区二区在线/日产精品久久久 | 深夜A片| 色欲一区二区三区精品A片| 五月丁香影视| 婷婷导航| 国产精自产拍久久久久久蜜| 琪琪色综合网站| 色婷婷丁香AV综合| 在线观看996精品| 99热综合网| 六月婷婷网| 激情五月天免费视频| 欧洲亚洲精品| 香蕉婷婷| 国产欧美日韩综合精品一区二区| 26uuu色五月| 欧洲区自拍| 99久久99久久综合| www.com操| www.99热视频| 久久九九99| 成人精品视频99在线观看免费| av婷婷丁香| 亚洲AV网站在线观看| 国产五月丁香在线| 九九热视频免费| 丁香五月天视频| 99久视频| 99热伊人综合| 大香蕉五月天| 热99这里只有精品视频| site:pnnrt.com| 无码色| 久久丁香婷婷色情综合| 久婷| 九九热在这里只有精品| 9热在线观看| 丁香网站| 亚洲一级AV在线免费播放| 激情五月丁香五月| 五月丁香激情欧洲啪啪| 网色99| www五月婷婷88导航| 中文字幕成| 永久99免费视频网站| 久久伊人五月天| 五月天丁香网| 婷婷久久在线| 婷婷的五月天另类视频| 色色色99| 日本一級黃色一級片| 99干日本| 丁香婷在线| 久久九九99| 东北熟女高潮99综合99| 最新热中文字幕| 综合色色色色色色| 九九Av| 五月丁香激情综合啪啪| 亚洲综合色丁香五月天| 亚洲无码另类| 婷婷丁香五月天色色| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网 | 第1影院之五月婷婷| 玖玖在线资源视频| 4399人妻无码久久久| 狠狠爱深色婷婷综合| 狠狠综合久久| 噜噜视频| 丁香五月婷婷激情四射深爱激情| 欧美激情综合| 五月婷婷在线观看黄| 激情性爱五月天网页| 色噜噜狠狠色综| 热久精品| 色色97丁香婷婷五月天| 亚洲综合干| 99久久6| 七七九色| 五月婷婷69| 久婷狼色诱惑在线| 美女100%露全身无挡网站| 99精色| 九九色色色| 婷婷六月啪啪| 伊人九九九久| 99色一| 国产乱妇无乱码大黄AA片| 97碰碰人人| 亚洲色夜| 亚洲AVDVD| 久久久久久久久人妻| 91色呦哟| 开心五月激情站| 天天干天天干天天干| 国产免费AV网站| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 最近中文字幕2019视频1| 九九这里只有精品在线视频| 久九色| 色婷婷久久综合久色综| 五月婷婷成人| 日韩美女羞羞网站在线观看| 色色色图| 国产色香蕉精品五夜婷| 新精品99| 婷婷97C| 99re最新地址| 伊人在线大香蕉网| 夜夜撸天天日| 大香蕉网 久久| 国产高清精品色| 久久婷婷免费| www.ppypp| 色综合中文综合网| 五月激情天天干| 无码人妻一区二区一牛影视| 日韩操| 婷婷久久婷婷色五月| 伊人啪啪网| 日韩成人电影av| www.五月天婷婷| 日韩在线一级| 99视频网址| 六月丁香av| 激情久久久久久| 五月丁香啪| 五月丁香激情综合网| 六月丁香深深爱| 人妻激情久久| 99热这里只有精品16| 免费AV在线网址| 成人电影在线免费试看| 超碰人人艹| 久久性视频| 夜夜做天天爽| 99精品综合在线| 五月天偷拍| 成人精品在线| 99精品在线观看| 男女久久婷婷五月天| 五月天婷婷Av| 国产精品色婷婷久久久精品| 久久东京热婷婷五月| 热九九精品| 思思热再线视频| 综合九九久久| 综合久久婷婷| 五月丁香999| 91高潮喷水久久久久久久久| 美国十月色婷婷在线观看| 黄网在线播放| 欧美性生交A片免费看| 丁香五月综合在线观看| 久色激情| 激情五月天丁香| 丁香六月亚洲综合 | 五月亭亭狠狠| 99激情在线| 欧美肉大捧一进一出免费视频| 无码人妻一区二区三区免费九色| 男人天堂 久久| 色婷婷五月在线| 呦呦视频无码播放| 久久综合色五月| 国产这里只有精品| 婷婷5月九九| 久久婷狠狠色| 五月开心播播网| 丁香五月在线观看| 另类色视频| 97在线天堂| 丁香六月婷婷综合| 五月丁香婷中文字幕| 日韩av在线免费观看| 婷婷啪啪| 六月丁香激情| 99久久国产宗和精品1上映| 婷婷五月另类网站| 九九Av| 天天天天天久久久久久| 久久色区| 国产欧美大香蕉一区| 5月丁香啪啪啪| 色噜噜婷婷| 九九亚洲视频| 日韩欧美性爱| 五月天激情小说| 婷婷五月天在线一区| 成人操呦av| 欧美日韩国产日本精品四虎网网站物| 任你草| AV成人在线播放| 最新亚洲色色网| 婷婷色丁香五月| 久久婷鲁| 另类图片五月天| 9l视频自拍9l视频自拍九色学生| 伊人六月丁香婷婷| 超碰成人在线观看| 中文字幕精品推荐免费在线观| 丁香五月婷婷基地| 开心婷婷中文字幕| sewuyuejiqingwang| 色情五月综合婷婷| 色婷综合| 亚洲第一成人无码A片| 狠狠香蕉| 久久人妻人人| 淫荡综合网| 五月激情五月丁香| 婷婷五月综合久久中文字幕| 九九精品丁香花| 最近中文字幕大全免费版在线| 97在线刺激| 婷婷五月美女直播| www.婷婷,com| 99热99网| 任你爽精品免费视频6| 中文字幕人妻AV| 五月日韩中文字幕| 六月丁香久久| 大香蕉520| 99操免费视频| www.99热这里只有精品| 婷婷丁香五月欧美人| 狠狠干天天内射| 久久99久久久久久| 九九自拍网| 狠狠色丁香久久婷婷综合五月| 人妻激情久久| 国产3p露脸普通话对白| 婷婷成人视频| 丁香五月天色婷婷| 大香蕉五月天| 欧美在线操| 91免费看片| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 高清视频一区| 91人人网| 大香蕉五月婷婷| 射区导航| 久99热在线观看| 色色国产| www.9797国产| 国产性爱一级| 亚洲婷婷基地| 五月丁香婷婷色色色| 丁香五月激情网| 99九无网码| 五月色婷婷影院| 色色丁香婷婷综合| 天天肏视频| 九九Av| 狠狠色噜噜狠狠狠狠综合| 久久99热这里只有精品| 激情网五月| 久草五月| 日韩精品无码一区二区| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 这里只有精品2| av狠狠操| 欧美啪啪9| 在线视频你懂得| 激情五月天小说网| 五月天色五月| www.91av.com| 日日操夜夜操中国无码| 六月丁香成人| 日本97在线视频| 亚洲1区| 久热这里只有精品在线观看| 色999五月色| 婷婷五月丁香综合人妻| 丁香五月综合AV在线| 激情婷婷六月天| 欧美三日本三级少妇三99| 一本久道综合色婷婷五月| 开心五月激情网| 丰满少妇乱A片无码| 996re热精品视频| 丁香久月婷| 色色色色色热| www.日日夜夜| 五月丁香六月情| 婷婷丁香成人| 精品一区二区三区四区五区六区| 五月天开心色色网| aaa9区免费在线观看| 伊人久久艹| 亚洲五月综合色播| 婷婷综合在线| 五月丁香天堂网| 成人.在线日韩| 婷婷五月天大香蕉| 婷婷丁香五月天哟啪| 玖操97| 日本色婷婷| 亚洲五月婷婷| 亚洲综合色成丁香五月色| 正宗黄色毛片| 激情婷婷五月亚洲| 日日夜夜狠狠干| 91婷婷在线| 日本三级成人秘书精品片| 丁香五月最新网址| 婷婷激情丁香五月天综合| 午夜电影网VA内射| 日本久久婷婷| 99久久户外勾搭| 色玖玖综合| 5月色亭亭视频| AV性爱网| 99精品视频在线观看| 日本在线观看91| 热99精品视频在线观看| 中文字幕色色| 婷婷色六月| 亚洲123区高清入口| 五月色情婷婷| 五月丁香在线看| 99综合视频| 日本在线wwww| 九九免费精品在线视频| 五月天com| 丰满少妇乱A片无码| 精品亚洲国产成AV人片传媒| 婷婷六月天精品| 亚洲激情综| 色和综合网| 国产韩日亚洲美州欧亚综合在线| 天天日天天日天天搞| 五月丁香| 99re在线免费视频| 再次出发二| 97亚洲婷婷| 五月丁香久久综合91| 97人人草| 亚洲丁香婷婷丁香五月天激情| 精品一二三区久久AAA片| 亚洲色图五月丁香| 亚洲麻豆乱码国产2028| 久久99久久99精品免视看婷| 超碰99热精品| 亚洲无码 图片区| 五月婷婷综合网| 激情五月天网| 99综合| 日本高清久| 激情丁香五月天图片| 五月婷婷婷丁香播| 思思99热这里只有精品| 色欲久久久久| 国产精品久久久久久久久久| 国产老熟妇亲子乱对白| 五月丁香六月婷婷中文版| 激情四射网| 久久久九九视频精品18| 97色色色色色色色色色色色色色| 激情婷婷久久| 日本天堂久久| 中文字幕久久一区二区三区| 五月激情小说网| 日本综合99| 五月激情另类| 亚洲国产99| 婷婷九色| 中文在线视频久1| 国产五月视频| 久久这里在精品视频| 丁香婷婷色情| 欧美激情久| 五月丁香狠狠| 国产,欧美,学生妹,视频| www.91色| 亚欧州精品视频| 99热超碰天堂网| 色色色图| 婷婷五月天国产传媒| 天天噜天天爱| 婷婷导航| 丁香五月天欧洲在线| 另类 在线| 色五月大| 26uuu成人网| 91色欲综合| 色五月婷激情| 老师高潮流白浆喷水的A片| 久久狠狠色| 8090在线影视少妇| www.日本久久videos| 激情色播| 天天久久66xxx| 99热手机在线精品| 色婷婷五月色| 色射影院| 久久激情视频| 五月婷婷,六月丁香| 亚洲在线综合| 激情五月丁香五月| 91啪啪视频| 99这里只有精品|v| 五月天丁香综合| 男女99免费视频| a网站免费观看| 久久人妻精品| 天天做天天爱高潮片| 91色婷婷综合久久中文字幕二区| 激情丁香婷婷六月天| 九九av| AV堂狠狠干| CHINESE熟女老女人HD视频| 色爱综合视频| 国产在线激情视频| 俺五月| 五月婷婷性爱网| 五月激情站| 日韩在线视频中文字幕| 丝袜激情网| 免费AV播放| 丁香五月久久| 亚洲女婷婷五月基地综合久久久| 欧美婷婷| 五月婷婷和六月| 操97在线观看| 九九热在线视频| 99在线精品观看99| 九九色热| 精品一区二区三区木瓜| 久re在线| 日韩另类| 丁香五月天无码AV| 香蕉久久国产AV一区二区 | 婷婷爱爱蜜臀天天操| 五月婷婷人人人操| 激情丁香久久久久久| 色哟哟www| 99er这里只有精品视频| 亚洲妇女熟BBW| 亚洲天堂aaa| 色综合香蕉| 99爱视频在线观看| 日逼免费视频| 琪琪色热色色| 涩五月婷婷| 狠狠操.COM| 久久综合播放| 超碰成人免费| 亚洲va欧洲va国产va不卡| 日本不卡高字幕在线2019| 色色网站| 天天日天天舔天天摸| 大香蕉 婷婷| h亚洲| 色很很96| 九月丁香婷婷网| 久久性爱视频| 九九热手机在线视频| 性爱五月婷| 婷婷午夜精品久久久| 亚洲色婷婷网站| 韩国19 主播内部福利vip免费播放| 丁香五月手机在线| 色婷婷五月天激情综合| 精品99视频| 国产婷婷色综合AV蜜臀AV | 激情 婷婷| 欧美一区二区三区不卡影视| 大香蕉在线观看9| 91chinese在线|