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
返回資訊列表
99久久9| 国产精产国品一二三在观看| 婷婷亚洲五| 日本WwW色偷偷丁香花久久久京东热| 日本va欧美va欧美精品88| 天天操天天日天天爱| 97超碰,人人舔,人人操,人人摸| 色亭亭五月天丁香综合AV - 百度 - 百度| 五月丁香直播| www.狠狠操.com| 97精品综合久久内射| 亚洲热热视频| 97干视频| 五月婷婷丁香五月 | 日韩欧美婷婷丁| 99九九综合久久九九| 梁铮版蜘蛛女在线观看| 丁香5月激情网| 97婷婷五月激情六月丁香伊人| 丁香五月欧美| 另类天堂| 九九热只有精品| 天天色综合网1| 九九热99re8热免费观看 | 久草 天堂| 日韩人妻AV在线| 久久久www| 五月激情婷婷六月| 真实亲子乱子伦高清在线观看| 五月激情丁香六月狠狠干| www.色九月| 艹B高清无码| 91久久久久久久久久久| 九九色人| 色婷婷五月综合| 免费视频无码| 日韩九区| 六月丁香久久| 99久久国产宗和精品1上映| 人人操五月天| 99热官网| 天天干天天操天天干天天操天天干天天操 | 疯狂做受XXXX高潮A片| 97影院一级片| 色吧五月婷婷| 天堂AV三级| 久热网在线视频| 蜜桃婷婷丁香五月天狠狠久久综合| 99啪| 五月丁香婷婷综合在线| www·五月天| Se.婷婷五月天| 婷婷五月天色色| 99综合一区| 久9免费视频| 久久99久久久久久久噜噜| 精品热九九| 我淫我色婷婷五月天激情四射| 激情美女五月天激情在线| 九九精品片一| 五月丁香基地| 五月狠狠| 俺去也五月| 伊人久久婷婷| 99精品偷自拍| av一区二区电影免费在线观看| 色九九中文字幕| 色欲AVV| 97狠狠碰| 五月丁香啪啪| 五月色网| 东京热伊人| 色婷婷影视| 国内外色色色色色成人视频| 婷婷中合| 91婷婷搞| 日本成人小说婷婷六月| 蜜臀av粉嫩av懂色av| 黄色五月婷婷| www久久久久久久久久久| 久草婷妨| 亚洲日韩一页精品发布| 丁香婷婷五月激情四射网| 色欧美日| 天天人人天天爽| 婷婷五月激情欧美大胆视频| 成人av在线网站| 性无码专区无码| 123日本不卡在线| 亚洲视频久久| 99久久99热| 热久久视频99| 色999亚洲人成色| 开心五月深爱五月| 婷婷刺激综合| 九九热这里只有精品一| 亚洲99综合| 可以免费观看的av| 欧美性爱一区| 国产精品A片| 99热这里只有精品8| 日本色色色| 国产精品激情AV久久久青桔| 台湾无码A片一区二区| 色五月亚洲| 91人人爽人人操| 亭亭色色五月天| 六月丁香婷婷网| 五月天婷婷成人| 色色色图| 91色九| 久久婷婷色丁香| 人妻啪啪啪| 天天影院色| 久久5 9视频免费观看| 4399在线观看免费毛片| 伍月婷婷六月丁香| 亚洲五月婷婷| 99热老网站| 婷婷丁香五月天狠狠| 日本九九网| 久久婷婷五月综合色欧美| 91精品无码久久久久久五月天| 99热成人精品| 色偷偷五月天| 翔田千里 50岁 无码| 综合五月天天天天天五月| 婷婷九月激情| 色五月综合| 免费一区二区三区| 天天日,夜夜爽| 久久狼人天堂| 色婷婷69| 4438激情网| 丁香亭亭激情四射| 欧洲免费视频色| 丁香五月av| 国产.亚洲.欧洲视频在线| 亚洲综合婷婷| 岛国在线观看91| 五月丁香美女视频| 99操99| 操逼巨乳91| 天天精品视频在线观看视频| 午夜不卡久久精品无码免费| 2020夜夜操天天爽| 亚洲春色奇米影视| 五月婷婷福利| 午夜激情久久| 婷婷婷婷婷婷婷婷| 亚洲无码成人网| 91久久久久久久久久| 国产成人va在线| 九九这里只有精品| 天天做天天双| 色.五月综合网| 久婷婷五月丁香在线观看| 五月丁香激情婷婷| 操99| 五月婷婷六月丁香| 26uuu亚洲色| 激情综合五月| 五月天色婷婷小说| 久久这里只有精品视频15| 丁香六月视频| 色综色网| 九九無妻| 91热在线| 人妻人人操| 午夜婷婷| www.五月天| 婷婷另类开心| 九久九精品| 极品 少妇 内射| 国产精品一区在线观看你懂的| 亚洲愉拍99热成人精品| 色婷婷色人人射| 国产成人精品一区二三区熟女在线 | 亚洲高清在线| se色99| 狠狠穞A片一區二區三區| 婷五月天天| 五月婷婷激情网| 色婷婷内射| WWW.国产| 无码 色| 丁香婷婷老司机久操| 天天操人人干| 97干在线视频| 鲁鲁色五月| 99成人无码| 精品视频二级九九| 婷婷五月天激情综合| 婷婷综合97| 五月丁香| 久久久久久综合五月婷婷| www.ywav| 色婷婷99| AV天堂婷婷五月天| 久久网日本| 亚洲AAA| 天堂婷婷综合| 久青操| 久99热| 蜜桃人妻无码AV天堂三区| 在线观看玖玖资源免费观看| 操九色| 26uuu国产| 五月天婷婷色小说| 激情五婷网| 激情五月天色色| 色性五月天| 婷婷五月丁香色综合| 六月婷婷开心| 五月天婷婷综合免费| 99色综合网| 粉嫩AV久久一区二区三区| 天天日,天天射,天天舔| aaaaaa片| 天天操婷婷| 亚洲中文字幕在线观看| 九九99九九99| av五月天婷婷丁香| 激情小说婷婷小说| 九九久久免费视频44| 五月丁香在线婷婷蜜桃| 麻豆雪千夏| 超碰国产在线| 97干在线播放| 国产VA亚洲VA96| 色婷婷97| 婷婷性爱视频在线| 色综合99无码 | 97色伦另类图片小说视频 | 99啪99| 日韩激情婷婷五月天| 99caobi| 天天干电影| 综合五月丁香六月婷婷| 亚洲五月天伊人| 五月天综合久久丁香91| 五月天综合在线网| 99热这里只有精品3| 色婷婷色情| www99精品| 激情五月婷婷| 日本天天色| 丁香六月伊人| 日韩一区二区三区无码| 六月天婷婷| 欧美五月丁香| www,婷婷五月天777me,com| 五月丁香综合影院| 97精品人人A片免费看| 日本色五月| 日韩无码一区二区三区四区| 久久丁香五月| 日hao1区| 婷婷丁香精品视频在线观看| 婷婷香草网| 色五月成人| 五月精品免费XXX| 日本欧美在线| 亚州操操| 专区无日本视频高清8| 色综合久| 超碰免费人妻| 国产午夜精品一区二区| 亚洲色热| 亚洲日日日| 天天精品视频在线观看视频| 欧美婷| 五月丁香六月色婷婷综合五月天| 日韩av在线免费观看| 在线中文字幕免费视频| 欧美性生交A片免费看| 日日杆天天| 成人短视频在线免费观看| 天天拍夜夜爽日日| http://www.lingjunshare.com/| av在线超清中文| 97综合色片| 777精品久无码人妻蜜桃| 99色1| 激情综合青草| 99久久66| 婷婷五月天激情四射五月天激情| 婷婷色激情网| 五月天婷五月天综合网在线观| 丁香六月色婷婷| 91人碰| 操草草草| 久热伊人在91| 亚洲AV无码一区二| 久热天堂| 久久九精品| 色色丁香色五月| 91 久热| 播丁香五月婷婷欧美| 久草热久草在线视频| 蜜桃成语时李时珍 免费| 欧美激情五月天| 狠狠操天天干| 欧洲色区| 美女久久天堂| 成人人操| 欧美日韩成人| 婷婷综合五月激情| 欧美性爱5月天天天看| 天天操夜夜玩!| wwccc久久久| 色情播放| 婷婷综合色色| 五月婷婷色男女| 色丁香综合影院| 国产淫熟妇| 五月天伊人日日噜影片AV| 岛国资源网| 婷婷狠狠五月综合| 色色色综合色| 中文字幕在线免费观看视频| 97色干| 欧美成人AAA片一区国产精品| 日本不卡高字幕在线2019| 99欧美精品99日本精品| 亚洲精品中文字幕成人片| 亚洲午夜一区二区| 五六月婷婷| 久久这里面只有精品视频| 五月丁香六月情婷婷久久| 久草xx性爱视频| 九九视频这里只有精品| 92久久| 中文字幕 码精品视频网站| 无码99| 婷婷六月成人| 操碰99| 天天日天天插天天操| 天天做天天爱天天爽在| 五月天综合视频网| 亚洲午夜AV| 色99久草在线| 亚洲婷婷视频| 五月天激情无码| www.henhenl| 亚洲另类在线观看| 超碰在线99热| 五月五丁香婷婷| 婷婷五月色播放| 色碰碰| 天天操夜夜操| 婷婷色在线视频| 这里只有精品热| 婷婷情色激情| 五月婷婷六月天| 成人久碰| 九九国产精视频| 婷婷色5月激情网| 熟女激情网| 国产成人精品一区二区三区视频| 狠狠色丁香婷婷久久综合| 丁香五月在线伊人| 天天干天天操天天射| 嫩草AV久久伊人妇女超级A| 男人天堂AV在线一区二区| 五月丁香色情| 丁香五月婷婷日本| 五月日韩中文字幕| 99在线er热| 91成人性爱视频| 九九碰九九爱97超碰| 九月av在线| 色情五月丁香婷婷网| 99.N在线视频| 日本玖玖在线| 婷婷激情蜜桃玖玖丁香| 99精品亚洲| Av在线资源| 婷婷丁香五月天色区| 秋霞AV淫| 毛片九九九九九九| 一级操逼内射在线视频| 性按摩玩人妻HD中文字幕| 久久性爱视频| 操操自拍| 久久日韩婷婷五月| 色噜噜婷婷| 五月天激情小说网| 色九月| 激情五月五月婷婷| 亚洲天堂制| 精品一二三区视频立| 91人人操人人爱| 五月丁香婷婷成人网| 美女黄频aⅴ视频| 久久免费婷婷视频| 婷婷五月激情基地| 久久久五月激| 无码成人AAAAA毛片AI换脸| 丁香五月婷婷深爱综合激情| 丁香五月综合婷婷| 91黄操| 九九婷婷网五月天| 99久久高清视频| 婷婷五月六月激情| 五月丁香激情综合网官网| 激情五月天开心网丁香无码| av国产精品| 色五月综合激情| 丁香激情四射| 久久精品63| 五月天婷婷綜合院| A1片久久久| 五月成人天| 丁香六月欧美| 天天插天天爽| 激情五月综合久久| 色五月色图| 十区AV| 欧美Va婷色| 97久操| 这里只有精品网| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 伊人婷婷99热精品| 狠狠色 综合色区| 婷婷五月天成人网| 欧美丁香六月在线观看视频| 四LLL少妇BBBB槡BBBB| 五月花综合网| 少妇熟女视频一区二区三区| 99国产小视频| 九九热在线视频观看免费10| 九九热婷婷| 无码髙清| 丝袜大香蕉| 色婷婷XXXXX| 色情成人五月天| 六月丁香激情综合网| 夜夜谢天天干| 婷婷深爱五月亚洲综合| 久久蜜臀婷婷| 啪啪综合| 99亚洲综合| 少妇水多A片太爽了| www,色中色| 亚洲视频另类| 综合性爱网| 五月天成人综合| 色色99| 激情深愛五月視頻| 丁香社92视频| 六月99天天婷婷激情综合| 天天爽人人综合免费7799| 天天噜噜| 成人九九视频| 在线成人网站| 少妇伦子伦精品无吗| 色性日本| 亚洲啪啪网| 丁香五月六月综合激情| 五月激情网五月综合网| 玖玖热99| 五月婷婷丁香| 婷婷基地爱| 婷婷色综合| 丰满人妻妇伦又伦精品国产 | 丁香婷婷六月激情文学 | 99ri精品在线| 翔田千里无码| 4438激情网| 丁香五月影院| 色婷婷精品| 91婷婷在线| 欧美va亚洲va在线播放| 色婷婷五月在线| 婷婷丁香五月,狠狠综合| 激情五月婷婷视频| 爱射综合| 思思热AV| 综合激情五月综合激情五月激情1| 狠狠色综合久久久久| 二色av| 天天色天天舔天天爱天天爽| 噜噜干日本| 91久久精品国产91性色TV| 综合色色婷婷| 全亚洲最大的婷婷五月天网站COM 丁香五月婷婷狠狠色 | 五月天 综合 在线| 久热综合| 婷婷五月激情视频网| 精品人妻久久久久久| 大地资源色婷婷视频在线| 亚洲人妻AV| 超碰激情五月| 久久婷婷青青草| 亚洲高清在线| 色婷婷狠狠| 五月婷婷综合网在线播放| 五月婷婷色播| 丁香五月97视频| 六月丁香网| 人人综合久| 九九这里有精品视频| 99re在线精品视频| 丁香花操逼| av亚洲国产小电影| 成年人丁香五月| 狠狠狠狠狠狠色| 婷婷六月花| www.夜夜操.con| 五月丁香激情婷婷| 婷婷色基地在线看 | 另类图片色五月| 超级碰碰碰久久网站视频| 91久久久久久久| 亚洲碰碰碰| 婷婷狠狠干| 97碰 在线视频观看| 五月天综合网| 亚洲这里只有精品| 丁香五月久久| se99视频| 九九激情综合| 五月天婷婷av| 九九婷婷综合| 啊v视频在线观看| 五月婷视频在线| 精品A√| 99热九九在线| 欧美激情-区二区三区| 亚洲爱爱无码婷婷色五月| 久久这里只精品66| 欧美性二区| 久久超级碰视频| 五月婷婷日| 成片免费观看大全| ...婷婷五月综合不卡,国产在线手机 | 色婷网| 丁香五月91| 午夜九九九九九九九九九九九九九| 91熟妇大香蕉| 五月婷婷九九久久| 成人Av在线大片| 五月婷婷七月丁香| 在线观看av网站| 97色永久免费视频| 成人在线日韩| 六月丁香视频网站| 另类婷婷丁香| SS丁香五月婷婷| 天天爽免费视频| 九九久热| 夜夜躁婷婷AV| 久99热| 日日日日日| 色婷婷成人做爰A片免费看网站| 人人操av| 九九XX视频| 五月婷婷黄色毛片| 色综合中文| 在线中文字幕av| 色婷婷综合网站| 激情五月天噢美| 五月婷色丁香| 婷婷操婷婷干婷婷射| 五月婷婷中文字幕| www.99热日韩.com| 五月丁香六月综合激情网| 婷婷日日夜夜| 香蕉国产2013| 亚洲激情在线| 亚洲成人精品三区| 日韩人妻在线观看| 99亚洲综合| 九九爱看亚洲| 99免费热视频| 婷婷97碰碰| 99热这里是精品| 无遮挡国产高潮视频免费观看| 99人妻碰碰久久久禁片| 丁香五月婷婷综合91| 99自拍视频网站| 日韩99色| 亚洲日日日| 色综合激情| 超级碰碰97在线| 国产色香蕉精品五夜婷| 色啪网| 色婷亚洲| www.丁香五月| 中文字幕人妻一区二区| 51成人| 天天干天天干天天干天天干天天干天天| 热成人网| 夜夜谢天天干| 欧美日韩日韩成人| 思思热99er在线视频| www天天爽| 久久99精品久久只有精品| 久久精品无码一区| 就是色婷婷五月亚洲色| 婷婷丁香五月高清| 思思热这里只有精品| 久久这里只有精品视频15| 另类在线| 人。妻久久| 色色色热| 在线你懂的亚洲欧| 色情五月停停丁香| 99精品久久| 五月激情婷婷国产精品久久久久久| 26uuu美女三级视频| 欧美日韩成人在线网站| 五月天丁香久久综合| 丁香六月婷婷开心| 欧美VA在线| 老师的粉嫩小又紧水又多A片视频 粉嫩AV久久一区二区三区 | 99视频在线观看地址| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 色五月色综合| 入口五月婷婷六月香| 五月婷婷啪| 国产av天堂| 久久综合爱| 日韩99精品| 五月丁香综合| 成人在线精品| 91丨九色丨白浆秘| 综合 蜜月 婷婷| 深爱开心激情网| 久久99视频| 色www.con| 亚洲A色| 夜精品无码A片一区二区蜜桃| 婷婷五月天黄色网址| 深爱五月网| 中文字幕日产A片在线看| 久久久久久久久99精品| 激情五月丁香五月| 国产女生爱爱AA| 96性爱视频| 五月亭亭开心网| 久久综合爱| 五月婷在线| 特黄三级又爽又粗又大| 亚洲婷婷激情888精品久| 伊人激情AV一区二区三区| 激情五月天色网站| 五月婷婷偷拍| 啪啪六月婷婷| 色色色婷| 亚洲五月激情| 99热这里都是精品| 色五月婷婷综合在线| 色播五月网| 69久久久| 婷婷五月中文在线视频| xxxx五月天色色| 97婷婷五月| 五婷婷综合网| 91大屁股| 日噜噜色| 欧洲亚洲精品| 色色五月天丁香| 99九色视频在线观看| 啪啪激情综合| 丁香六月啪| 99九九久久| 都市激情久久| 99热精品在线观看| 婷婷播播五月天| 亚洲乱码精品久久久久..| 人人色性网| 亚洲欧洲中文日韩久久AV乱码| 天天色爽| 9999热免费视频视频| 五月婷婷 激情五月| 丁香五月婷婷激情完整版| 亚洲无码色色| 久久五月丁香婷婷| 日本人妻A片成人免费看片| 激情五月第四色| 女人被躁到高潮嗷嗷叫小| 青草视频在线蜜臀| 久久受www免费人成| 天天干天天射色综合| 欧美超碰人人| 玖玖婷婷五月天| 五六月婷婷| 色婷婷网大全在线| 玖玖资源在线视频| 超碰在线国产9| 天天综合在线网| 婷婷激情区| www亚洲无码| 婷婷丁香97| 五月婷婷综合网在线播放| 婷婷五月色播天| 丁香五月亚综合图片| 99热精品观看| 国产偷人爽久久久久久老妇APP| 婷婷五月天激情五月天网站| 五月丁香综合影院| 亚洲色综合性| 久9免费视频| 日韩无码专区| 天天日人人| 九九超碰人人| 中文字幕黄色片| 欧美Va在线| 日本精品干| 天天日天天爽| 婷婷五月天美女21p| 六月丁香婷婷五月天| 好吊兆人妻| 丁香五月天在线观看| 99综合色色色| 99啪视频在线观看| 久久a热| WWW五月| 国产色色在线| 久久五月天免费网站| 九九久久综合| www.激情五月| 亚洲色五月天在线| 人妻AV在线观看| 久草热8精品视频在线观看| 五月婷婷激情| 久久婷婷婷婷伊人| 天天插天天玩天天干| 久久99草五月婷婷| 狠狠插狠狠插| 激情99| 久久五月婷婷开心网| 综合久久综合久久| 九色porny在线观看激情四射| 97色婷婷| 91精品久久久久、久五月天| 2020久久婷婷五月| jiujiu热在线视频| 高清国产一级婬片a免费| 涩五月婷婷| 色久女| 丁香5月婷婷| 狠狠操.com| www.91操| 亚洲精品成人片在线播| 性欧美大战久久久久久久83| 99热自拍| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 丁香综合网| 99er这里只有精品视频| www.久久久久久久久久久| www.yw尤物| 久久五月天婷婷| 日日干天天| 婷婷五月天首页| 南京搡BBBB搡BBBB| 五月天激情小说| 在线不卡中文字幕| 九九中文字幕九| 婷婷五月天久草在线| 久久九九99| 99精品在线| 精品婷婷| 啪啪激情综合| 综合AV在线| 天天日天天舔| 噜噜视频| 99成人| 婷婷六月激情| 亚洲婷婷免费| 天天干天天日天天操| 夜夜做夜夜愛| 九九热这里只有精品31| 密桃激情五月天综合网| 五月天成人在线精品| 五月丁香日本在线视频观看| 久久在线大香蕉| 婷婷趴趴| 五月丁香激情综合六月涩涩爱| 久久婷婷桃花五月天| 久久九九一區| 另类图片五月激情| 婷婷六月久久| 欧美日韩五月婷婷| 色婷在线视频| 五月婷婷色啪| www.五月婷婷久久.com| 成人无码髙潮喷水A片| 色情综合| 天天射天天插天天干| 风流少妇A片一区二区蜜桃| 国产AV一区二区三区日韩| 男妓跪趴把舌头伸进我的嘴巴| 国产日产亚洲系列最新 | 国产Va视频| 亚州激情在线视频| 伊人综合网4| 人人人舔人人人操人人人摸人人人97| 色婷婷裸体色性在线| 丁香五月六月婷婷殴美综合| 五月婷婷五月天| 4399人妻无码久久久| 久操人妻| 大陆极品少妇内射AAAAAA| 亚洲字幕AV一区二区三区四区| 热91久| 99热久久日本| 91vip在线观看| 婷婷丁香五月天哟啪| 五月色情婷婷开心五月色情| 激情综合亚洲色婷婷五月| 伊人国产婷婷五月天| 婷婷激情社区| 中文字幕av在线播放| 色99视频| 九九在线精点品| 亚洲色无码A片一区二区麻豆| AA片在线观看视频在线播放| 雪千夏麻豆| 玖玖婷婷婷丁香五月| 国产熟女大叫受不了| 五月婷婷大香蕉| 五月综亚洲| 九九在线精点品| 狠狠狠狠狠狠狠狠| 欧洲MV日韩MV国产| 98永久精品| a色色色色色| 激情 婷婷 插| 五月婷婷激情| 国产毛片欧美毛片久久久| 九九精品丁香花| 久久综合干| 五月天色婷婷小说| 开心五月色婷婷综合开心网| 日韩成人电影在线播放| 色吧综合网| 国产99久| 久久久久激情| 26uuu国产精品| 六月丁香婷婷综合狠狠爱夜夜爱| 丁香五月av| av网站免费在线| 亚洲妇女熟BBW| 91人无码久久久久久| 久久婷婷亚洲| 夜夜操,天天撸| 久久九九99| av首页在线| 婷色五月| 九九人人看| 丁香六月婷婷综合麻豆| 色五月婷婷五月天| 无码少妇高潮喷水A片免费| 91pornav在线| 五月情婷婷五月| 色婷久久| 依人大香蕉在钱1| 五月婷色色| 精品九九视频在线观看| 欧美精品999| 五月婷婷 婷婷五月 一区二区 久久久| 91avse| 夜丁香五月婷婷| 久热九九| 色五月综合在线| 亚城区在线| 天天天天操| www.久久久.com| 五月天伊人综合| 无遮羞AV| 五月丁香六月激情综合网| 丁香婷婷深情五月亚洲| 操大屄五月天视频| 亚洲无码成人网| 成人丁香五月天Av| www.cao.com久久| 蜘蛛女免费观看完整版高清电影 | 五月天天丁香婷婷在线中| 九九成人视频| 丁香五月瑟瑟| 五月天色婷婷小说| 婷婷狠狠干| 91婷婷色| www.minyis.com【JT】实力收量可预付QQ2101460746 | 97久久香草精品视频| 99久热在线精品| 伦乱人妻| 丁香五月综合在线观看| 超碰v| 啪啪丁香五月| 99视频在线精品| 级人人91| 日日夜夜噜噜爽爽| 成人无码髙潮喷水A片| 超碰在线观看成人视| 狠狠干五月丁香综合网| 最近中文字幕2019视频1| 色黑鬼导航| 婷婷综合激情| 久99久在线| 色综合com| 91免费看片| 色丁香五月天| 亚洲va综合va国产va中文| 微拍92| 五月婷婷啪啪网| 无码少妇高潮喷水A片免费| 狠狠色性| 粉嫩AV久久一区二区三区| 狠狠色婷婷7| www激情| 欧美成性色| 丁香六月婷婷综合| 色五月之第四色| 日本一级一级一级一级| 伊人春天av| www.91久久| 六月丁香婷婷亚洲中文玖玖| 日日夜夜狠狠| 99热色无码| 狠狠操狠狠操| 性爱先锋AV| av国产精品| 激情五月网站| 影音先锋男人AV资源站| 丁香五月婷婷色| 9久热在线视频| 激情开心五月天| 2017人人操| 激情五月六月婷婷| 激情丁香婷婷六月天| 亚洲激情在线| 丁香五月婷婷乱| 午夜成人av在线| 丁香六月婷婷综合缴| 亚洲人人操| 亚洲AV人人操| 91精品电影18T| 亚洲无AV在线中文字幕| 快色t v在线入口| 婷婷五月超碰| 婷婷五月天在线观看| 先锋五月婷婷丁香草草| 天天做天天爽| 俺去也在线www色官网| 亚洲国产成人AV在线| 日日夜夜小色哥| 成人网站av免费网站推荐| 色婷婷久久综合| 色五月丁香激情视频| 97日本操| 快色t v在线入口| 在线资源av-超碰中文在线-成人AV| 亚韩在线视频| 狠狠va| 九九色网| 婷婷狠狠色| 97久久精品| 97五月天| 五月婷婷av| 色欲天天综合网| 久久婷婷五月天激情新地址| 操操操Av| 天天爽夜夜爽夜夜爽精品| 婷婷在线日韩综合| 91九色国产| 狠狠久久婷五月综合色| 青青草原伊人网| 色婷婷六月激情| 涩婷婷视频快播人妻| 黄色AV日韩| 色爱终和网| 久99久在线| 99ri网站在线观看| 日韩人妻无码精品| 久久视频九九视频| 久青操| 久久精彩免费视频| 天天日,天天射,天天舔| 久久ww| 婷婷五月欧美AA片免费| 婷婷激情五月| 婷婷丁香五月在线播放| 亚洲小视频免费播放| 五月天综合色| 丁香五月综合| 狠狠色综合精品视频在线| 婷婷久久午夜网| 亚洲视频码| 99热这里有精品| www.日本91| 快色t v在线入口| 亚洲午夜AV| 免费观看欧美成人AA片爱我多深 | 久婷婷久草| 丁香五月色五月| 九九一区| 欧美视频在线观看噜噜| 丁香狠狠色婷婷| 婷婷九月久久| 亚洲 在线 性爱 | 五月婷婷激情| 中文字幕成人影视| 天天综合色丁香| 天天婷婷综合亚洲亚洲| 久久一操| 99久在线精品99re8| 午夜天天精品视频| 6080av| 亚洲精品久久久久AV无码| 久一这里有精品国产| 丁香婷婷影院| 久久亚洲网| 日本va欧美va国产激情| 深爱五月月天| www.99在线| 狠狠色丁婷婷日日,伊人激情综合网| 人人爽天天爽| 无码A片一区二区免费| 综合伊人久久| 成人综合视频在线| 色五月首页| 人妻操逼视频。| 亚洲午夜AV| 99 频99热国里只有精品| 免费视频WWW在线观看网站| 婷婷丁香五| 久久人人添人人爽添人人片αV| 这里只精品热在线18| 人妻体体内射精一区二区| 丁香五月天综合网| 日噜噜色| 99在线免费视频| 啊v视频在线观看| 99精品免费| 99在线视频在线观看| 日韩啪图| 热99精品视频五月| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 依人大香蕉| sS丁香五月婷婷| 天天综合网~91| 色色色色网| 国产在线视频1234| 日韩一级片| 婷婷五月天无码视频| 丁香五月天日韩无码| 播五月丁香三月婷婷| 丁香五月婷婷狠狠色| 少妇真实被内射视频三四区| 欧美日韩一区二区三区四区| 人人性久久| 无码激情AAAAA片-区区| 99综合免费视频| 婷婷五月天激情小说| 99热婷婷| 日韩aaa| 91操碰| 日本丰满久久| 9精品在线| 色就是色婷婷五月亚洲激情| av在线播放网站| 99性爱| 天天日人人| 五月丿香啪啪| 亚洲精品又粗又大又爽A片| 五月丁香婷婷三级| 色婷婷黄色网络| 日韩欧美成人网| 婷婷五月天亚洲| AV天堂婷婷五月天| 日韩啪啪视频| 色婷婷AV久久| 九九色精品| 日日.c| 五月婷婷综合网在线播放| 人人操碰| 国外亚洲成AV人片在线观看| 来吧亚洲综合网| 激情丰满熟妇五月| 丁香五月AV| 99热亚洲只有色| 99热6精品| 类似婷婷激情综合网站| 99热无码精品| 91精品国产99久久久久久天美| 成人国产欧美大片一区| 超碰成人免费| 79色色| 亚洲综合色丁香五月天| 五月丁香无码| 五月花激情网| www.色五月| 天天综合精品| 色五月偷偷| 天天久综合| 婷婷五日b| 丁香婷婷久久| 天天肏高清在线| 99久久終合| 成人国产欧美大片一区| 深爱激情综合网| 99∨VTV| 天天天久久人人人合| 五月激情综合激情五月| 色性综合| 日本一级一片免费视频| 99视频在线观看视频| 香蕉97碰碰碰欧美| 成人精品视频99在线观看免费| 五月丁香激情婷婷| 少妇搡BBBB搡BBB搡毛茸茸 | 五月婷在线视频免费播放| www.天天干.com| 性爱动图国产麻豆一区二区三区| www91精品| 9久久久| 五月婷婷先锋| 红桃91人妻爽人妻爽| 国产偷人爽久久久久久老妇APP | 色播五月婷婷五月| 丁香五月婷婷俺也要去| 激情五月天综合图片小说网站| 夜夜爽天天| 九九热在线观看6| 久久精彩综合视频| www.五月天色色.com| www.91.com黄| 丁香久久五月婷综合| 色婷婷天堂| 色色999三级片| 色五月婷婷成人| 色情五月婷婷| 三级三久久线久久99久目本WW| 日韩精品一品二区三区的使用体验| 97色色色色色| 欧洲激情精品婷婷| 激情五月天伊人影院| 能直接看的av网站| 五月天精品视频| 天天操婷婷| 天天干天天插| 97色片| www.天天干| 久久人人九| 日本色道视频网站| 99热精品中文字幕| 人妻丰满精品一区二区A片| www.99热| 久久免费高| 超碰自拍天堂| 手机旧版看人妻1025| 久久99激情| 婷婷激情五月吧| 激情精品久久| 丁香综合网| 精品无码色欲AV| 亚洲五月天婷婷在线| 五月婷婷六月丁香五月| 亚洲AV网址| 久久激情五月| 久久97久久99久久综合欧美| 91在线观看www| 99热天堂| 久久黄色免费视频| 精品一区二区三区木瓜| 天天综合网站| 亚洲免费看片| 久久精品一区二区三区四区| 婷婷久久在线| 91九色精品女同系列| 五月花成人网| 五月丁香六月婷婷的女人| 美女网黄| 人妻丰满精品一区二区A片| 欲求不满的人妻| 色婷婷久久综合久色综| 深爱激情四射| 五月婷婷丁香社区| 五月丁香婷婷六月| 丁香五月婷婷五月基地| 久99在线视频| renre人人操国产超碰在线| 丁香婷婷五月天色播| 26uuu四色| 开心综合激情综合| 五月婷婷综合网| 嫩草AV久久伊人妇女超级A| 中文字幕无码人妻少妇免费视频| 色婷婷丁香六月| 婷婷深爱五月| 久热这里只精品| 色婷五月天| 人人综合久| 丁香婷婷网| 97碰久久| 99热8| a色色片| 97色色视频| 五月久久五月激情| 在线观看中文字幕| 激情六| 日本久久精品| 色综合久久伊伊婷婷五月| 欧美交换配乱吟粗大25P| 五月天婷婷在看| 婷婷成人五月天| 婷婷丁香五月久久| 九月激情婷婷丁香| 99视频热| 婷婷伊人綜合| 丁香五月婷婷日本| 久久狠狠干| 久久99精品久久只有精品| 操碰91| 亚洲乱码日产精品BD| 激情校园 亚洲| 91av视频| 人人爱人人草| 国产综合色婷婷精品久久| 亚洲五月婷婷| 色五月 激情婷婷 综合五月天| 7777国产盗摄农村女人| 五月婷婷黄色视频| 操草草草| 久久人人九| 色色丁香| 国产黄色在线观看| 久久久久人妻中文| Aα在线免费观看| 秋霞性爱AV| 色之综合网| 啪啪日本欧美| 操逼六区| 99在线精品视频免费| 97一区二区| 天天插综合| 九九热AV| 天天激情站| 99re6久热只有精品6在线直播| 色欲久久综合| 日韩免费视频| 激情综合网五月婷婷| 色色日韩| 久久综合66| 伊人久久大香网| 九九激情网| 久久9热综合| 26uuu日韩| 亚洲精品性色| 人妻激情在线| 99re在线视频| 久久五月丁香综合17C| 无码髙清| 亚洲AV成人在线| 五月激情天天干| 婷婷五月天中文字幕.| 欧美A级成人婬片免费看理论| 超碰人人91| 天天爽天天操| 五月亭亭激情综合| 激情五月成年| 五月花婷婷丁香|