欧美成人午夜精品久久久,国产?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
返回資訊列表
情色五月天网站| 国产精品电影| 亚洲综合99| 先锋资源婷婷| 婷婷精品综合| 亚洲日日日| 九一娱乐在线观看视频| 操久久网| 欧美黄色一级| 五月天婷婷激情在线色图| 久久婷婷人人| 国语对白性爱视频播放| 久久精品亚洲热| 中国激情网| 丁香五月婷婷激情中文| 色色亚洲五月天| 成人中文网| 玖玖在线资源视频| 婷婷伊人綜合中文字幕| 九九99精品视频| 九九九日本熟女| 九九成年视频| 久久国产成人9999久久久久| 丁香五月大香蕉在线99| 美女久久婷婷| 五月停视频天堂| 五月丁香综合网| 成人版视频在线观看| wuyuedingxiang| 深爱五月激情| 99亚洲精品视频| 婷婷综合在线| 六月丁香网| 久热这里只有精品在线| 99久久玖玖| 99综合99| 欧美综合激情五月天| 狠狠五月丁香色婷| 丁香婷婷五色月| 色另类五月天| 国产精品久久久60086| 色热久资源| 26UUU欧美激情一区二区| 中文字幕成人日韩| 五月开心久久| 亚洲精品视频在线播放| 中文精品久久久久人妻不| 高清视频一区| 综合五月激情| 狠狠综合久久综合| 99精品久久久久久久| 婷婷丁香五月激情密臀av| 日韩AV免费| 欧美六月婷婷| 久久久激情视频| 久99热在线观看| av最新在线| 97人操人免费视频| 麻豆科斗777| 国产伦理精品高清在线观看网站一区二区 | 激情综合视频| 人人操人人看97干| 97碰碰人人| 色婷婷电影网| 伊人午夜综合色啪| 色一区高清| AV色五月婷婷| 骚货艹网站视频| 亚洲另类噜噜| www.超碰| 婷婷综合九色伊人| 大香蕉九九热| 亚洲色情一区二区三区四区| 538在线精品| 天天日天天插| 亚洲综合激情五月久久| 色婷婷aV四虎| 色10月婷婷视频| Se.婷婷五月天| 成人欧美一区二区三区在线观看| 色色色色综合| 99国产精品白浆在线观看免费| 国产五月视频| 超碰在线人人| 伊人狠狠操| 99综合色色色| 激情五月狠狠| 天天舔天天爽| 久久婷婷六月综合综合| 色波激情五月天| 26UUU精品一区二区c〇m| 九九热视频精品| 五月天天综合| 九色99视频| 欧美性爱一区| 九九久久五月天综合伊人| 噜噜色噜噜网| 欧美搡BBBBB摔BBBBB| 丁香五月婷婷操逼| 亚洲国产色婷婷| 天天操天天日天天爽| 五月丁香婷婷五月| 少妇被下春药玩弄A片| 五月天激情亚洲| 色婷婷a v| 婷婷5月色| 99热在线观看这里只有精品| 亚洲婷婷五月天| 99热九九九九| 狠狠综合久久综合| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 久久婷婷啪啪视频| 婷婷婷五月香蕉| 久久久久这里都是精品| 免费播放片大片| 91综合在线| 久久五月婷婷视频| 99热日韩| 97夫妻超碰| 亚洲综合视频网| 色婷婷丁香AV综合| 91超碰人人操| 久久精品99| 99re这里只有精品在线观看| 亚洲妇女熟BBW| 亚洲色激情| 国产精品A片| 亚洲九区| 色欲av伊人久久大香线蕉影院| 夜夜爽天天日| 五月叮香啪| 97色碰| 91综合网| 深情五月天| 久久婷五月| 色婷久九| 丁香久久久| 大香蕉 婷婷| 99这里有精品久久97| 九九色播五月丁香| 97自拍99| 五月天综合| 丁香六月成人| 丁香婷婷激情网站| 色色色1网址| 99在线看片| 五月丁香激情啪啪| 久久这有这里精品| 日本欧美成人片AAAA| 日韩色色色色色| 九九99热| 婷婷的久久网站| 五月天久久综合婷婷| 婷婷九月丁香中文| 开心激情综合| 色婷婷狠| jiZZdr| 丁香婷婷六月天| 99久在线精品99re8热| 欧美日韩成人h| www.人人操人人看人人想人人摸 人人人人操,COM | 97人凄人人操人人爽| 色五月婷婷在线观看| 婷婷五月天VI| 色五月天在线观看| 丁香五月色五月| 操骚货在线| 伊人超碰在线| 久久婷婷五月天激情| 国产三级在线播放| 好吊操这里只有精品| 久久综合九九| 欧美日韩大黄| 九九色插| 婷婷色在线视频| 另类激情五月| 色婷视频| 婷婷丁香激情| 久久婷婷五月综合成人d啪| 婷婷婷婷婷开心无码播放| 五月婷婷之综合激情在线| 99色 色| 亚洲午夜国产成人电影VA国产欧…| 国产五月婷| 亚洲综合网在线| 五月天狠狠干| 亚洲无线视频| 99热在线播放| 精品久久久人妻| 六月丁香天堂| 天天影院色| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网 | 伊人网碰碰| 九色91国产| 五月丁香婷婷成人网| 久鲁鲁色网| 丁香五月激情五月| 五月丁香六月情| 91免费看片| 热99只有精品| 天天操五月天| 国产av天堂| 五月丁香久久久| 激情超碰网| 9久久久久| 色五月丁香五月五月婷婷| 日本欧美成人片AAAA| 超碰狠狠色| 婷婷久久18| 色五月婷婷综合| 伊人丁香五月| 日本成人综合| 我淫我色婷婷五月天激情四射| 99色色网| 爱草视频在线观看| 伊人网大香| 婷婷五月花| 中文在线视频久1| 九九九热精品| 丁香五月婷婷香| 噜综合| 婷婷丁香熟女| 99色视频| 五月天婷婷视频小说| 五月婷色| 97人人爱人人操| www.婷婷| 色爱综合网| 久热这里只有精品在线观看 | 激情综合区| 无码免费人妻A片AAA毛片西瓜| 日本人人xxx| 九九精品网站| 国产精品国产| 伊人99久久| 激情五月婷婷| 九热视频在线精品15| 全国最新疫情| 色婷婷六月性 | 狠狠色综合精品视频在线| 色婷婷99| 五月天激情四射网站| 极品少妇XXXX精品少妇偷拍| 我爱va亚洲va52| 婷婷五月丁香91| 欧美情色一区| 婷婷综合| 亚洲五月花| 六月婷婷在线视频| 丁香婷婷伊人| 五月丁香网站在线播放| 人妻性操逼中文字幕 国产| 大香蕉天堂色| 国产性爱大片久久| 牛牛热这里只有jingpin| 色色免费网站| 日韩高清成人| 干一干xxxx| 激情综合色婷婷啪啪六月天| 丁香花五月天| 婷婷丁香五另类网站| 色五月综合| 丁香六月| 色五月激情综合| 99热综合在线| 五月婷婷激情综合| 噜噜国产| 天天拍天天操| 色综合丁香婷婷| 成人色五婷婷| 五月六月丁香激情| 婷婷五月综合网| 婷婷五月深深爱| 插插插色综合网| 九九热亚洲中文在线观看免费| 色婷婷操逼| 99色在线观看视频| 超碰免费人妻| 色婷婷狠狠| 欧美婷婷日本| 九九碰九九爱97超碰| 婷婷综合亚洲| 五月天激情四射| 91九色熟女| 久热 91| 婷婷五月无码| 色婷婷丁香五月| 五月丁香久久| 91人妻PORNY九色大屁股| 久久伊人五月天| 色墦五月丁香| 九色视频91| 亚洲精品视频在线播放| 亚洲欧洲中文日韩久久AV乱码| 丁香六月激情综合| 色五月综合激情网| 国产精品成人网站| 色婷婷五月综合在线| 欧美啪啪9| 婷婷欧美激情综合| se99高清无码| 九九久久这里只有精品XB| 婷婷五月天熟妇| 97五月天婷婷| 69色婷婷| 色婷婷电影网| 婷婷丁香成人色综合| 亚洲精品另类| 亚洲精品无AMM毛片| 伊人无码高清| 五月停亭久久电影| 九色自拍| 能看的av片| 色噜噜在线| 五月丁香六月婷婷国产视频| 五月丁香六月婷综合成人综合| 五月丁香综合网| 大战熟女丰满人妻AV| 国内自拍1区| 丁香天堂夜| 91操片| 密黄站| 五月天色婷婷图片| 丁香五月激情综合| 99国产精品久久久久久久久久久| 六月丁香成人| 色欲婷婷夜夜| 色五月天成人| 天天天天操| 日本久久久97| 色五月婷婷中文字幕| 激情婷婷五月天伊人在线观看| 五月天六月婷婷电影| 人。妻久久| 激情综合亚洲| 亚洲中文字幕翔田千里| 婷婷精品视频| 欧州色色| 国产精品第一国产精品| 99热碰碰| 五月天婷婷色小说| 九九亚洲视频| 五月丁香成人| 偷拍九九热| 999热在线视频| 五月永久激情| 97天堂| 五月天福利影院导航| 99视频网址| 婷婷成人在线| 久久永久视频| 色婷婷无吗| 怕怕視頻| 91丨九色丨熟女|老版| 国自产拍偷拍精品啪啪一区二区| 欧美综合五月丁香六月婷| 97色五月天| 这里只有精品视频在线| 9色婷婷| 久久色情| 婷婷六月天天| 牛牛色av| 五月激情网络| 九九热精品视频在线观看| 2022人人操人人看| 99在这里有精品| 日本一级一级一级一级| www综合久久| 天天操天天操| 激情综合婷婷| 亚洲色五月| 五月天综合视频| 亚州美女| 就99这里只有精品| 五月天伊人网| 伊人久久艹| 天天激情欧美美女| 色婷婷91激情小说| 五月婷婷激情中心| 9久热精品在线视频| 大香蕉520| 日日夜夜天天| 色色婷婷色色| 久久久91| 99 热国产在| 六月婷婷五月丁香| 99热全是精品| 色小说五月天| 东京热人妻一区二区三区在线| 秋霞网在线观看理论91| 中文字幕丰满孑伦无码专区| 午夜理论片最新午夜理论剧| 五月综合视频| 激情影院内射| 婷婷丁香六月天| 97久久久久| 免费看欧美成人A片无码 | 五月亚洲激情| 天天色情站| 那里有AV网址| 综合色播| 夜夜天天久久婷婷| 91操人人操| 丁香五月天天日| 99人人干| 四虎婷婷五月天| 国产成人精品一区二三区熟女在线| 久er免费视频| 99综合网| 五月天久久www| 免费黄网不卡AV| 亚洲热综合网在线观看| 涩丁香| 成 久久| 婷婷在线网| 久热最新视频 | 99热这里只有精品8| 九九碰九九爱97| 啪啪91| 色婷婷影院| 日日色综合| 久久综合婷婷| 国产69久久久欧美黑人A片 | 国产亚洲精品久久久久久久久动漫| 五月天激情小说电影| 国产美女无遮挡裸体毛片A片| 狠狠夜夜五月丁香| 级人人91| 丁香五月先锋| 高清无码.com| 射满了还射免费在线观看 -午夜版全集-新视觉影院| 激情综合网激情五月欧美| 色色欧美色色色| 99热日韩| 亚洲综合五月天婷婷丁香| 丁香九月婷| 丁香婷婷人妻| 日本久久激情| 狠狠爱婷婷丁香| 五月丁香六月婷| 婷婷五月天久久久| 激情五月婷婷综合色播小说| 啪啪操超碰| 五月综合久久| 国产色五月| 小泽玛利亚视频一区二区| 成人婷婷| 日韩无码人妻一区二区三区综合| 色综合香蕉视频| 色狠狠综合| 99热这里只有精品33| 操婷婷久久| 色五月激情综合网| 婷婷五月丁香久久| 久久停停超碰| 九九九九热99超碰| 丁香六月啪| 欧洲日韩一区二区三区| 婷婷五月色综合| 99热在线观看| 极品另类| 狠狠操在线视频| 激情四射婷婷色色色| 99热这里只有精品8| 五月丁香婷婷激情澎湃四射| 九九伊人网| 操大屄五月天视频| 九九热只有精品| www国产亚洲色婷婷com| 91超碰在线观看| 日日操夜夜擼| av九九| 99久久免费精品| 婷婷五月综合在线| 婷婷五月综合色中文字幕| 亚洲热综合| 亚洲天天综合| 狠狠狠人妻| 99啪99| 91人久| 五月婷婷久久综合| 深爱婷婷网| 色五月亚洲五月天| 激情四射五月天| 丁香婷婷激情四射五月| 99这里只有精品| 99久精品视频| 日本色色视频| 人人看人人草人人摸| www.丁香五月| 精品久久婷婷| 久久激情婷婷| 91在线资源| 丁香五月电影| av人人干| 97碰久久| 欧美性爱中文字幕| 韩国激情五月天综合网| 天天爽天天草| 欧洲亚洲欧洲99久久| 亚洲区,视频区,视频区免费| 激情中文在线| 激情久久网 | 天天日天天爽夜夜爽| 日本色五月婷婷| 激情亚洲婷婷六月| 日韩激情婷婷五月天| 欧美色久| 欧美日本黄色| 五月丁香无码| 成人电影AV在线观看| 免费五月婷婷网| 丁香六月天婷婷色| 激情5月婷婷狠狠干| 99re热精品在线视频| 久久99综合网| www.久久爱.com| 激情久久婷婷| 婷婷丁香社区| 亚洲有码在线视频| 91九色欧美| 丁香五月手机视频| 91久久免费| 黄页免费一级视频懂色| 亚洲天堂有码| 婷婷五月a| 五月色婷丁香| 婷五月天六| 国产伊人大香蕉| 99在线免费视频播放| 丁香五月激情综合久久| 精品操逼一区二区| 色综合色色色色| 影音先锋噜一噜| 久久激情天堂| 337p大胆噜噜噜噜噜91Av| 色婷婷成人网| 五月天色影院| 欧美S码亚洲码精品M码| 亚洲AV日韩在线观看| 国模九区| 成人资源在线| 丁香六月婷婷开心| 亚洲激情淫网| 思思热再线视频| 日本激情五月天‘| 五月婷婷av| 色综合天天| 99热最新精品| 丁香六月激情综合| 五月天婷婷丁香成人网| 91se在线观看| 久久99视频| 婷婷五月 丁香六月| www.伊人天堂偷偷婷婷| 欧美人妻一区二区| 色婷五月天| 成人在线日韩| 五月婷婷婷色| 婷婷伊人综合中文字幕| 亚洲视频色色| www.久久av.com| 大香线蕉伊人| 嫩草AV久久伊人妇女超级A| 操老逼综合网| 偷拍91九色| 第2色五月婷| 丁香六月亚洲综合| 午夜成人AV在线| 国产乱妇无乱码大黄AA片| 亚洲AV无码成人电影| 伊人婷婷五月天av| 99热精品10| 五月停停激情网| 9有码中文| 九九热精品| 高清 码 免费看片短视频| 激情丁香婷婷| 五月天伊人手机在线播放AV| 大香蕉中文| 思思热99在线视频| wwwss在线观看| 亚州在线中文字幕| 亚洲av综合网| 久久欧洲综合网| 狠狠色噜噜狠狠狠狠综合| 国产毛片精品一区二区色欲黄A片| av操B网站| 超碰在线人人| 思思热久久爱| 五月丁香六月婷婷啪啪| 超碰9在| 亭亭丁香久久五月| 天天噜| 亚洲国产精品VA在线看黑人| 99在线视频播放| 色色婷婷综合网| 亚洲综合五月天婷婷丁香| 国产亚洲精品久久久久久久久动漫| 综合激情肏逼网| 五月丁香婷婷五月色| www.9797国产| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 91午夜婷婷狠狠久久综合9色| www.henhenl| 狠狠狠狠狠操| 五月丁香综合啪啪| www,色婷婷| 思思精品久久艹| 99思思| 婷婷五月无码| 色婷五月| 五月天激情小说| 欧美色九| 亚洲最大在线| 人人干人人操人人摸| 少妇被躁爽到高潮无码文| 久久婷婷五月综合色奶水99啪| 天天操夜夜爱| 成人美女网| 成人做爰A片免费看网站找不到了| 色色色色网| 色婷丁香91| 五月天婷亚洲天综合网综合| 五月天丁香网| 干一干xxxx| 免费五月婷婷网| 色135综合网| 久热这里只有精品性色AV| 狠狠99| 综合精品99| 夜夜操天天爽| 一本色综合色| 色九月激情综合网| 欧美性生交XXXXX无码小说| 六月丁香久久| www.色五月.com| 五月婷婷色啪| 夜夜谢天天干| 久久的爱大香蕉| www色婷婷com| 艹色18p| 狠狠色噜噜| 亚洲av电影网站| 激情综合网亚洲色图| 成 人片 黄 色 大 片| 丁香五月1页| 深爱五月激情五月| 综合丁香婷婷五月天| 思思热精品在线视频| 99视频在线| 国产成人网址| 婷婷免费精品视频| 玖玖色综合| 五月天六月天| 欧美 色婷婷| 九九热这里只有精品一| 婷婷碰碰| 婷婷性爱五月天| 九九超碰人人| 日本系列_4页_777FP| 丁香伊人网| 婷婷色丁香五月| 超碰精品在线| 丰满人妻一区二区三区| 青青草蜜臀| 91色性感五月婷婷丁香| 九九这里都是精品| 色播播婷婷| 国产激情AV| 日本a片网址| 精品无码久久久久久久久| 五月天色综合服务平台| 99久久国产综合精品五月天喷水\| 四色AVwww| 国产精品人妻在线网址| 欧美内射AA| 思思热99er在线视频| A片试看120分钟做受图片| 五月婷久久在线| 美国不卡视频| 天天天天天天操| 久久狠狠色| 国产超碰av| 婷婷丁香九月| 乱女乱妇熟女熟妇综合网站| 免费视频1区| 婷婷五月天av| 玖月婷婷爱丁香| 色网五月婷婷| 久久丁香综合| 蜘蛛女免费观看完整版高清电影| 狠狠色婷| 超碰成人电影| 色婷婷色情| 五月丁香五月丁香五月丁香五月丁香91| 五月婷中文字幕| 五月丁香天天| 色五月婷婷五月天激情综合| 五月婷婷在线视频| 天天天天色天天天天天干| 色欧美影院| 无码人妻少妇色欲AV一区二区| 夜夜操天天爽| 激情综合网丁香| 色播激情| 亚洲欧美婷婷五月色综合| 99这里是精品| 五月天激情综合在线| 狠狠爱五月婷婷综合六月| 99久在线观看| 狠狠色丁香久久婷婷综合五月| 久热中文字幕| 亚洲99精品九九在线| 色婷婷AAA| 日日夜夜小色哥| 91五月天| 五月天婷婷色情| 免费看欧美成人A片无码| 五月婷婷成人| 色人妻五月| 激情综合五月| 91性人人| 超碰人人摸人人操| 夜夜爱网站| 深爱综合网| www.久久五月天.com| 色色色地址| WWW.五月com| 91精品久久久久久77777| 婷婷五月天激情开心网| 99.色| 久久五月视频| 91超碰在线播放| 婷婷五月天大香蕉在线视频观看| 欧美成人精品A片免费一区99| 丁香六月婷婷色播| 婷婷五月情天| 日韩小视频在线99| 99精品视频在线免费观看| 婷婷欧美综合| 人人操 色| 婷婷9月天| 天天操天天插| 久久丁香五月天| 97香蕉久久超级碰碰高清版 | 99热这里只有精品21| 丁香玖玖视频大全| 婷婷94s| 人妻熟女一区二区AV| 九九热在线观看视频| 9热精品| 天天久| 色婷婷视频综合| 激情五月婷婷伊人| 天天噜天天爱| 激情深愛五月視頻| 女人露出p毛视频www网站| 五月婷六月| 婷婷趴趴| 国产亚洲99久久| 涩玖玖免费视频| 超碰一区二区| 丁香五月激情五月色综合| 色狠狠色综合久久久绯色aⅴ影视| 播播网色播播| 这里只有精品视频| 久久婷婷色| 亚洲色热| 狠狠综合| 成人精品视频99在线观看免费| 日韩999| 九九热视频在线观看| 综合五月婷婷| 丁香五月五月婷婷| 色色色网站| 日本色五月| 综合色99| 无码AV免费精品一区二区三区 | 日本色图综合| 色综合com| 99热这里只| 丁香六月综合激情| 人妻少妇色综合| 亚洲欧洲中文日韩久久AV乱码| 国产偷人爽久久久久久老妇APP| 国产全是老熟女太爽了| 日韩国产在线精品| 91国产精品视频播放| 4438全国最大视频成人网站在线观看 | 综合久久高清| 婷婷色中文字幕| 激情五月婷| 国产伦亲子伦亲子视频观看| 欧美成人在线观看| 九色1区视频在线| 久草网大香视频| 国产激情在线| 婷婷五月天综合激情| 熟女乱论网| 久久婷婷五月天激情| 久久人妻视步| 五月丁香久| 久久怡红院| 色视频色综合91| 婷婷五月综合免费在线| 玖玖99免费视频| 91丨九色丨熟女高潮| 开心婷婷五月天电影院| 成人电影丁香六月天| 日日干日日| 人妻久久久久久| 日韩av手机在线观看| 久热9热| 色综合婷婷| 亚洲丁香五月美女| 综合噜噜| 九九久久网| 欧美A级成人婬片免费看理论| 日本欧美999久久久三级片| 五月婷啪啪| 日本五月婷婷久久久六月丁香| 久8色色| 五月丁香欧美综合| 久久99国产综合精品免费| 婷婷WWW久久| 婷婷99狠狠躁天天| 激情综合网激情五月欧美| 色综合99| 免费观看的av| 五月丁香五月丁香五月丁香五月丁香91| 91 九色 熟女| 婷婷五月色综合| 日夜操B| 日本久久久97| 成人精品在线| 啄木鸟丝袜美女福利视频| 国产激情久久久| 色狠狠婷婷| 超碰人人在线| 亚洲视频伍月婷婷| www.天天干| 94干大香蕉| 99热6这里只有精品6| 五月天婷婷综合免费| 色999亚洲人成色| 亚洲一级AV在线免费播放| 精品网站99| 丁香狠狠色婷婷| 无码 av电影| 亚洲无码另类| 色五月天综合网| 日韩免费视频| 综合色五月天| 激情综合网五月激情网| 亚洲精品V天堂中文字幕| av在线播放网址| 亚州精品久久久久AV无码| 五月天桃色深爱网| 久久精品系列| 色色色国产| 五月天激情国产综合婷婷婷| 综合狠狠干| 99视频这里有精品免费观看| 天天色播| 九九操操| 色五月婷婷五月天| 婷婷丁香五月天之开心少妇| 国产阿姨日皮艹逼内射视频| 天天看A片| 超碰9在| 女力报到正好爱上你| 婷婷色婷婷| 97中文在线| 丁香五月AV| 9l视频自拍九色9l黑人| 婷婷激情鹿城五月天| 丁香五月天激情视频| 4399在线观看免费高清黄色视频| www.99热. com这里只有精品| 天天综合色| 色婷婷XXXXX| 婷婷久久久久| 超碰无码318604| 伊人五月天在线| 一本到不卡高清DVD| 三级成人网站| 亚洲欧美成人在线| 国产欧美日韩性爱| 狠狠色婷婷777| 日本九九视频| 色色热| 五月丁了香蕉综合| 99久久性爱| 9色小视频在线观看| 99热精品9| 91无码一区人妻A片蜜| 9999热精品在线免费播放| 五月天成人综合| 亚洲激情在线| 色五月婷婷丁香五月| 色婷婷亚洲| 天天肏视频| 中文字幕AV在线播放| 丁香五月另类色婷婷麻豆| 啪啪黄页网| 99热天堂| 夜夜资源站| 九九九九综合| 色停停香蕉视频| 97av在线视频| 婷婷综合网| 天天做天天爱天天高潮| 梁铮版蜘蛛女在线观看| 亚洲熟妇AV乱码在线观看| 精品无码色欲AV| 影音先锋日本三级资源| 精品一区二区三区木瓜| 日本三级99人妇网站| 婷婷五月情天| 婷婷色色欧美| 婷婷五月天堂| 婷五月丁香俺| 蜜臀AV在线观看| 成 久久| 潮汕成人AV片在线| 色五月婷婷在线| 欧美 日韩 成人在线| 日日夜夜婷婷| 狠狠88综合久久久久噜噜噜| 99久久九九视频| 99爱免费视频| 欧美丁香五月| 99在线观看| 国产 A片 自拍| 激情色五月天| 日日综合网| 日本97在线视频| 色综合五月天| 丁香五月丁香伊人| 国产黄色av| 五月停亭六月,六月停亭的英语 | 深爱综合网| AV 3P| 91AV视频| 婷婷久久五月天| 五月www| 亚洲激情六月| 色五月综合激情| 五月婷婷综合激情| 伊人久热91网| 色婷婷基地| 国产又黄又爽又激情不遮挡视频在线观看| 碰碰碰97国产| 99热亚洲| 能看的av片| 亚洲AV免费国产电影| 色色亚洲视频| 五月天影院| 丁香婷婷五月激情| 丰满少妇猛烈A片免费看观看 | 99 re视频一区| 这里只有精品视频| 婷婷99狠狠躁| 亚洲区,视频区,视频区免费| 香蕉婷婷五月| 久久精典| 婷婷娱乐丁香综合网| 伊人网碰碰| 婷婷五月花| 日韩欧美成人片| 狠狠搞综合色| www.久久99热地址发布| 青柠影视免费高清电视剧| 五月婷婷深深爱| 丁香五月六月婷婷自拍| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 激情婷婷五月天丁香| 日本色五月| 亚洲精品国产精品乱码视99| 久久久人妻久久久| 亚洲成人在线观看网址| 91一起操| www.天天干| 婷婷五月天手机版视频| 五月丁香婷婷久久| 怡春院天天干| 亚洲精品无码一区二区| 亚洲天堂大香蕉| 色欲资源网| 99在线精品视频观看免费下载| www亚洲无码| 少妇2做爰HD韩国电影| 欧美综合五月丁香六月婷| 99热在线观看这里只有精品| 高潮毛片遮挡费高一百度| 日本99视频精品免费播放| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 综合久久久婷| AV片一区在线观看| av人人干| 任你搞网站| 五月色丁香视频精品| 久久这里面只有精品视频| 亭亭色网| 五月天伊人久久| 九九99九九精品免费| 久久伊人五月天| 久久视频婷婷| 色深爱五月| 天天干天天干天天干天天干天天| 亚洲sesesese| 五月丁香欧美综合| 99ri国产精品| 热久久999| 夫妇交换刺激做爰| 99在线免费视频| 亚洲熟女色| 五月天播播中文字幕| 丁香五月婷婷在线视频| 午夜精品777| 色五月婷婷久久爱| 国产激情视频在线观看| www99久久| 99热色婷婷| 丁香婷婷五月人体| AV片在线观看| 婷婷综合中文字幕| 人妻丰满精品一区二区A片| 激情五月婷婷综合| 99性色| 操91| 99热精品在线播放| 五月天久久婷婷| 色综合天堂| 久久婷婷五月综合激情国产 | 亚洲、热| 蜜臀九九九九| 丁香五月天av| 色婷婷五月婷婷五月婷婷五月| 亚洲天天免费| 亚洲色婷婷99一9|| 婷婷五月欧美综合| 开心四月婷婷在线色播播| 色婷婷视频| 天天插天天很| 婷婷五月丁香婷婷| α久久| 五月婷婷九| 丁香综合网| 五月停停激情网| 色五月激情婷婷| 六月婷婷开心| 热99只有里视频| 丁香婷婷久久综合在线| 久久成人综合五月天| 日韩婷婷五月天| 婷婷天天综合| 五月综合精品| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 刘玥av在线| 婷婷五月丁香青青草在线| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 无码区婷婷五月花开| 九九热欧美| 色五月xxx| 九九久久99| 五月天综合影院| 狠狠插狠狠插| 日韩成人中文字幕| 亚洲精品婷婷| 人与禽A片啪啪| 人人肏逼视频在线一区二区| 久久婷婷综合色丁香| 99噜噜| 综合天天综合| 日本成人噜噜噜噜噜| 婷婷5月九九| 精品99视频| 久久伊人五月天| 全部老头和老太XXXXX| 青吴乐视频| www.com.色色| 成人电影一区| 五月天性色| 夜夜骑天天操| 久久久18| 91九九九九| 亚洲成人AV在线| 色激情综合| 99热这里只有精品23| 五月婷婷色五月| 亚洲色频| 五月成人丁香av91| 超碰人人99| 操操操av| 成人色五婷婷| 婷婷五月色天| 六月丁香AV| www.99久久久| 日韩AV色色色| 激情亚洲婷婷| 国产美女无遮挡裸体毛片A片| www.99热精品99.com| 亚洲综合久| 国际国外精品欧洲南美洲专区无码不卡| 五月天com| 91九色网| 99热一本久道| 青青夜夜狠狠夜夜狠狠| 五月丁香六月婷婷久久| 欧美25p| 色啪久| 久久久com| 天天五月情| wwwss在线观看| avh片在线观看| 欧美久热| 99热这里只有免费精品| 五月丁香色| 日韩婷久| 热热久久精品视频| 婷婷深爱五月天| 成人片黄网站色大片免费毛片| 激情五月影院| 香蕉久久五月| 亚洲五月天色| 色综合天天综合成人网| 国产精品a无线| 国产成人在线不卡AV| 天天添天天摸天天天天做| 色综合中文| 中文字幕人妻一区二区| 伊人网欧美在线男人天堂五月丁香| 婷婷五月天BBw| 狠狠插狠狠插| 九九青草热| 婷婷六月天激情影院| 色综合色色| 国产综合丁香五月天| 亚洲色婷婷99一9|| 日韩啪啪网| 久久 中文 日本| 色久五月| 国产日韩欧美性爱| 91打屁股视频网站| 国产精品婷婷午夜在线观看| 婷婷久久五月天| 免费黄色AV| 五月丁香天堂网| www.97视频| 色婷婷色五月另类综合| 婷婷五月色情| 欧美色综合天天久久综合精品| 91无码高清| 99热这里只有精品无码| 国产成人网| AV在线观看网站| 99视频这里有精品| 色九月综合| 五月婷婷之六月丁香| 久久天天| 亚洲午夜av| 色情五月婷| 激情五月天99色| 丁香婷在线| 日韩黄色影院| 99热这里只有精品国产免费| 中文字幕综合| 色噜久| 久色欧美| 色噜噜五月天| 99re久热| 国产日日操夜夜操的肉棒视频| A片试看120分钟做受视频红杏| 只有精品在线观看| 久久99网站| 九九热re99re6在线精品| 久久久噜噜噜久久人妻| 东京热人妻一区二区三区在线| 五月丁香六月香综合激情| 在线中文AV| tingtingzonghewang| 中文字幕无码人妻少妇免费视频| 亚洲综合网区| 六月婷婷五月丁香| 欧美五月丁香在线| 五月丁香六月激情综合| 丁香五月天在线观看视频| 五月天激情四射| 久操婷婷| 五月婷婷啪啪| 激情六| 五月丁香啪啪啪| 色婷婷五月天天天天天| 五月婷婷六月丁香| 蜜臀av无码久久久久久久久| 九月婷婷综合| 亚洲综合网激情五月天| 99久久国产宗和精品1上映| 五月亭亭激情综合| 婷婷97色| 日韩99精品| 亚洲色色五月| 无码99| 激情综合五月天| 日日天天干| 五月丁香五月丁香| 荫道BBWBBB高潮潮喷| 激情综合丁| 玖玖九九9999在线观看视频精品| 天天干狠狠| 国产日韩av片| 亚洲激情网| 热久久77777| 国产婷伊人| 99久久激情视频| 六月婷色| 亚洲综合色色| www。五月天。com| 久久婷五月影院| 婷婷丁香六月天| 久操热线| 中文成人在线| 婷婷精品综合| 国产精品视频| 99色视频| 五月丁香六月停停| 99视频在线观看视频| 大香蕉五月天婷婷| 99在线免费视| 狠狠色婷| 大香蕉久久婷婷| 丁香婷最新动态| 99年操人人爽| 九九热这里只有精品6| 九九久久综合| 日韩无码AV电影网站| 六月婷婷中文字幕| 超碰精品在线| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 午夜大香蕉| 中文字幕网伦射乱中文| 色五月综合在线| 99re99在线看| 日本波多野结衣视频| 色婷婷综合影院| 日日噜狠狠色综| 日本97人人| 激情五月丁香五月| 影音先锋 婷婷| 九九热精品99| 欧美色综合天天久久综合精品| www天天色天天射| 激情五月天在线观看婷婷| 秋霞九九无码| 香蕉综合网| 日夜夜久久| 色婷婷狠狠| 九热av| www.五月丁香| se99视频| 婷婷五月丁香六月伊人网| 性爱网六月丁香| 久久久久人妻| 97碰碰在线观看视频|