欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
色护士综合| 超碰九色| 97干在线观看视频| 日本猛少妇色XXXXX猛叫| www色婷婷久久综合久色| 超碰日韩人妻在线| 狠狠干夜夜干| 激情床戏| 色五月婷婷亚洲| 五月激情视频| 日本WWW九九九| 丁香婷婷社区| 99热网站在线观看| 天堂久久精品| 亚洲精品在线视频| 色色色五月天激情资源| 亚洲精品久久久无码| 婷婷五月天色播| 婷婷,五月天,丁香,第一| 丁香综合日产精品久久| 亚洲另类电影| 色丁香五月天婷婷| 久久精99| 深爱五月婷婷| 天天揷综合网| 五月天激情综合| 久久只有精| 婷婷五月丁香基| 日本色色色| 激情丁香婷婷五月天| 99超碰欧美| 97人人操人人| 久久艹99| 日本色天堂| 五月丁香六月综合激情网| 九九黄色网| 综合 蜜月 婷婷| 99热精品在线| 国产肥白大熟妇BBBB视频| 亚洲婷婷丁香| 一区二区成人电影| 五月丁香久久网| 99热这里只有精品3| www.激情五月天.com| 9l视频自拍9l九色9l成人| 欧美怡红院黄站| 狠狠干夜夜干| 9l视频自拍9l九色成人| 丁香婷婷五月六月久久| 婷婷色五月天在线观看| 日韩九区| 婷婷伊人| 九九99久久精品| 婷婷六月色| 亚洲欧洲国产精品| 婷婷久久五月天| 婷婷丁香在线播放| 天天综合永久| 五月婷婷激情综合视频| 色五月综合在线| 丁香五月色情| 亚州视频九九99| 久久99热这里只有| 婷婷香香五月| 亚洲看av的网站| 免费精品66| 第四色色六月色综合| 91成人品| 99精品视频在线| 九九蜜臀精品| 激情5月婷婷狠狠干| 九热精品| 激情纯色婷婷五月天在线不卡视频| 日韩欧美一道四区中文字幕| 丁香六月婷婷综合| 开心四月婷婷在线色播播| 久久综合丁香五月| 五月天玖玖狠狠色色| 草婷婷在线| 日木狠狠干| 婷婷成人综合| 性生活久久朋友人妻| WWW.99热| 国产操碰| 91丁香色| 人妻操日日| 久9久成人精品视频| 亚洲色色五月天| 色播婷婷五月天| 久热黄色| 丁香综合伊人AV| 伊人AV五月婷| 久久久久er热| 亚洲综合欧美色丁香婷婷888月图片| 成人免费120分钟啪啪| 国产乱妇无乱码大黄AA片| 欧美日韩精品人妻狠狠躁免费视频| 欧美性猛交AAAA片黑人 | 久久久com| 久热免费| 涩婷婷五月天在线精品视频| 99热激情| 激情综合一| 99婷婷| 丰满人妻妇伦又伦精品国产 | 精品色色| 五月丁香亭亭AV女优| 五月天婷婷激情在线色图| 色婷婷五月天偷拍| 婷婷情色五月| 丁香五月天天哦| 91碰碰| 五月天婷婷深深爱| 六月激情综合| 99玖玖视频| 秋霞性爱AV| 天天拍久久| 激情丁香图片| 黄网在线免费观| 九九久久99精品免费观看www| 97色色色视屏| 综合99视频| 97操碰免费视频| 久久久久久久久99精品| 九九视频这里只有精品| 亚洲精品久久久久久久久久吃药| 一区二区免费看| 色99在线看| 国产99精品免费视频| 婷婷久久亚洲| 久久婷婷免费| 插插五月天| www.zbzhongsen.com| 婷婷在线中文字幕| 五月丁香六月在线欧美| 天天透天天爱| 五月婷婷婷| 婷婷久久色五月婷婷久久久| 久久色婷婷| 99热这里只有的精品视| 性爱激情综合网| 九九九九毛片| 97色热| 99久99久| 五月婷丁香亚洲| 欧美色九| 大香线蕉伊人| 激情五月婷黄版| 色色丁香| 日本色婷婷| 99热免费精品| 天天搡日日搡aaaaⅩ| 91人妻人人操| 丁香婷婷色六月| 五月婷婷六月天| 五月丁香精品| 婷婷五月天色| 五月天在线视频尤物视频在线看| 超碰免费人人肏| 五月丁香色婷婷熟女| 少妇水多A片太爽了| 2015好吊操| 欧美精产国品一二三区| 97婷婷狠狠| 天天插天天射| 婷婷五月AV| 五月综合久久| 一區四區歐美日韓| 国产成人精品亚洲线观看| 4399在线日本A片| 丁香六月综合激情| 开心婷婷五月天综合| 99色在线观看视频| 丁香婷婷色五月| 丁香婷婷老司机久操| 先锋资源996| 99熟女| 五月婷婷丁香成人网| 99色在线观看| 欧美三级巜人妻互换| 天天综合情| 人人摸人人| 99久热在线精品| 婷婷色中文字幕| 天天爽夜夜爽夜夜爽精| 婷婷在线视频| 日韩在线aaa| 亚洲人成网站999综合| 久8色色| 99九九免费精品| 色婷婷丁香五月| 五月丁香六月成人| 九九亚洲天堂| 激情久久综合| 天天干com| 玖玖婷婷精品| 午夜69成人做爰视频| 99免费热视频| 五月丁香色情| 精品无码人妻一区| 久久久久久久久久久月丁| 色天五月天在线观看视频| 九九热在线99| 极品人妻VIDEOSSS人妻| 五月婷婷丁香网| 色色日本欧美| 色婷婷狠狠| 热99这里只有精品视频| 五月婷婷九九热| 色5月婷婷色| 新久久五月天激情| 天天色五月婷婷91久久久久久久| √天堂资源在线人妻熟女| 九九九色综合| 五月丁香色停停啪啪啪| 99小视频在线| www.韩日视频| 天天久久狠狠色综合| 亚洲第一视频 久久| 91精品国产综合久久蜜芽解析速度| 91丨九色丨东北熟女| 中文字幕色色色| 免费无码毛片一区二区A片| 热99热9| 久久99热这里只有精品| 色丁香婷婷| 久久大香蕉视频| 俺去也综合| 五月欧美色色五月| 五月天色色色| 亚洲色综久久五月| 亚洲中字AV电影在线网站| 五月丁香六月婷婷网| 丁香五月天堂网| 美女被操一区二区| www.激情五月| 丁香婷婷性久久| 丁香五月在线视频| 大香蕉狼人久久| 欧美在线视频99| 常久最新免费的色吊丝| 婷婷丁香五月天综合网| 玖玖综合网| 成人婷婷色综合| 婷婷久久亚洲| 这里只有精彩视频| 伊人色欲五月天| www.婷婷六月天| 日韩人妻白浆视频系列| 五月天激情四射| 色七七色九九| anquye五月| 99热自拍| 婷婷午夜精品久久久| 激情五月丁香综合网站| 五月婷无码| 任你操精品免费| 超碰色碰碰| 婷婷丁香十月| 九九99免费视频| 五月婷婷六月综合| 人妻VideOssS人妻高清| 99只有这里是精品| 五月丁香婷色| 久月丁香爱婷婷综合| 丁香六月婷婷综合啪啪| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 激情六月婷婷| 九色激情网| 665566 无码| 婷婷五月综合激情| 婷婷在线精品| 天天综合在线网| 日本久久精品18| 亚洲欧美999| 五月丁香网站在线播放| 天天摸天天舔天天爽| 色九网| A级毛片高清免费不卡播放谢谢谢谢| 怎么样可以看免费的一级av| WWW.久久.COM| 国产精产国品一二三在观看| 色色热| 色99视频| 99久久9| 国产99热| 99re这里只有| 欧美性生交XXXXX无码小说| 99热精品在线| 99热99网| 同性gv国产精品一区二区| 日本熟妇精品99| 色婷婷五月天偷拍| 国产91视频| 午夜亚洲国产精品av一区二区| 99超碰人人| 五月丁香A∨在线| 九一娱乐在线观看视频| 91亚洲免费片| 淫视馆AV在线| 在线视频色五月| 99精品视频免费在线播放| 六月丁香婷婷五月天| 婷婷色播婷婷| 99久久a线观| 精品一区二区三区四区五区六区介绍| 99热这里只有精品69| 欧美综合在线五月天色婷婷| 日本五月天一页| 99九九精品| 婷婷涩涩五月天| 亚洲色爱综合| 大香蕉网站,大香蕉综合| 久久 婷婷 五月天| 91色久| 极品少妇XXXX精品少妇偷拍| 婷婷五月综合中文字幕| 六月婷婷香蕉| 99视频| 久久久久久久91| ZpRSw| 色色色五月| 97久人人| 欧美激情Va| 精品三区影院| 亚洲99综合| 五月丁香六月激情欧美综合| 精品久久久中文字幕大豆网推荐理由| 婷婷之玖玖| 日韩啪| 亚洲99激情| 色婷婷九月综合| 九色啦蜜臀| 久热久| 色婷婷电影网| 久久综合播放| 婷婷成人综合免费视频| 久久综合五月天| 泰州成人视频| 五月天色欧美| 婷婷五月花免费视频在线| 求可以看的AV网址| 丁香九月激情| 久久综合香蕉国产国产蜜臀AV| 婷婷在线综合| 久久色五月天综合网| 操九色| 欧美性猛交 XXXX 乱大交| 亚洲182在线观看| 91精品91久久久中77777久久玖玖九九| 九九成人精品免费视频| 久久这里有精品| 九月丁香婷婷| 97人人操在线| 天天天天天天操| 这里只有精品视频在线| 97操碰碰无码视频| 婷婷欧美激情| 日韩一区二区A片免费观看| 丁香五月大香蕉AV| 五月花婷婷丁香| 99热国产这里只有精品| 亚洲午夜一区二区| 日撸夜撸日操| 国产成人精品一区二区三区视频| 99综合视频一体| 欧美婷婷综合| 任你弄在线视频免费| 99综合| 国产激情综合五月久久| 七月丁香五月婷婷在线| 99惹| 天天插天天插天天插天天插 | 另类精品视频在线观看| 99久久五月婷婷| 亚洲精品乱码久久久久99| 免费观看的av| 狠狠综合久久综合| 五月婷婷激情中心| 99国产精品白浆在线观看免费| 五月玖玖| 夜夜久久综合网| 婷婷五月综合中文字幕| 五月丁香六月色婷婷| 超碰97人人操| 激情五月视频在线婷婷| 99精品偷自拍| 99精品视频推荐| 99色啊| 色久影院| 激情综合网激情五月婷婷| 精品久色| 91九色精品熟女内射| 夜色.cnm| 深情五月天| 青青草国产亚洲精品久久| 久久精品9| 激情婷婷啪啪| 婷婷免费视频| 五月丁香欧美在线| 丁香五月五月婷婷欧美大香蕉| 婷婷91| 丁香六月狠狠干| www.韩日视频| www.色擼擼.com| 九九黄色网| 综合色图区| 婷婷五月天av| 97热九九| 超碰激情网| 五月婷婷九| 五月婷婷免费看| AV网在线| 婷婷五月天成人综合网| 五月婷婷婷色| 婷婷五月激情五月激情| 91猫咪国产在线播放| 五月色丁香国产在线视频| 噼里啪啦完整版中文在线观看| 婷婷久久综合久| 91久久| 成人精品人妻| 五月丁香久久精品在线观看| 天天综合精品| 综合色影| 欧美丁香五月| 久操97| 五月天婷婷青青草| 亚洲乱码日产精品BD| henhencao国产在线| 久久这里只精品| 老司机午夜福利视频金瓶梅| 夜夜穞天天穞狠狠穞AV美女按摩| 色婷婷综合中心| 色噜噜狠狠色综无码久久合欧美| 我爱va亚洲va52| 青青草伊人婷婷| 岛国av电影网站| ww超碰在线| www.五月丁香| 中文字幕九九九九| 丁香激情网| 五月天成人在线视频丁香| 色婷婷激情| 五月永久激情| 欧美色偷偷大香| 97碰碰在线观看视频| 亚洲激情综| 激情综合网五月激情| 婷婷五月综合欧美在线播放| 影音先锋 萱萱| 色色亚洲五月天| 九九这里是免费的视频5| 九色视频91疯狂| 操人91| 色婷婷五月天亚洲 | 婷婷综合色网| 99九九视频| 婷婷五月开心中文字幕在线| 99精品偷拍视频| 日本视频99| 五月天三级久久| 日日干天天| 狠婷婷五月| 香蕉97碰碰碰超视精品| 99精品久久| 我要看激情五月天| 激情啪啪五月| 免费观看全黄做爰的视频 | 亚洲欧洲中文日韩久久AV乱码| 久久综合丁香激情五月| 色色色色综合网| 五月天激情小说网| 99热这里只有精品最新| 色综合久久88色综合天天99| 国产性av| 狠狠色婷婷777| 激情美女五月天激情在线| 99热69| 六月婷婷开心| 五月花婷婷| 久热这里这里有精品| 99久久婷婷综合| 久久99婷婷| 婷婷五月天亚洲综合| 国产操B视频| 麻豆WWWCOM内射软件| 岛国AV网| 五月丁香久久久日婷婷久久婷婷日| 久久五月热| 激情亚洲网| 久久六月综合| 天插天啪天啪天啪| 99操视频| www.9797国产| 日韩av免费版| 色色婷婷五月天| 亚洲激情97五月天| 翔田千里无码| 综合五月草| 久久女人天堂| 亚洲熟妇AV综合网五月丁香伊人 | 在线色五月婷婷| 色色色综合色| 久久精品噜噜噜成人A∨色欲| 五月婷婷成人| 日本三级日本三级99| 久 久9 9 热 视 频| 婷婷 久综合| 激情五婷网| 丁香五月天婷婷大香蕉| 五月婷婷视频| 亚洲AV人人操| 五月婷婷色综图片| 五月丁香婷婷综合| 开心五月天激情网站| 就爱干 在线| 日本99热| 九九热九九| 操九色| 欧美碰碰| 五月婷av| 涩 五月 婷婷 狠狠| 97亚洲视频在线| 丁香五月天啪啪| 99re免费精品视频| 97色婷| 国产色网站| 五月天综合网| 在线观看免费狠狠色丁香香综合| 人人干av| 熟女激情五月天| 99热这| 亚州性爱99| 99视频这里只有久久精品| 激情文学 综合 色| 亚洲小视频免费看| 天天狠天天狠| 亚洲欧洲色色| 狠狠操在线视频| 色色婷五月天| 百度一下国产精品A| 免费无码毛片一区二区A片| 九九热在线精品| 丁香五月天激情网| 日韩在线一级| 在线看片av| 欧美婷婷日本| 99久久综合| 丁香色情五月天| 五月天快乐开心激情网| 综合激情网五月激情| 国产精品操| 香蕉婷婷| 干婷婷五月天| 99精品爱| 久久精彩视频| 久/久精品99看9| 亚洲热视频在线| 五月婷婷综合网| 国产精产国品一二三在观看| 色欧美色色色| 久久久A级视频| 色五月激情综合| 天天干,天天舔| 美女久久婷婷| 4438成人电影| 五月色综合| 人人爱干人人爱草| 国产成人+亚洲+欧洲| 丁香五月婷婷影院| 国产色网站| 99免费| 免费无码毛片一区二区A片| 亚洲乱码日产精品BD| 综合激情四射一theav| 99ri视频在线播放| 性色欲情 网站| 久久这里99| 99热首页| 色噜噜伊人| 色婷婷丁香特级性爱视频| 九热视频| 欧美日韩成人在线| 天天日中文| 久久天堂网| 99r久久这里只有精品| 婷婷五月免费在线| 性生活视频98791| 久热大香蕉| 中文字幕综合色| 国产亚洲在线观看| 岛国av电影网站| 大香蕉久久婷婷| 欧美交换配乱吟粗大25P| 久操乱| 五月停停999| 深爱五月中文字幕| 超碰在线综合| 天堂成人A片永久免费网站| 国产精品岛国片在线观看免费| 99热在线播放| 天天久| 丁香六月婷| 激情骚五月| 欧美成性色| 婷婷综合激情| 曰韩少妇内射免费播放| 丁香六月婷婷综合欧美| 久久这里只有欧美| 狠狠干狠狠干| 天堂爱啪啪| 日本在线噜噜| 99热在这里只有精品| 大香蕉丁香婷婷| 99热视| www.婷婷,com| 超碰2021| 伊人丁香花综合影院| 五月丁香婷婷中文| 97碰精品| 五月丁香在线视频观看| 成人免费在线电影| 五月黄色婷婷| 综合在线丁香五月| 思思热在线精品视频| 亚洲Av成人在线观看| 亚洲丁香五月深爱五月| 婷婷五月综合在线| www.综合久久.com| 久久视频在线| 亚洲精品字幕| 天天 青草 制服丝袜 在线| 五月婷婷激情网| 日本综合九九| 色婷婷丁香特级性爱视频| 丁香婷婷色五月| 94干大香蕉| 丁香成人视频| 9视频在线成人网站| 久久婷婷成人视频| 色婷婷六月| 亚洲最大在线| 狠狠色丁香婷婷久久综合| 欧美A片在线视频免费观看| 99热这里只有精品亚洲| 99热在线播放| 天天综合久久| 天天插天天插天天插天天插| 99ri在线视频| 91久久久久久久久| 99riAv1国产在线观看| 婷婷色五月婷| 伊人五月婷婷国产视频| 激情婷婷啪啪| 五月丁香人妻| 丁香五月偷拍| www综合久久| 色停停五月天| 微拍92| 日本五月婷| 久9热在线免费观看| 欧美性色五月天| 伊人99久久| 丁香五月综合在线播放| 五月丁香婷婷钟和色图| 六月 丁香 视频| 国产三级在线播放| 日夜夜天天| 五月做爱| 久久久免费精彩视频| 天堂五月婷婷| 99热新网址| 丁香六月婷婷久久高清| 国产成人99久久亚洲综合精品| 激情婷婷丁香五月天| 婷婷五月激情欧美| 色色精品色| 五月天激情四射| 成人在线精品| 精品一二三区久久AAA片| 五月开心六月婷婷在线播放网站| 丁香五月婷婷激情97| 五月丁香花开综合网| 在线不卡AC| 美欧成人视频| 日本99热| 人与禽A片啪啪| 99热的无码| 9热久久在线| 久久草大香蕉| 日日干夜夜撸夜夜骑| 九九爱激情| 热99在线精品| 丁香婷婷综合精品六月初| 精品夜夜澡人妻无码AV| 天天久综合| 大香蕉人在线65| 亚洲操操操| 夜夜骑福利资源| 一本色道久久综合狠狠躁小说| 九九黄色网| 亚洲综合干| 天天综合网色欲香| 色吧五月婷婷| 六月婷婷七月丁香| 色99在线看| 欧美激情综合色综合啪啪五月| 九九草热在线观看| 色天使色婷婷| 国产亚洲精品久久久久久郑州| 五月综合色播播丁香婷婷| 丁香色综合| 白人荫道BBWBBB大荫道| 久婷五月| 色婷婷五月天天天天天天天天天| 狠狠综合久久综合| 97人人操人人干| 色吧五月婷婷| 五月天婷五月天综合网在线观| 久超免费视频| 日日噜噜夜夜狠狠久久丁香五月| 五月六月伦理| 亚洲激情无码久久| 大香蕉久久草| 不卡的AV网站| 久久伊人大香蕉| 久久婷婷六月综合| 狠狠看狠狠| 久久99看免费| 中国女人内射6XXXXX| 99热只有| 国产,欧美,日韩,性爱| 啊V视频在线观看| 3DAV亚洲香蕉久久 一区二区| 色色色色色色色色综合网| 五月丁香婷婷激情澎湃四射| 无码一区二区日韩| 久久久A级视频| 极品人妻VIDEOSSS人妻| av在线资源| 五月婷婷六月丁香在线视频| 婷婷色播六月无码| 婷婷九九| 综合 蜜月 婷婷| 九九热123| 成人丁香五月| 精品久久9| 色五月综合在线| 五月丁六月香av| 97性视频| 午夜电影网VA内射| 婷婷五月天堂| 丁香五月网| 9热成人在线视频| 深爱五月激情五月| 欧洲亚洲免费视频9| 五月开行婷婷色五月| 婷婷五月天.com| 超碰超碰在线| 六月婷婷视频| 97人妻人人| 久草丁香婷婷1024| 荫道BBWBBB高潮潮喷| 亚洲操b| 四月婷婷五月丁香| 美女丁香五婷婷| 五月丁香亚洲综合网| 玖玖在线资源视频| 婷婷八月激情| 精品婷婷| 伊人激情| 久9视频| 日韩无码专区| 综合久久9| 丁香五月婷婷高清| 日本久久极品| 婷婷丁香综合色AV| 欧美激情-区二区三区| 色欲色欲久久宗合网| 激情久久伊人| 91色婷婷综合久久中文字幕二区| 久热伊人| 色色色色色色色色网站| 精品人妻一区| 亚洲综合五月天| 色婷婷五月天在线观看| 99热这里只有精品3| 成人AV在线网站| 99re思思热久久| 99性视频| 超碰在线99| 99re在线观看| 天天碰夜夜操| www.久99| 在线观看日韩12345区| 亚洲电影中文字幕| 亚洲欧洲小视频9| 亚洲自拍天堂| 色五月天堂| 啪啪啪大香蕉| 五月婷婷成人w| 99成人无码| 五月丁香综合在线| 99综合网| 五月婷婷,六月丁香| 五月婷婷开心网| 97人人干| 丁香五月婷婷高清| 小色小蛇伊人婷婷色香五月| 97人人操人人爽| 色婷婷五月天亚洲 | 9色在线| 夜夜干天天操| 久久久久久久久月丁| 91女人18毛片水多国产| 久久久jd| 天搞天天天天天| 五月丁香狠狠爱婷婷综合| 丁香五月天欧美在线| 亚洲成人噜噜| 超碰99在线观看| 91热久久| 97精品综合久久| 青青久久五月天丁香婷婷| 激情五月婷婷她| 激情综合网五月婷婷| site:wpjngj.com| 在线A色| 五月天丁香成人社| 五月天婷婷综合网| 97超级碰碰碰久久久| 久人操| 丁香激惜男女| 色五月丁香五月婷婷五月成人网| 婷婷五月丁香五月| 丰满人妻一区二区三区| 丁香婷婷综合影院| 91丨九色丨熟女高潮| 五月丁香婷婷综合激情基地| 人妻久久人妻久久第一区| 久久久婷婷| 日韩青青| www久久99| AV天堂婷婷五月天| 99自拍视频在线观看| 国产精品久久久久久久久久| 亚洲99在线| 久久这里只有精品07| 色色色热| 丁香婷婷综合激情五月色| 丁香五月 无码| 五月丁香怕怕综合| 色播播五月| 亚洲精品久久久无码| 色99www.| 色欲日日躁| 亚欧州精品视频| 日本91在线播放| 久操人妻| 五月婷伊人| 天天搡日日搡aaaaⅩ| 性按摩玩人妻HD中文字幕| 日韩色五月| 狠狠色 综合色区| 日本婷婷综合精品| 99综合网| 亚洲午夜国产成人电影VA国产欧…| 另类激情综合| 丁香久久久| EEUSS鲁片一区二区三区| 最新日韩久热免费视频看看| 内射丰满人妻| 婷婷色导航| 超碰高清在线| 99热这里只有精品13| 五月婷婷无码| 91jiuseshunv| 国色天香伊人狠狠色| 超碰免费在线| 人人97碰| 草综合14| 国产99热| 99热国产| 五月天婷婷色| 啪啪色激情五月天| 99色丁香婷婷综合网| 久久人人妻| 视频一二区| 国产在这里只有精品| 国产免费性爱| 五月青青草综合| 99热地址| 丁香五月天导航| 99九九视频精彩在线| 亚洲乱码日产精品BD| 色综合爽| 99热这里只有精品2| 色吧五月婷婷| 丁香五月激情网| 日韩伊人大香蕉| 深爱五月日韩| 亚洲热综合| 超碰操日| 天天天天天天天操| 午夜不卡久久精品无码免费| 色必久悠悠影院| 色婷婷丁香五月| 激情六月婷婷| 51XX午夜影福利| 人伦30P| 99热99网| 精品人妻在线| 五月婷婷婷| 丁香五月在线| 91xxxx九色| 丁香五月激情啪啪| 久久青青日本视频| 色婷五月天激情| 亚洲人人艹| 色婷婷精品| 热996精品在线观看| 深爱激情丁香| 婷婷涩涩五月天| 久草视频一,二三四| 亚洲在线综合| 大香蕉综合| 色婷婷婷av| 依人大香蕉| 成人五月天婷婷| 五月丁香婷婷综合| 日韩操逼大片| www.夜夜操.com| 丁香婷婷五月天网站| 色五月网址| 天天在线天天综合网色| 天天狠狠综合精区| 久草xx性爱视频| 99九九热视频免费| 人人草人人舔| 久久久婷| 激情综合五月| 婷婷伊人五月| 色五婷婷在线视频| 丁香六月婷婷综合激情欧美| 草草视频91| 丁香婷婷综合五月天| 粉嫩AV久久一区二区三区| 五月天婷婷视频30| 天啪色| 色色操| 99热成人精品| 日韩精品在线观看9| 天天日夜夜曹| 六月婷婷色综合| 狠狠精品干练久久久无码中文字幕| 色欲资源网| 色色色天堂网| 五月综合无码| 五月婷婷在线网站| 色婷婷成人久久| 九九热大香蕉| 日韩一66精品| 色九月丁香婷婷蜜桃在线观看| 婷婷在线播放| 人妻自慰在线| 丁香五月熟女| 丁香六月色婷婷| 森林影视大全,最好看的2019年视频 | 五月天久久丁香| 99a级片| 99久久综合网| 狠色色狠网| 五月色丁香| 97爱艹婷婷开心丁香激情综合| 婷婷无码五月天| 六月丁香婷婷综合色播| 五月天婷婷丁香成人网| 亚洲啪啪视频| 五月天激情Av| 国产精品社区| 日本不卡高字幕在线2019| 中文字幕成人影视| 免费的日逼视频| 中文字幕网站在线观看| 99热官网| 可以看的av| 一夜福利不卡| 久久九九中文字幕| 色五月激情五月| 国产性爱一级| 91婷婷五月天综合视频| 色丁香五月天| 91夫妻网站九色| 五月色婷婷综合| 玖玖资源站蜜臀| 这里只有精品视频222| 97热超碰| 亚洲另类在线观看| 亚洲网站999| 五月丁花色综合网| 97色婷| 9色免费网| 国产黄大片在线观看画质优化| 婷婷色在线视频| 久久久久久五月天| 永久的网站AAAA | www.婷婷.com| 五月婷婷视频啪啪美女| 超碰超碰在线| 亚洲激情Av| 久久久国产精品黄毛片| 影音先锋一区| 丁香五月六月综合激情| 久久丝丝热| 激情99| 亚洲AV永久无码影院黑人| 图片区 小说区 区 亚洲五月 | 先锋资源 996| 婷婷日在线观看| 婷婷五月丁香超碰| 丁香五月天堂亚洲社区| 色色色热| 夜夜骑夜夜操| 欧美性爱中文字幕| 午夜成人AV在线| 色五月婷婷内射| 狠狠人妻色综合| 中文字幕91,综合| 男女啪啪做爰高潮无遮挡| 五月激情网站| 天天天干夜夜夜操| 五月婷婷影视| 天天插天天日天天爽| 激情小说五月天中文字幕| 高清无码入口| 十一月婷婷激情四射| 日本婷久久| 国产熟女一区二区三区五月婷| 婷婷五月成人有| 国产精品丝| 五月天丁香啪啪啪啪| 国产精品91抖高| 五月激情在线| 亚洲视频99| 色五月六月| 91超碰在线观看| 亚洲激情婷婷| 婷婷五月天在婷| 狠狠操在线视频| xxx综合在线| 99r久久这里只有精品| 性爱动图国产麻豆一区二区三区| 五月丁香色| 丁香色色网| 影音先锋一区二区三区| 久久色情| 久久性爱视频| 一级片sese片.COM| 开心婷婷五月激情网小说| 99热r| 久久婷婷五月天| 亭亭五月丁香综合欧美| 婷婷五月天激情四射五月天激情| 69精品人人人人| 婷婷久久婷婷色五月| eeuus五月婷| 丁香六月色情| 五月婷导航| a久久免费视频| 亚洲成人五月天| 夜夜干天天操| 玖玖综合色| 婷婷五月丁香基地| 婷婷五月天AV| 五月丁香六月欧美| 午夜激情五月| 五月久久婷婷成人网| 99精彩视频| 丁香九月婷| 久久人人妻| 国精产品一区一区三区免费视频| 激情五月婷婷| 亚洲精品白浆高清久久久久久| 色吧网91| 五月丁香最新| 美女黄频aⅴ视频| 五月丁香啪啪啪| 日日夜夜青青草| 国产精品色婷婷AV综合色色| 夜夜躁爽日日| 激情五月婷婷综合| 色丁香久久| 激情五月婷婷丁香综合网| 大香网伊人久久综合| 卡视频1区2区| 9久久网| 亚洲成人AV在线观看| 五月丁香六月激情综合网| 天天干天天 亚洲| 99视频这里有精品免费观看| 天天干天天做| 色噜噜婷婷| 日韩三十六页| 殴美激情综合网| 包操45分钟网站| 伊人AV五月婷| 大香蕉中文| 国产精品18久久久| 影音先锋综合网| 日本精品99| 亚洲、热| 五月婷婷导航| 被强行糟蹋的女人A片| 五月婷婷97| 丁香五月色情| 婷婷伊人久久| www.97干视频| 成人午夜无码视频| 婷婷五月天色网久| 色五月婷婷少妇人妻| 天天婷婷| 色九月婷婷| 婷婷综合伊人| 婷婷五月天天天日日夜夜| 国精产品久久| 五月婷婷六月丁香综合在线| 精品99*| 久久综合干| 成人综合伍月天| 色婷婷影院| 久久伊人婷| 婷婷五月开心中文字幕色| 激情五月丁香婷婷| 性生生活大片又黄又| 3p久久| 五月丁香亚洲综合网| 激情五月天视频| 碰99在线| 激情小说五月丁香在线视频观看视频| 婷婷五月天堂一本在线| 99色综合| 超碰电影在线播放| 欧美日本一区二区三区| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 激情网五夜婷婷| 久久A V无码视频| 99婷婷| 色情开心五月| 久久这里99| 国产午夜一区二区三区| www.五月婷| 丁香色啪综合| 99热在线只有精品| 哇嘎成人久久| 五月婷丁香亚洲| 久色网| 色综合综合色| 九九热视| 精品日本视频444| 丁香五月天在线观看视频| 六月色婷婷| 色综合色综合色综合| 99热这只有| 丁香婷婷色五月| 99热999| 天天谢天天操| 色五月情| 天天搞夜夜爽夜夜爽| AV在线大香蕉| 九九色院| 亚洲综合色棒| 九月丁香婷婷基地| 激情五月天婷婷久久久久久久久久久| 色一情一乱一乱一区91| 国产资源在线视频| 99综合一区| 婷婷五月丁香亚洲| 五月婷婷熟女| 五月综合久久| 色色激情五月天| 五月婷婷丁香色吧网| 三人荫蒂添的好舒服A片| 丁香婷婷色五月| 五月婷婷色白丝| 狠狠操性爱av| 成人无码精品1区2区3区免费看| 97中文在线| 激情丁香婷婷| 日本色色网站| 婷婷五月天视频| 婷综合六月| 成人开心五月天| 久久久九九视频精品18| 婷婷综合六| 淫视馆av三区| 99性爱视频网站| 色综色网| 深爱五月日韩| 99热欲| 天天天天天天天操| 91制片厂久久久国产电影| 亚洲性受XXXX五月丁香| AV人人操| 七七九九色色| 丁香六月啪啪| 久久久久综合激动五月天| 精品夜夜澡人妻无码AV| 六月综和久久| 亚洲99手机免费看视频| 丁香五月婷婷av影院| 亚洲精品小视频| 婷婷五月精品| 夜夜操天天干| 丁香九月激情久久| 99热综合网| 五月停停色| 操日视频| 久99热| 五月天色综合| 操操操www.com| 久久久亚洲精品一区二区三区浴池| 天天色天天爱天天舔| 久久久天堂国产精品女人| 五月婷婷啪啪啪啪| 久久丝袜婷婷| 丁香五月WWW| 精品成人a v无码内射| 久久影视婷婷五月| 碰碰91| 永久无码色| 亚洲日韩一页精品发布| 天天天操天天天日| 日韩无码91| 激情五月综合网| 思思久久96热在精品国产,| 97人碰人操| 丁香婷婷五月综合| 激情文学 综合 色| 精品一区二区三区四区五区六区| 丁香欧美| 色综合中文色综合网| 天天色色天天| 日本性激情色播| 丁香五月婷婷综合91| 综合另类视频| 精品无码人妻一区| 亚洲热久| 五月婷婷婷婷| 久热只有这里精品| 色噜噜狠狠色综合网| 大香蕉久久婷婷| 热无码A∨| 五月婷婷亚洲色图| 婷婷五月18永久免费视频| 婷婷丁香宗合888| 麻豆AV一区二区三区| 天天干肏夜夜| 九热免费视频| 国产日韩精品SUV| 这里只精品热在线18| 久久婷婷五月综合色奶水99啪| 婷婷在线播放| 看片视频在线免费日产在线看| 开心五月激情网| AV大片在线观看|