亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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后端開發(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)鍵開發(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)題卡住的后端開發(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)制綁定比如開啟事務(wù)時(shí)鎖定主庫(kù)。三者優(yōu)先級(jí)從高到低沖突時(shí)以手動(dòng)標(biāo)記為準(zhǔn)。這種設(shè)計(jì)避免了“全局默認(rèn)庫(kù)”帶來(lá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è)路由的“開關(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: 布爾值開啟后自動(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緩存——這是熱加載失敗最常見的原因。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而開發(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)目提供了一套開箱即用的驗(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常見原因是密碼錯(cuò)誤或網(wǎng)絡(luò)不通。5.2 路由追蹤開啟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. 二次開發(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(); // ← 開啟追蹤 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即可。灰度結(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
返回資訊列表
亚洲一欧洲中文字幕在线 | 亚洲男人天堂2017| 欧美色日本| 中文字幕亚韩| 一个国产在线综合网站| 超碰97亚洲| 欧美日韩另类字幕中文| 天天透伊人| 国产欧美日韩精品中文| 久久男人精品| 午夜精品久久久久久久99蜜桃一| 视频国产欧美在线播放| 男人天堂网站| 人人妻人人玩人人澡人人爽| 精品无码产区一区二| 国产久久视频| 偷拍网站久久男女男| 91操人| 一中国女人毛片水真多| 国产精品久久蜜乳av| 干美女人妻| 91在线丝袜视频| 亚洲男人天堂2019| 日韩有码中文字幕女同性恋| 欧美91网站| 久视频在线观看| 五月丁香色色网| 国产麻豆福利av在线播放| 老熟女乱伦片| 婷婷av在线中文字幕| 777超碰| 东北熟女91| 亚洲自拍小说| 日韩精品在线视频,日韩精品……| 91丰满| 东京热,男人的天堂| 少妇色综合| 91超碰碰在线| 91蜜臀人妻中文字幕在线| 久久后入制服| 黑人性欧美| 91 偷| 日韩天天综合| 日韩操啪| 国产一区二区三区久久久精品| 99re免费视频精品全部| 精品国产91av一区二区三区 | 91色综| 最新AVzaixian| 五月天婷婷色| 日夜久久久九九九久| 91挑色欧美| 9999久久久久| 高颜值美女口爆高潮浪叫| 人人妻人人爽| 中文字幕精品丝袜| 是还免费视频1727我| 欧洲与亚洲欧美精品中文字幕| 曰本91情色| 中文字幕一区二区三区蜜桃视频| 一区不卡在线观看av| 欧美色性爱| 操逼逼无码| 亚洲骚女一区二区三区| 粉嫩AV一区夜夜嗨| 日本精品加勒比海一区| 曰韩中文人妻视频| 日本久操视频| 2019亚洲男人天堂| 亚洲av青草久久一区二区| 日本高清视频xxxx| 97最新在线播放视频| 欧美日韩超碰在线| 九九国产| 天天插网| 性做久久久久久免费观看软件| 偷拍欧美激情| 女人香蕉久久毛毛片精品| 中文字幕欧美日韩三级| 99色在线视频| 破处bbq| 凹凸视频在线一区二区| 欧美日韩性爱视屏免费看了| 欧美在线伊人色| 天天综合网视频91| 色婷婷久久| 黑人精品久久97| 无码色| AV99热18这里只有精品| 久久精品国产99精品亚洲蜜...| 日韩精品视频在线观看一卡二卡| 午夜久久一区二区无码中出| 超碰地址久久| 欧美午夜精品久久久久久超碰| 久9久9精品| 五月天婷婷在线看 | 国产传媒1234区| 国产后入式在线观看| 欧美伊人久久综合网| 久久大香蕉| 人伦四五区| 岛国激情视频软件| 欧美精品 - 91爱爱| 九t超碰| 久综合网| sewuyueav| 国产操逼逼网| 欧美日韩另类字幕中文| 中国一级操逼视频| 污污污8888| 亚洲最新Av| 俺去也婷婷| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 熟女日韩| 中文字幕高清精品一区| 国产中出内射一区二区| 亚洲一二三四区机械| 欧色网址| 99re6久热只有精品6在线直播 | 五十路三区在线| 少妇滛荡视频| 一区二区乱码福利| 欧亚乱色熟一区二区三四区| 操b在线观看| 打av高清| 看日韩操逼| 婷婷激情五月综合| 五月天激情国产综合婷婷婷| 91精品国产91久久青草| 久久久婷| 无码免费精品高清| 男人的天堂kva| 爱我干综合| 78m成人视线| 色婷婷影视| 欧美少妇色图| 99国内熟女露脸视频| 视频黄色国产一级| 97色操| 美女诱惑1区2区| 欧美裸体美女日麻屄| 亚洲瓯美色图| 免费精品福利在线观看| 97日亚洲欧美| 亚洲在钱| 精品国产网站| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 90后后入| 日本在线一二 | 黄片免费日韩| 啊啊啊啊免费视频| 2020中文字幕在线| 97 亚洲 日韩 欧美 在线| 国产狂喷潮在线精品| 欧美亚洲美少妇一区二区| 乱伦av.com| 亚欧洲日韩国产精品| 蜜桃久久久久久久| 无码国产精品久久久久| 97操| 欧美色老汉| 亚洲国产一区二区三区在线| 色欲久久综合| 天天干天天狼在线视频| 亚洲av综合伊人久久| 99福利社| 色情亚洲日本成人| 激情五月天综合网| 一区二区三区免费岛国片| 欧美加勒比| 欧美人妻色| 婷婷色播婷婷| 一级黄色性爱A级片| 尤物网站91| 人妻激情视频| 亚洲人码13| 韩国轻伦国内自拍一区| 色综合久久888| 婷婷激情五月天小说网| 99蜜桃臀亚洲成人在线观看| 五月天婷婷成人网| 亚洲天堂7777| 爱妃国产亚洲视频中文字幕| 亚洲色阁| 天天躁日日躁狠狠狠躁| 欧美爱三级日韩久久| 激情综合网激情五月天| 校园春色第一页| 久久伊人青青草| 一本道综合色图| 91黑人无码激情在线| 国产精品久久久久久久电影渣男| 国产女人视频三四五区| 欧美综合天天| 欧美92| 9九九国产| 无码操逼天堂| 欧美九一精品久久久熟妇| 欧天美中出| 大香蕉一人在线| 色婷婷婷五月天激情四射| 无码91| 超碰日本97美女人妻人人玩人人爱| 丝袜熟女一区二区三区| 亚洲αv一区二区三区| 欧美黑人精品在线播放| 久久无码电影| 精品国产少妇高潮视频| 情色AV电影| 亚州国产精品乱| 人人爱操| 久久久蜜桃一区二区三区| 女优视频第10页| 亚洲最大91网| 日本一片一区| 都市激情人妻一区二区青青操视频 | 久久人妻视频网| 婷婷色五月激情| 亚洲五月丁香花狠狠干一区二区三区| 91日韩在线| 人妻少妇久久久| 插入综合网| 综合激情97| 亚州久久9| 啊啊啊轻点在线观看| 欧美久久人体| 清纯唯美亚洲综合| 内射夫妻三片| 国产女性无套 免费观看| 香蕉久久国产AV一区二区| 亚洲综合在线视频| 伊人991| 91n处女在线观看| 尤物av网站免费在线播放| 视频一区二区免费在线| av在线一区二区三区| 国产精品欧美日韩久久| 丁香色色网| 97亚洲资源| 日本三级韩国三级美三级91| 日韩少妇无码| 久久婷婷色| 女人的久久久| 美国三级日本三级久久99| 久草电影网| 天美传媒婬乱| 深爱五月婷婷| 国产乱人妻精品入口| 五月天亚洲网| 精品日韩人妻精品一二三区| 欧美日韩美女精品久草一区二区三区| 91白嫩| 免费一级黄色录像影片| 久久久久久久人妻| 都市激情人妻一区二区青青操视频| 一二三四区电影| 视频一区二区三区精品| 五月丁香六月婷| 青苹果影院男人的天堂| 久久香蕉国产线看观看亚洲女人 | 国产精品久久久久久 百度| 色婷婷综合网站| 9999亚洲电影| 成人一道本免费视频| 国产黄色av大片网站| 青青国产精品在线| 免看60秒涩涩视频| 日韩色欲久久一二三四区| 情侣开房子拍 日韩无码 女的很漂亮| 玖玖资源视频一区二区三区| 伊人黄色片| 丁香六月婷婷久久综合| 久久在肏| 精品久久人妻成人网| 欧美久久毛片基地| 东北熟女91| 五月丁香激情综合网| 老司机免费视频在线91| 1769国内精品视频| 91久久精品国产| 亚洲高潮影院| 免费看久久久性性| 亚洲狠狠入| 操逼国产免费| 亚洲第2页| wwe 天天干.com| 日韩精品人妻| 91色情黑丝搞鸡在线观看一区二区三区三州| 爱妻综合网| 老外又粗又长一晚做五次| 炮色五月| jizz啪啪| 久久中日麻豆| 大香蕉久| 尤物视频新赏网鲜网色诱网| av一区二区三区 中文| 久久久精品视频欧州站| 国产美女mm131爽爽爽爽| 熟妇高潮精品一区二区三区下载| 中国女人内射6XXXXX| 五月开心久久AV官网| 久久久久久亚洲中文| 国厂麻豆77q4| 激情网色| 中文字幕AV中出| 婷色五月| 久久精品国产Aⅴ| 东北黄色电影| 欧美亚洲色图另类国产| 国产热av| 91 在线亚洲| 天天网综合| 夜夜操天天肏| 欧美日韩香蕉| 亚洲毛片基地专区| 99国产精品久久久久久久成人热 | 亚洲熟女国产综合另类| 成人小说视频在线精品欧美| 91精品国久久久久久无码| 日本Xx性爱| 日韩BBN| 精品国产乱子伦一区二区三区,精品一 | 欧美一级色| 久久69| 久久精品国产99国产精品亚洲| 日本成人电影资源网| 日本天堂在线播放| 日本A级视频| 岛国在线一区二区三区| 亚洲熟女人妻中文字幕一区二区| 蜜奶av| www黄片免费看com| 亚洲男人天堂av| 校园春色综合色| 在线视频日韩欧美国产| 成人免费视瓶| 97美日韩视频| 色老牛| 天天综合网~69| 美国黄片aaa| 久久久久久久久9| 日日夜夜噜| 丁香婷婷色五月| 国产探花日韩援交| 97色亚洲| 中文字幕第95页| 夜夜嗨av午夜成人| 色婷婷亚洲婷婷| 亚洲av综合色区图片亚洲| 极品美女嘿咻| 久久骚| 性色国产东北露脸精品视频| 狠狠综合| 巨爆乳肉感一区二区三区竹菊影视| 亚洲欧美综合| 神马麻豆福利院| 欧美青青草视频| 欧美香蕉视xxx| 狠狠爱综合网| 亚洲中文字母在线播放| 国产精品免费美女视频| 久久精品国产AV一区二区三区| 欧美天天干| 少妇熟女视频一区二区三区| 黄色香蕉视频网站一区| 天天干人人乐| 我爱操| 天天操人人操骚逼网站| 亚洲91网站| 人人摸人人干| 按摩中文字幕| 91女人的网站| 97网址www| 丰满人妻一区二区三区| 久久久网站| 欧美成人午夜免费福利785| 欧美不卡在线一区二区| 一区二区三区美女超清| 亚洲 欧美 日韩 国产一区二区 | 精品久热| 色综合久久888| 玖玖婷婷五月天| 国产精品午夜高潮呻吟久久av| www.黄色在线| 婷婷五月天激情网| 日本性爱少妇| 99热在线观看| 日韩精品区二区三区不卡| 伊人久久婷婷| 日本不卡卡一区| 亚洲最大的黄色电影网站。 | 人人妻人人爽 97人人看碰人免费公开视频| 天天日天天操天天射河南省| 在线观看一级α片刺激高潮视频| 岛国黄片网站| 精品国产人成在线| 一级免费啪啪片| 日韩av乱伦| 六月婷婷色综合| 天天日少妇逼AV| 日本熟妇熟色97一本在线观看| 麻豆蜜桃视频在线观看| 顶级少妇BT天堂| 九九九九免费高| 超碰97导航| 蜜汁欧美| 夜夜草天天| 国产曰批免费观看久久久| 成人a大片在线观看| 99热在线观看| 日韩伦理视频| 国产视频小说| 91A欧美电影网站| 久久大黄片| 国产Av超碰| 极品尤物在线观看| 美女裸体麻豆天美蜜桃91| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 97爱爱官网| 九久精品| 手机在线人成免费视频| www.婷婷六月天| 久久99手机免费视频| 97天天在线| 91成人无码| 日逼视频日本| 国产乱婷婷精品二区三区| 亚洲性少妇| 超碰97男女| 中文字幕五月婷婷免费| 96AV精品| 中文字幕精品亚洲熟女| 国产91亚洲精品一区二区三区| 国产精品视频一区二区三区八戒| 亚洲少妇喷视频看| 久久精品高清无码一区| 韩国免费播放一级毛片| 婷婷五月天av| 99国产精品自在自在| 亚洲男人天堂av| 亚乱色| 熟女中出视频| 青青草国产欧美非洲黑人| 操高情无码| 综合亚洲情色| 一区二区中文| www.婷婷| 99re黄| 人人摸人人摸人人干| 日韩中文字幕熟妇人妻| 久久久97| 女优视频第10页| 9 1超碰九色| 成年人三级黄色片视频| 天天看特黄的免费网站| 精品人妻一区二区三区四区石在线| 中文字幕 国产区| 天天日熟妇| av天堂精品久久| 美女露胸露屁股| 亚洲性天堂| 欧美一级色| 一区二区亚州激情久婷婷欧美| 国产成人精品必看 | 精品视频在线观看| 婷婷四五区| 国内一级精品| 狠狠中文字幕| 久久专区| 不卡九肏| 久久久亚洲Av| 2026国产精品视频| 亚洲欧美一区二区三区一猛片| 色www精品视频在线观看| 欧美日韩啪啪电影| 亚洲第一二区另类图| 美女熟妇色| 日本一片一区| 在线免费观看日韩一区| 欧美一品道| 老司机射| 日韩91网站| 91天天日| 久久久久亚洲三级电影| 无码人妻精品一区二区三区九九| 国产女人和拘做爰视频 | 夜夜高潮夜夜爽| 一本色道无码DVD中文字幕| 一区二区首页| 国产高清在线观看欧美| 亚洲 中文 欧美 日韩 在线| 九九在线视频| 大屁股人妻女教师撅着屁股| 大香蕉青青9| 国产原创剧情在线丝袜| 黄色无码高清黄色无码网站| 97超碰巨乳| 蜜乳性色无码专日粉嫩骚逼AV| 激情久久日韩精品中文字幕麻豆| 高清无码网址| 国产精品美女久久久久AⅤ国产馆| 日韩啪啪啪视频| 欧美性爱十八禁| 久久久四区| 久久亚洲人妻| 色婷婷av在线观看| 亚洲天堂一区二区久久| 九九久久国产精品怡红院| 麻豆久久久一区二区| 亚洲一卡二卡在线免费| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 精品国产自在在线99| 熟女五十路一区二区三| 一区二区影视| 操少妞在线视频| 亚洲男人bt天堂| 国产一在线观看| 美女91在线| 色网综合网| 激情文学网伊人| 蜜乳AV一区| 中文字幕乱码在线| 青青草久久在线| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 9久热| 亚洲无线观看久久| 91精品婷婷国产综合久久| 国产熟女少妇一区| 午夜男女爽爽爽在线视频| 色视频蜜乳| 日韩一级二级三级| 久久中文字幕女同性恋一区| 双插在线| 动漫片子网站3黄| 五月丁香| 7777欧美成是人在线观看| 亚洲欧美国产中文视频| 东北熟女91| 哑洲在线| 九九人妻| 超碰是碰在线观看| 中文字幕超碰CAO| 国产怡红院| 婷婷大香蕉| 日韩黄色成人性爱| 草莓精品视频| 91成人久久| 95自拍视频在线观看| 一本色道综合久久欧美| 2021国产成人精品久久| 国产精品久久久久久久久久久久| 久久丝袜| 99999国产精品| 色老大| 欧美综合狠| 国产熟女精品区| 人妻 欧美 中文| 97青娱乐超碰久久| 鸥美插入视频| 天堂伊人久久| 日韩精品人妻中文字有码在线| 东北女人| 国偷自 一区| 人人摸人人舔一区二区| 日1区2区3区2020| 一卡二卡在线播放| 久久岛国| 欧美劲爆第一页| 一二三区视频在线观看| 久草新在线| 啊啊啊好多水| AV天堂国产| 欧美黄色大片在线观看| 日本一区二区成人在线| 91久久久久久久| 婷婷尹人大香蕉免费| 920日本午夜免费| 少妇国产不卡| 神马久久69| 青青草久久| 2017天天操天天日| 欧美日韩中文视频播放| 老司机深夜18禁污污网站| 黄色在线网站| 午夜丁香| 一区中文字幕二区日韩| 99国内熟女露脸视频| 国产嫩草精品A88AV| 射久久| ji熟女.com| 最新日产中文在线麻豆| 欧美色图天堂在线| 亚洲资源网| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 午夜福利 成人 91| www.av家庭乱伦| 大香蕉久| 日韩AV电影网站 | 亚洲欧美综合区自拍另类| av片在线观看免费播放| 毛片17S| 超碰综合97在线| www国产无码| 久久九九国产精品| 91 丝袜在线| 午夜精品久久久久久久99| 国产后入内射| 天天做日日做| 99国产人成精品| 一牛一区二区三区久久| 97国产精品一区| 蜜乳Av成人片网站| 凹凸 69堂 在线播放| 国产成年女黄特黄| 中文久久爆乳| 97自拍一区| 啪啪啪亚欧美视频| 一区二区三区视频在线观看免费| 亚洲91网。| 另类欧美色| 日韩欧美综合激情| 天堂精品小草| 久久久96| 丁香激情网| 亚州Av天美传媒| 欧洲欧美视频一区二区| 热天堂一区二区| 亚洲自拍小说| 色乱二区| 亚洲综合性网址| 被操高清无码视频| 熟妇人妻精品一区二区视频色欲| 亚洲日韩97| 亚洲精品官网在线观看| 五月天伊人| 女性喷水高潮在线观看| 国产伦精品一区二区三区视频女| 久草电影网| 九九综合久久| 无码精品啪啪啪一区二区三区三州| 国产成人自拍视频视频| 97资源欧美| 欧美黄色手机在线观看| 欧美激情亚洲色图| 人人搞人人插人人操| 中文字幕国产精品1区| 麻豆AV一区二区天美传媒| 天堂8在线新版官网| 99精品在线| 亚洲 欧美 手机在线观看| 久久一本大香蕉 | 人人爱夜夜爱| 亚洲男人综合| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产真乱mangent| 麻豆久久久久久久久丝袜| 亚洲九九九| 有码人妻系列| 午夜福利无毒不卡| 91欧美丨精品丨入口| 亚洲欧美中文一区二区三| 久久久久9999精品九九九| 国产av又色又爽又黄| 久久宗合亚洲| 天天看,天天做| 久久久极品| 天美精品av| 色综合一本| 青青草乱入乱欲视频在线观看| 天天草夜夜草高潮片| 久久美国毛片| 午夜天堂精品久久久久91| 亚州综合色| 一区二区精品更新提醒| 天天色,天天干,天天干| 精品中文一区二区| 亚洲综合五月天婷婷丁香| 色姑娘综合网| 日日摸日日碰| 激情综合五月| 欧美高清无码免费视频高清版| 一区二区视频你懂的| 爽 好舒服 无码刺激久久| 色爱亚洲| 欧美日韩精品久久| 91丨九色丨43老版熟女| 亚洲中文字幕在线视频一区二区| 欧美色图 人妻| 色5月婷婷| a男人的天堂久久一级A毛片| 偷拍片久久| 久久超碰久| 亚洲国产精品有声| 嗯嗯啊啊啊好爽| 超碰97网址| 伊人五月天| 国产精品亚洲色婷婷久久久| 色婷婷日韩精品一区二区三区| 97香焦色区| 一级特级aaaa毛片免费观看| 国产精品精品系列在线观看| 久热99999| 91人妻丝袜无码| 久久肏大逼| 超碰在线欧美性爱激情| 欧美美逼| 亚洲的天堂网| 国产精品白虎| 亚洲伊人青青草| 黄色二级片网站| 99性视频| 高跟丝袜AV专区国产| 国产乱伦视频污| 亚洲图片视频小说| 天天内射| 国产AV人人 夜夜人人澡| 熟妇在线视频一区二区| 日本在线不卡v二区| 日B操| 97Ai亚洲| 青青操在线视频| 99re在线视频| 和协影院中文字幕三区| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 天天日B狠狠操| 看一级黄色视频| 无码黑人精品一区二区三区三| 成全动漫视频观看免费下载| 91视频综合网| 午夜在线播放| AV中文字幕三四五| 夜夜嗨TV| 人妻喷水| 日本97久久| 97av,com| 中文字幕一区二区三四五区日日骚| 精产国品一区二三产品| 射丝袜高跟鞋99| 欧美不卡在线美女| 骚货人妻偷情自拍在线视频| 日韩欧美视频青青| 青青草日韩无码| 婷色五月天| 色99色| 天天综合,91综合永久| 日韩免费人妻色情网站| 久久国产精品一级二级三级| 国产欧美伊人| 精品无码一区二区| 禁十八久久| 伊蕉97蜜桃97狠狠综合干| 色天堂综合| 成人在线午夜视频一区| 91精品免费| 麻豆色99999| 91熟女丨老女人| 青青草国产欧美非洲黑人| 国产激情视频一区区三区| 精品视频在线观看精品| 自拍偷拍草一草| 天堂а√在线最新版在线| 人人摸人人添人人操| 熟女色综合久久| 国产67194| 国产女人高潮视频| 97这里都是精品| 日本中文字幕一区| 人妻精品一区二区三区| 成·人免费午夜在线观看| 成 人 A V免费视频在线观看| 亚洲精品性爱片| 懂色AV蜜臀无码精品APP| 97精品综合| 黄色成品网站| 狠狠干妹子| 偷拍盗拍亚洲色图图片| 国产精品一区二区久久精品| 国产精品久久久久久久毛片1| 国内毛片免费h片在线| 欧美|91色综合| 操b网站亚洲无码| 99精品综合久久久久五月天| 精品999999| 人人摸人人添人人操| 能看的av| 蜜桃久久精品一区二区三区| 欧美丝袜91| 91啦人妻| 成人AV在线电影| 人人澡综合涩| 久热伊人| 26uuu性物| 日日狠狠久久偷偷色综合免费| 午夜啊啊啊| 中文字幕视频在线观看| 亚洲图片婷婷五月天| 九九九九久久久| 超碰久久精品| 韩国免费播放一级毛片| 久久精品性| 日日夜夜噜| 欧美AB在线| 久久鲁干| 91美女视频在线免费观看| 校园春色五月天| 亚洲色图亚洲无码强奸乱伦| 黄色高清久久无码依人| 蜜臀99精品国产高清在线观看| se01国产在线视频| 天天综合AV| 成人区人妻精品一| 日韩精品中文字幕一| 激情图片伦理国产一区二区日韩| 日韩精品午夜操呦呦不卡影院| 狼狼色丁香久久婷婷综合五月| 欧美黑人猛交春色影视大全| 校园春色美腿丝袜| 在线观看AV片| 欧美亚洲AN| 久久精品国产亚洲妲己影视| 欧美激情总合网| 无套后入双马尾| 天天躁日日躁AAA片李宗瑞| 最新精品久久蜜桃 | 懂色中文一区二区三区| 高凊专区人人操| 欧美亚洲首页| 狠狠综合| 中文字幕一区二区无码成人| 亚洲欧美国产其他二区| 欧洲亚洲综合| 国产极品美女高潮无套在线观看| 97欧美色资源| 国产精品分类在线观看| 欧美色66| 九九视频黄色片| 爱欲AV| 黄色香蕉视频网站一区| 久久天天躁日日躁狠狠躁| 午夜成人爽爽爽爽A片李冰冰| 日本91白丝| 91综合中文字幕| 天综合网| A级在线视频| xxx亚洲午夜天堂| 91精品国产91久久福利| 久久最新视频免费观看| 国产日韩在线播放av| www.男人天堂| 国产午夜激片Av毛片不卡| 老鸭窝日丰县女人| 操逼日韩无码| 啊啊啊久久| 精品人妻一区二区三区-国产精品| av网站免费线看| 久久精品视频28| 亚洲无码?第一页| 91在线一起| 五月激情小说| 欧美人黑A片无码免视费| 天堂麻豆天美| 日韩色欲久久一二三四区| 久久久精品中文字幕麻豆| 色丁香五月婷婷| 久久久久夜夜夜夜| 97超碰色屌| 韩国黄片aaaa| 又黄又硬又粗又长国产视频| 中文高清一区二区的| 激情小说日韩无码| wuyechaopeng| 日韩AV电影网站| 日韩综合成人免费视频| 情色五月天就去干| 欧美亚洲激情小说| 黄色AAAAAAAAAAA大片| 91日韩网站| 红桃视频高潮| 在线中文字幕极品av| 欧美色图20p| 激情四射熟女丝袜| 玖玖视频在线资源一区二区三区| 一级AV性爱| 天天影视综合色| 欧美性,亚州色| 色综合色欲色综合色综合色综合| 中国人高清www色视频免费| 久操在97| 亚洲有码 欧美精品| 亚洲国产婷婷在线播放| 91丰满| 久噜噜| 99色悠悠| 欧美日韩国内不卡| 精品国产三级av韩国在线| 欧美骚少妇| 色狠人在线99| 色五月亚洲| 国产精品呦一区二区三区| 诱惑网综合| 欧美亚洲清纯| 日韩激情视频| 天天添天天干电影| 中国探花熟女| 人人摸.人人色| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 夜夜骑操视频| 亚洲AV乱码专区国产噜噜亚洲| 日本欧美亚洲高清在线看| 日韩欧洲操屄视频| 国产深喉视频一区二区| 99热这里只有精品1| 999综合色| 日韩天堂av电影在线观看| 久久XX| 立川理惠无码一区二区| 99国产在线 精品 视频| 91在线免费精品视频| 欧色网址| 欧美视频一区二区三区| 欧美天堂第二区| 久久神马影院| 2025亚洲男人天堂| 国产黄a三级三级三级av在线看| 强奸a片网| 国产一区二区三区导航| 岛国色情视频在线观看| 成人无码在线视频网站| a片自拍直播视频| 无码78| 亚洲Av诱惑| 玖玖爱视频网站| 偷拍亚洲情色| 色偷偷超碰亚洲| 色天堂在线观看| 91天天c| 欧美999999| 青青草国产盗摄一二三区| 九九久久国产精品| 久久AV无码1区2区3区| 亚洲综合有玛| 国产AV人人 夜夜人人澡| 亚洲棕合电彰| 人人噜夜夜操| 亚州色阁| 超碰到97情色| 女人18精品一区二区三区| 亚洲素人综合| 78精品在线| 999999精品| 激情小说亚洲| 亚洲伊人久久综合97| 可以免费看黄片的视频| 95自拍视频在线观看| 五月丁香拍拍激情综合三级| 天天干天天操天天干天天操 | 亚洲资源一区| 久操97| 男女日B国产| 波多野结衣一级视频| 国产综合网站在线播放| 一级免费啪啪片| 五月婷婷综合网| 天天插天天舔舔天天干| 91熟女综合| 无码九九九九| 天天色欧美| 国语对白露脸XXXXXX| 性影在线视频| 亚洲中文一区二区三区视频| 发朗少妇买婬全视频中文| 熟妇人妻一区二区三区| 国产精品熟妇一区二区三| 九色 蝌蚪 熟女自| 亚洲精品99999| 97在线精品观看视频| 精品人妻美妇91job| 天天综合,91综合永久| 91精品成人| 久射吧| 97超碰精品| 美女操逼福利视频| 蜜桃视频精品一区二区| 人妻人人澡人人爽人人| 97在线播放 | 国产精品三级视频网站| 大鸡吧尹人在线| 亚洲诱惑天堂| TS人妖另类精品视频系列| 亚洲 自拍偷拍 欧美| 99婷婷| 欧美激情久久久久| 97精品网| 在线性黄高清免费视频| 日韩av熟女一区二区三区成人| 香蕉大久久久| 亚洲无码精品AV久久久| 丰满人妻av一区二区三区| 人人澡人人爽人人精品| 久久久久久久久久久精| 国产亚洲精品A在线观看下载| 爱做久久久久久| 韩国三级三级BD在线| 嗯嗯啊啊啊好爽| 日韩欧美综合激情| 操我啊啊啊啊啊| 蜜臀AV一区二区三区| 亚洲欧美日韩免费电影| 日韩精品亚洲一二三| 日本高清免费一本视频在线观看| 五月天婷婷久久| 亚洲91综合| 人妻干天天| 亚洲色图久久成人| 97中文字幕一区| 日韩成人性爱AV| 青青国产在线拍揄自揄拍| 国产乱子伦久久精品综合一区二区三| 成人性爱高清视频免费看| 久久久18禁| 国产精品久久久久久亚洲色欲| 大香蕉婷婷| 超碰偷拍| 国语av最新自产拍在线观看| 人人搡人人肉久久精品| 亚洲中文字幕熟女| 亚州精品一区二区三区香中文字幕在线| 精品二区三四区五电影 | 青青网三级视频| 熟女熟妇一区二区三四区| 日韩AV一起草| 91日日夜夜| 黑丝自慰喷水网站| 操淫穴亚洲五月丁香 | 久久精品店| 激情综合网激情五月天| 久久日韩肥臀| 六月丁香啪啪| 四虎在线视频| 东京热免费视频| 人妻少妇精品久久久久久| 亚洲五月婷| 亚洲少妇视频| 日韩精品区二区三区不卡| 丝袜美腿丝袜| 亚洲人妻av| 亚洲天堂2020| 色色色色色色色色色色色色色色综合| 青草一区二区| 天天欧美色| 亚洲欧美日韩中文播放| 亚洲男人的天堂V| 女欧美一区二三区| 欧美视频第二页| 免费精品人妻一区二区三| 国产日韩欧美| 欧美亚洲中文字幕| 玖玖爱视频网站| 很很干很很操| 亚洲 欧美 精品专区 极品| 亚洲第一页欧美| 亚洲h片在线免费观看| 亚洲天堂日本| 欧美国产日韩高清在线| 98久久超碰| 中文字幕一区二区三区人妻少妇在线| 日韩无码精品综合久久| 日韩淫色网| 这里只有精品视频在线| 国产精品人妻无码久久久互動交流| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 日韩精品9区| 2018色综合天天操| 97色碰| 另类 综合 日韩 欧美 亚洲| 欧美亚洲日本激情在线| 亚洲风情在线观看| 无码人妻丰满熟妇奶水区毛片| 岛国AB视频| 日日躁夜夜躁狠狠躁超爽| 高清不卡一二三区视频......| 精品人妻中文字幕4399| 久操电影网| 黄色二级片网站| 免费av大片| 超碰色综合| B049AV在线播放| 防屏蔽在线视频| 少妇一级婬片免费放一级a性色.| 一二三卡欧美日韩人妻免费精品| 日韩人妻少妇中文字幕| 超碰成人公开| 躁躁躁日日躁2020| 天天干人妻| 密桃99999| 日韩人妻播放| 中文字幕乱码在线| 伊人久久亚洲色欲综合网站| AV天堂丝袜| 日本道久久综合色色| 日韩一级久久毛片| 精品免费成人久久| 精品十三区| 天天91~综合入口| 亚洲欧综合另类无码一区| 欧美综合天天| 人妻精品一区一区三区蜜桃91| 国产有码一区| 丁香六月婷| 国产精品制服丝袜清纯唯美| 欧美性第一页| 麻豆一区二区三区在线看| 黄色不卡视频| 国产怡红院| 婷婷综合久久| av在线免费一区二区| 亚洲**2021在线观看| 2017天天插| 另类图片五月天| 久色99999| 蜜桃在线观看一区二区三区 | 91 手机在线播放 绯色| 在线观看日韩av不卡| 免费黄色片。| 成全动漫视频观看免费下载| 殴美性天天| 国产精品久久久午夜夜伦鲁鲁| 亚洲爱爱视频一区二区| 日本啊啊啊啊啊视频| 国产精品熟女AV中文字幕在线播放| 色色五月天婷婷| 97最新在线播放视频| 久久久久亚洲Aⅴ无码| 欧美性爱日韩性爱| 久久久久亚洲av综合波多野制衣| av网站免费看| 美女久久久| 国产剧情在线| 欧美碰碰综合色| 久久久久女教师免费一区 | 亚欧国产无码精品在线| 老司机射| 午夜理论片在线观看免费| 无码高清国产AV| 亚洲欧洲综合成人av一区| 黑人精品一区二区在线播放| 人人性爱视频免费| 无码人妻精品一区二区三区99不卡| 东北毛片| 人妻少妇久久中文字幕一区二区 麻豆| 青青青青青手机视频| 男人精品天堂一区| 亚洲国产欧美一区二区潘金莲| 啊啊啊操死我| 中文字幕一区二区视频在线观看| 亚洲高清综合网| 久草成人| 亚洲码在线中文在线观看| 亚洲电影中字一区二区| 亚洲性爱免费电影|