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

ARTICLE DETAIL

資訊詳情

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

Java輕量級(jí)規(guī)則引擎Aviator實(shí)戰(zhàn):從表達(dá)式求值到電商促銷(xiāo)系統(tǒng)設(shè)計(jì)

Java輕量級(jí)規(guī)則引擎Aviator實(shí)戰(zhàn):從表達(dá)式求值到電商促銷(xiāo)系統(tǒng)設(shè)計(jì) 1. 項(xiàng)目概述為什么我們需要一個(gè)輕量級(jí)規(guī)則引擎如果你是一名后端開(kāi)發(fā)者或者負(fù)責(zé)過(guò)任何需要處理復(fù)雜業(yè)務(wù)邏輯的系統(tǒng)你一定對(duì)“if-else地獄”深?lèi)和唇^。當(dāng)一個(gè)促銷(xiāo)活動(dòng)有十幾種優(yōu)惠券疊加規(guī)則或者一個(gè)風(fēng)控策略需要根據(jù)幾十個(gè)用戶屬性動(dòng)態(tài)判斷時(shí)硬編碼的業(yè)務(wù)邏輯會(huì)迅速膨脹成一團(tuán)難以維護(hù)的“意大利面條代碼”。每次業(yè)務(wù)調(diào)整都意味著一次心驚膽戰(zhàn)的代碼修改、測(cè)試和上線。這時(shí)候一個(gè)能將業(yè)務(wù)規(guī)則從代碼中剝離出來(lái)的“規(guī)則引擎”就成了救星。在眾多規(guī)則引擎中Drools以其功能強(qiáng)大而聞名但其學(xué)習(xí)曲線陡峭、依賴繁重對(duì)于許多中小型項(xiàng)目來(lái)說(shuō)有點(diǎn)“殺雞用牛刀”的感覺(jué)。而Aviator則像一把精巧的瑞士軍刀。它是一個(gè)高性能、輕量級(jí)的Java表達(dá)式求值引擎通過(guò)將規(guī)則表達(dá)為簡(jiǎn)單的字符串表達(dá)式實(shí)現(xiàn)了業(yè)務(wù)邏輯的動(dòng)態(tài)配置和熱更新。你可以把它理解為一個(gè)超級(jí)計(jì)算器不僅能算11更能根據(jù)你定義的規(guī)則計(jì)算出“用戶等級(jí)為VIP且訂單金額大于1000時(shí)打8.5折”這樣的復(fù)雜業(yè)務(wù)結(jié)果。我最初接觸Aviator是在一個(gè)快速迭代的電商營(yíng)銷(xiāo)項(xiàng)目中頻繁變動(dòng)的滿減、折扣、積分規(guī)則讓我們疲于奔命。引入Aviator后我們將上百條規(guī)則配置到了數(shù)據(jù)庫(kù)中產(chǎn)品經(jīng)理通過(guò)后臺(tái)界面就能調(diào)整規(guī)則參數(shù)開(kāi)發(fā)人員徹底從“規(guī)則發(fā)布流程”中解放出來(lái)。它的核心魅力在于“輕”和“快”——不依賴復(fù)雜的規(guī)則語(yǔ)言直接用類(lèi)Java語(yǔ)法和內(nèi)置函數(shù)就能表達(dá)絕大多數(shù)業(yè)務(wù)邏輯編譯執(zhí)行性能接近原生Java代碼。對(duì)于Java技術(shù)棧的團(tuán)隊(duì)來(lái)說(shuō)幾乎可以做到開(kāi)箱即用學(xué)習(xí)成本極低。這篇教程我將從一個(gè)多年實(shí)戰(zhàn)者的角度帶你從零開(kāi)始不僅學(xué)會(huì)Aviator的基本用法更會(huì)深入其設(shè)計(jì)思想、性能優(yōu)化技巧和實(shí)際落地中的各種“坑”目標(biāo)是讓你看完就能在項(xiàng)目中穩(wěn)健地用起來(lái)。2. Aviator規(guī)則引擎核心設(shè)計(jì)思想與快速上手2.1 核心設(shè)計(jì)思想表達(dá)式即規(guī)則與Drools等基于Rete算法、擁有自己一套完整規(guī)則語(yǔ)言DRL的“重型”引擎不同Aviator的設(shè)計(jì)哲學(xué)極其簡(jiǎn)潔一切規(guī)則都可以歸結(jié)為一個(gè)表達(dá)式對(duì)這個(gè)表達(dá)式求值得到的結(jié)果就是規(guī)則的執(zhí)行結(jié)論。這個(gè)表達(dá)式是一個(gè)字符串比如amount 100 userLevel “VIP”。Aviator的核心工作就是解析這個(gè)字符串將其編譯成Java字節(jié)碼或直接解釋執(zhí)行然后在給定的“環(huán)境”一個(gè)包含變量amount和userLevel的Map中執(zhí)行它并返回布爾值true或false。這種設(shè)計(jì)帶來(lái)了幾個(gè)巨大優(yōu)勢(shì)學(xué)習(xí)成本低表達(dá)式語(yǔ)法高度類(lèi)似Java任何有編程基礎(chǔ)的開(kāi)發(fā)者都能在5分鐘內(nèi)看懂并編寫(xiě)。集成簡(jiǎn)單只需引入一個(gè)輕量的jar包無(wú)需啟動(dòng)額外的規(guī)則服務(wù)。性能優(yōu)異編譯后的表達(dá)式以Java字節(jié)碼運(yùn)行速度極快。靈活度高規(guī)則可以作為字符串存儲(chǔ)在數(shù)據(jù)庫(kù)、配置中心甚至前端實(shí)現(xiàn)真正的動(dòng)態(tài)配置。它的核心對(duì)象只有兩個(gè)表達(dá)式Expression和執(zhí)行環(huán)境MapString, Object。你定義表達(dá)式準(zhǔn)備環(huán)境數(shù)據(jù)然后執(zhí)行獲取結(jié)果。大道至簡(jiǎn)。2.2 五分鐘快速上手你的第一個(gè)Aviator程序理論說(shuō)再多不如動(dòng)手一試。我們從一個(gè)最簡(jiǎn)單的例子開(kāi)始假設(shè)我們要判斷一個(gè)訂單是否滿足包郵條件訂單金額大于等于88元。首先在你的Maven項(xiàng)目中引入依賴以最新穩(wěn)定版為例請(qǐng)查閱官方倉(cāng)庫(kù)獲取最新版本dependency groupIdcom.googlecode.aviator/groupId artifactIdaviator/artifactId version5.4.1/version /dependency接下來(lái)我們寫(xiě)一段Java代碼import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.Expression; import java.util.HashMap; import java.util.Map; public class AviatorQuickStart { public static void main(String[] args) { // 1. 定義規(guī)則表達(dá)式一個(gè)簡(jiǎn)單的布爾表達(dá)式 String rule “amount 88”; // 2. 編譯表達(dá)式。這一步會(huì)進(jìn)行語(yǔ)法解析和編譯是開(kāi)銷(xiāo)相對(duì)較大的操作。 // 通常建議對(duì)不變的規(guī)則進(jìn)行緩存。 Expression compiledExp AviatorEvaluator.compile(rule); // 3. 準(zhǔn)備執(zhí)行環(huán)境數(shù)據(jù)上下文 MapString, Object env new HashMap(); env.put(“amount”, 99.5); // 訂單金額99.5元 // 4. 執(zhí)行表達(dá)式傳入環(huán)境數(shù)據(jù) Boolean result (Boolean) compiledExp.execute(env); // 5. 輸出結(jié)果 System.out.println(“訂單是否包郵” result); // 輸出訂單是否包郵true } }就是這么簡(jiǎn)單你已經(jīng)完成了一個(gè)規(guī)則的執(zhí)行。你可以嘗試修改env.put(“amount”, 50)結(jié)果會(huì)變成false。注意AviatorEvaluator.compile()方法在首次編譯某個(gè)表達(dá)式時(shí)有一定開(kāi)銷(xiāo)。在生產(chǎn)環(huán)境中一定要對(duì)編譯后的Expression對(duì)象進(jìn)行緩存避免每次執(zhí)行都重新編譯。Aviator內(nèi)部自帶了一個(gè)全局的LRU緩存但為了更精細(xì)的控制我通常使用Guava Cache或Caffeine自己維護(hù)一個(gè)業(yè)務(wù)級(jí)的緩存池。2.3 表達(dá)式語(yǔ)法初探不僅僅是比較Aviator的表達(dá)式語(yǔ)法非常豐富支持絕大多數(shù)你需要的操作算術(shù)運(yùn)算,-,*,/,%(取模)。例如(price * quantity) * (1 - discount)。邏輯運(yùn)算,,,,,!,,||,!。例如age 18 age 60。三元運(yùn)算符a ? b : c。這是實(shí)現(xiàn)簡(jiǎn)單條件分支的利器。例如score 60 ? “及格” : “不及格”。正則匹配通過(guò)內(nèi)置函數(shù)regex實(shí)現(xiàn)。例如regex(pattern, str)更常用的是str ~ pattern這個(gè)操作符它返回一個(gè)Boolean。例如判斷手機(jī)號(hào)phoneNumber ~ ‘^1[3-9]\\d{9}$’。字符串操作連接內(nèi)置函數(shù)如string.contains(s1, s2),string.startsWith(s),string.length(s)等。集合操作支持?jǐn)?shù)組、List、Map的訪問(wèn)。例如list[0],map[‘key’]。一個(gè)更復(fù)雜的例子組合風(fēng)控規(guī)則String riskRule “(userAge 18 || userAge 70) “ “(transactionAmount 5000 || “ “(deviceCity ! registeredCity hourOfDay 22))”; // 解讀用戶年齡小于18或大于70并且交易金額大于5000 或 設(shè)備所在城市與注冊(cè)城市不同且交易時(shí)間在晚上10點(diǎn)后掌握了這些語(yǔ)法你已經(jīng)能覆蓋80%的日常規(guī)則場(chǎng)景了。但Aviator的強(qiáng)大遠(yuǎn)不止于此接下來(lái)我們深入其高級(jí)特性和性能核心。3. 核心細(xì)節(jié)解析函數(shù)、數(shù)據(jù)類(lèi)型與性能調(diào)優(yōu)3.1 自定義函數(shù)擴(kuò)展規(guī)則能力的邊界雖然內(nèi)置函數(shù)和語(yǔ)法已經(jīng)很強(qiáng)但業(yè)務(wù)邏輯千變?nèi)f化。比如你需要判斷一個(gè)用戶是否在某個(gè)“黑名單ID列表”中或者需要調(diào)用一個(gè)遠(yuǎn)程服務(wù)獲取用戶的信用分。這時(shí)你就需要自定義函數(shù)。Aviator允許你將任何Java方法注冊(cè)為表達(dá)式中的函數(shù)。這是它將規(guī)則邏輯與系統(tǒng)能力連接起來(lái)的關(guān)鍵橋梁。方式一實(shí)現(xiàn)AviatorFunction接口推薦這種方式更規(guī)范支持可變參數(shù)能獲得參數(shù)類(lèi)型信息。import com.googlecode.aviator.runtime.function.AbstractFunction; import com.googlecode.aviator.runtime.function.FunctionUtils; import com.googlecode.aviator.runtime.type.AviatorBoolean; import com.googlecode.aviator.runtime.type.AviatorObject; import java.util.Map; import java.util.HashSet; import java.util.Set; /** * 自定義函數(shù)判斷用戶ID是否在黑名單中 * 函數(shù)名isInBlacklist * 用法isInBlacklist(userId) */ public class IsInBlacklistFunction extends AbstractFunction { // 模擬一個(gè)黑名單集合 private static final SetString BLACKLIST new HashSet(); static { BLACKLIST.add(“U10001”); BLACKLIST.add(“U10002”); } Override public String getName() { return “isInBlacklist”; // 在表達(dá)式中使用的函數(shù)名 } Override public AviatorObject call(MapString, Object env, AviatorObject arg1) { // 1. 從AviatorObject中獲取實(shí)際參數(shù)值 String userId FunctionUtils.getStringValue(arg1, env); // 2. 執(zhí)行業(yè)務(wù)邏輯 boolean isInList BLACKLIST.contains(userId); // 3. 返回Aviator支持的類(lèi)型 return AviatorBoolean.valueOf(isInList); } } // 注冊(cè)并使用 public class CustomFunctionDemo { public static void main(String[] args) { // 注冊(cè)自定義函數(shù) AviatorEvaluator.addFunction(new IsInBlacklistFunction()); String rule “isInBlacklist(userId)”; // 使用自定義函數(shù) Expression exp AviatorEvaluator.compile(rule); MapString, Object env new HashMap(); env.put(“userId”, “U10001”); Boolean result (Boolean) exp.execute(env); System.out.println(“用戶是否在黑名單” result); // 輸出true } }方式二直接注冊(cè)Java靜態(tài)方法對(duì)于簡(jiǎn)單的工具方法這種方式更快捷。public class BizUtils { // 假設(shè)這是一個(gè)計(jì)算用戶等級(jí)的函數(shù) public static String calculateLevel(int purchaseCount) { if (purchaseCount 100) return “鉆石”; else if (purchaseCount 50) return “黃金”; else if (purchaseCount 10) return “白銀”; else return “普通”; } } // 注冊(cè) AviatorEvaluator.addFunction(new FunctionLoader() { Override public AviatorFunction onFunctionNotFound(String name) { if (“calculateLevel”.equals(name)) { // 將Java靜態(tài)方法包裝成Aviator函數(shù) return new AbstractFunction() { Override public String getName() { return name; } Override public AviatorObject call(MapString, Object env, AviatorObject arg1) { Integer count FunctionUtils.getNumberValue(arg1, env).intValue(); String level BizUtils.calculateLevel(count); return new AviatorString(level); } }; } return null; } });實(shí)操心得自定義函數(shù)是Aviator接入企業(yè)級(jí)應(yīng)用的靈魂。但務(wù)必注意兩點(diǎn)第一函數(shù)內(nèi)部不要做耗時(shí)的IO操作如數(shù)據(jù)庫(kù)查詢、遠(yuǎn)程調(diào)用這會(huì)讓規(guī)則引擎的性能優(yōu)勢(shì)蕩然無(wú)存。正確的做法是在執(zhí)行規(guī)則前將所需數(shù)據(jù)預(yù)先查詢好并放入環(huán)境變量中。第二自定義函數(shù)應(yīng)保持無(wú)狀態(tài)和線程安全因?yàn)樗鼈兛赡鼙欢鄠€(gè)線程并發(fā)調(diào)用。3.2 數(shù)據(jù)類(lèi)型與空值安全避免運(yùn)行時(shí)“驚喜”Aviator有自己的類(lèi)型系統(tǒng)在執(zhí)行時(shí)會(huì)與Java類(lèi)型自動(dòng)轉(zhuǎn)換。理解這一點(diǎn)對(duì)避免ClassCastException至關(guān)重要。數(shù)字類(lèi)型Aviator內(nèi)部統(tǒng)一使用Number可能是Long,Double,BigInteger,BigDecimal。使用FunctionUtils.getNumberValue()獲取最安全。字符串對(duì)應(yīng)Java的String。布爾值對(duì)應(yīng)Java的Boolean。集合與數(shù)組支持Java的List,Map,Array在表達(dá)式中可以用[ ]訪問(wèn)??罩祅ilAviator用nil表示空。在表達(dá)式中判斷空值要用 nil或! nil。例如userInfo nil ? “default” : userInfo.name。一個(gè)常見(jiàn)的坑是空指針異常。雖然Aviator在訪問(wèn)不存在的變量時(shí)會(huì)返回nil但如果你在自定義函數(shù)或某些操作中直接使用了可能為null的Java對(duì)象就會(huì)出錯(cuò)。最佳實(shí)踐在準(zhǔn)備環(huán)境數(shù)據(jù)時(shí)對(duì)于可能為null的變量主動(dòng)進(jìn)行處理。MapString, Object env new HashMap(); User user userService.getUser(id); // 不好的做法直接放入可能為null的對(duì)象 // env.put(“user”, user); // 好的做法放入一個(gè)安全的包裝對(duì)象或提前處理 env.put(“user”, Optional.ofNullable(user).orElse(NullObject.getInstance())); // 或者在表達(dá)式中處理空值user ! nil ? user.level : ‘普通’3.3 性能調(diào)優(yōu)核心編譯緩存與表達(dá)式優(yōu)化Aviator的性能之所以出色關(guān)鍵在于“編譯”。但編譯本身有成本。以下是幾個(gè)關(guān)鍵的性能優(yōu)化點(diǎn)1. 表達(dá)式編譯緩存這是最重要的優(yōu)化。Aviator的頂層入口AviatorEvaluator默認(rèn)使用一個(gè)全局的LRU緩存默認(rèn)最大緩存100個(gè)表達(dá)式。對(duì)于生產(chǎn)環(huán)境這通常不夠。// 1. 使用自定義的緩存如Guava Cache import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutionException; public class ExpressionCache { private static final LoadingCacheString, Expression CACHE CacheBuilder.newBuilder() .maximumSize(1000) // 根據(jù)規(guī)則數(shù)量調(diào)整 .expireAfterWrite(10, TimeUnit.MINUTES) // 規(guī)則可能更新設(shè)置過(guò)期時(shí)間 .build(new CacheLoaderString, Expression() { Override public Expression load(String expression) { // 緩存未命中時(shí)編譯并加載 return AviatorEvaluator.compile(expression, true); // true表示啟用緩存 } }); public static Expression getCompiledExpression(String rule) { try { return CACHE.get(rule); } catch (ExecutionException e) { throw new RuntimeException(“Failed to compile expression: ” rule, e); } } } // 使用時(shí)Expression exp ExpressionCache.getCompiledExpression(ruleString);2. 啟用編譯常量折疊Constant Folding在編譯時(shí)AviatorEvaluator.compile(expression, true)的第二個(gè)參數(shù)設(shè)為true可以啟用常量折疊優(yōu)化。例如表達(dá)式3 5 * 2會(huì)在編譯時(shí)直接計(jì)算為13而不會(huì)在每次執(zhí)行時(shí)都計(jì)算。3. 避免在表達(dá)式中進(jìn)行復(fù)雜字符串拼接像“Hello, ” name “!”這樣的拼接在表達(dá)式內(nèi)部會(huì)產(chǎn)生臨時(shí)對(duì)象。如果name是變量這無(wú)法避免。但如果都是常量不如直接在Java層拼接好再傳入。更復(fù)雜的字符串處理考慮使用自定義函數(shù)。4. 基準(zhǔn)測(cè)試與監(jiān)控對(duì)于核心規(guī)則務(wù)必進(jìn)行基準(zhǔn)測(cè)試。使用JMHJava Microbenchmark Harness來(lái)測(cè)試規(guī)則執(zhí)行的平均時(shí)間、吞吐量。監(jiān)控緩存命中率、編譯頻率等指標(biāo)它們能直觀反映你的使用方式是否高效。4. 實(shí)戰(zhàn)構(gòu)建一個(gè)可配置的電商促銷(xiāo)規(guī)則引擎讓我們通過(guò)一個(gè)完整的實(shí)戰(zhàn)案例將前面所有知識(shí)串聯(lián)起來(lái)。假設(shè)我們要為一個(gè)電商平臺(tái)設(shè)計(jì)一個(gè)促銷(xiāo)規(guī)則引擎支持多種規(guī)則類(lèi)型滿減、折扣、贈(zèng)品的靈活配置和組合執(zhí)行。4.1 系統(tǒng)設(shè)計(jì)與數(shù)據(jù)模型我們的設(shè)計(jì)目標(biāo)是規(guī)則配置在數(shù)據(jù)庫(kù)里引擎讀取配置動(dòng)態(tài)生成Aviator表達(dá)式并執(zhí)行。數(shù)據(jù)庫(kù)表設(shè)計(jì)簡(jiǎn)化CREATE TABLE promotion_rule ( id BIGINT PRIMARY KEY, rule_name VARCHAR(100), rule_type VARCHAR(20), — ‘DISCOUNT’折扣, ‘FULL_REDUCTION’滿減, ‘GIFT’贈(zèng)品 condition_expression TEXT, — Aviator條件表達(dá)式 action_expression TEXT, — 執(zhí)行動(dòng)作的表達(dá)式或參數(shù) priority INT, — 優(yōu)先級(jí)數(shù)字越大越優(yōu)先 enabled BOOLEAN );Java領(lǐng)域模型Data public class PromotionRule { private Long id; private String ruleName; private RuleType ruleType; // 枚舉 private String conditionExpression; // 如”totalAmount 100 memberLevel ‘GOLD’” private String actionExpression; // 如對(duì)于折扣”{‘type’:’DISCOUNT’, ‘value’:0.9}” 對(duì)于滿減”{‘type’:’FULL_REDUCTION’, ‘threshold’:200, ‘reduce’:50}” private Integer priority; private Boolean enabled; } Data public class OrderContext { private String userId; private String memberLevel; // 會(huì)員等級(jí) private BigDecimal totalAmount; // 訂單總金額 private ListString skuList; // 商品SKU列表 private MapString, Object extraInfo; // 其他擴(kuò)展信息 // 執(zhí)行結(jié)果 private ListPromotionResult appliedResults new ArrayList(); } Data public class PromotionResult { private String ruleName; private RuleType ruleType; private BigDecimal discountAmount; // 優(yōu)惠金額 private String giftSku; // 贈(zèng)品SKU // … 其他結(jié)果信息 }4.2 規(guī)則引擎核心執(zhí)行器實(shí)現(xiàn)這是最核心的部分負(fù)責(zé)加載規(guī)則、編譯表達(dá)式、執(zhí)行匹配并應(yīng)用動(dòng)作。import com.googlecode.aviator.Expression; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; Component public class PromotionEngine { // 規(guī)則緩存 規(guī)則ID, 編譯后的條件表達(dá)式 private MapLong, Expression conditionCache new ConcurrentHashMap(); // 規(guī)則列表緩存 private ListPromotionRule ruleCache new ArrayList(); Autowired private PromotionRuleMapper ruleMapper; // 假設(shè)的數(shù)據(jù)庫(kù)訪問(wèn)層 /** * 初始化加載所有啟用規(guī)則并編譯 */ PostConstruct public void init() { refreshRuleCache(); } /** * 刷新規(guī)則緩存可被定時(shí)任務(wù)或管理后臺(tái)調(diào)用 */ public void refreshRuleCache() { ListPromotionRule enabledRules ruleMapper.selectEnabledRules(); this.ruleCache enabledRules; this.conditionCache.clear(); for (PromotionRule rule : enabledRules) { try { // 編譯條件表達(dá)式并緩存 Expression exp AviatorEvaluator.compile(rule.getConditionExpression(), true); conditionCache.put(rule.getId(), exp); } catch (Exception e) { // 記錄編譯錯(cuò)誤日志此規(guī)則失效 log.error(“編譯促銷(xiāo)規(guī)則失敗 ruleId{}, expression{}”, rule.getId(), rule.getConditionExpression(), e); } } // 按優(yōu)先級(jí)排序 ruleCache.sort(Comparator.comparing(PromotionRule::getPriority).reversed()); } /** * 對(duì)訂單執(zhí)行所有促銷(xiāo)規(guī)則 */ public OrderContext execute(OrderContext orderContext) { // 準(zhǔn)備Aviator執(zhí)行環(huán)境 MapString, Object env prepareExecutionEnv(orderContext); for (PromotionRule rule : ruleCache) { Expression conditionExp conditionCache.get(rule.getId()); if (conditionExp null) { continue; // 編譯失敗的規(guī)則跳過(guò) } try { // 1. 執(zhí)行條件判斷 Boolean isMatch (Boolean) conditionExp.execute(env); if (Boolean.TRUE.equals(isMatch)) { // 2. 規(guī)則匹配執(zhí)行動(dòng)作 PromotionResult result applyAction(rule, orderContext, env); orderContext.getAppliedResults().add(result); // 3. 更新環(huán)境例如應(yīng)用折扣后訂單金額變化可能影響后續(xù)規(guī)則 updateEnvAfterAction(env, result); } } catch (Exception e) { log.error(“執(zhí)行促銷(xiāo)規(guī)則異常 ruleId{}”, rule.getId(), e); // 根據(jù)業(yè)務(wù)需求決定是跳過(guò)此規(guī)則還是終止執(zhí)行 } } return orderContext; } /** * 準(zhǔn)備執(zhí)行環(huán)境將OrderContext中的屬性轉(zhuǎn)換為Aviator可用的變量 */ private MapString, Object prepareExecutionEnv(OrderContext ctx) { MapString, Object env new HashMap(); env.put(“userId”, ctx.getUserId()); env.put(“memberLevel”, ctx.getMemberLevel()); env.put(“totalAmount”, ctx.getTotalAmount()); // Aviator支持BigDecimal env.put(“skuList”, ctx.getSkuList()); // 可以放入一些工具函數(shù)或常用數(shù)據(jù) env.put(“Math”, Math.class); // 允許在表達(dá)式中使用Math.max等 // 例如判斷商品是否在列表中string.contains(skuList, ‘SKU123’) return env; } /** * 應(yīng)用規(guī)則動(dòng)作 */ private PromotionResult applyAction(PromotionRule rule, OrderContext ctx, MapString, Object env) { PromotionResult result new PromotionResult(); result.setRuleName(rule.getRuleName()); result.setRuleType(rule.getRuleType()); // 這里根據(jù)actionExpression進(jìn)行解析和執(zhí)行 // 實(shí)際項(xiàng)目中actionExpression可能是一段JSON配置或另一個(gè)Aviator表達(dá)式 switch (rule.getRuleType()) { case DISCOUNT: // 假設(shè)actionExpression是JSON: {“discountRate”: 0.9} MapString, Object actionConfig parseActionConfig(rule.getActionExpression()); BigDecimal discountRate new BigDecimal(actionConfig.get(“discountRate”).toString()); BigDecimal discountAmount ctx.getTotalAmount().multiply(BigDecimal.ONE.subtract(discountRate)); result.setDiscountAmount(discountAmount.setScale(2, BigDecimal.ROUND_HALF_UP)); break; case FULL_REDUCTION: MapString, Object actionConfig parseActionConfig(rule.getActionExpression()); BigDecimal threshold new BigDecimal(actionConfig.get(“threshold”).toString()); BigDecimal reduce new BigDecimal(actionConfig.get(“reduce”).toString()); if (ctx.getTotalAmount().compareTo(threshold) 0) { result.setDiscountAmount(reduce); } break; case GIFT: // 添加贈(zèng)品邏輯 result.setGiftSku(parseGiftSku(rule.getActionExpression())); break; } return result; } private void updateEnvAfterAction(MapString, Object env, PromotionResult result) { // 例如應(yīng)用了折扣后需要更新環(huán)境中的訂單金額以便后續(xù)規(guī)則基于新金額判斷 if (result.getDiscountAmount() ! null) { BigDecimal currentAmount (BigDecimal) env.get(“totalAmount”); env.put(“totalAmount”, currentAmount.subtract(result.getDiscountAmount())); } } }4.3 規(guī)則配置與管理界面思路有了引擎還需要一個(gè)讓運(yùn)營(yíng)人員能方便配置規(guī)則的管理后臺(tái)。這里提供一些前端配置的思路條件配置可視化可以設(shè)計(jì)一個(gè)拖拽或表單生成器將“用戶等級(jí)”、“訂單金額”、“商品類(lèi)目”等條件因子變成下拉框、輸入框后端將其拼接成Aviator表達(dá)式。例如條件1memberLevel等于 [黃金]條件2totalAmount大于 [100]邏輯關(guān)系 [且]生成的表達(dá)式memberLevel ‘黃金’ totalAmount 100動(dòng)作配置模板化針對(duì)不同的ruleType提供不同的動(dòng)作表單。折扣輸入“折扣率”0.9代表9折。滿減輸入“滿X元”和“減Y元”。贈(zèng)品選擇贈(zèng)品SKU。表達(dá)式預(yù)覽與測(cè)試在保存規(guī)則前提供一個(gè)測(cè)試區(qū)域讓運(yùn)營(yíng)人員輸入模擬的訂單數(shù)據(jù)JSON格式實(shí)時(shí)查看規(guī)則是否匹配、計(jì)算結(jié)果如何。這能極大減少配置錯(cuò)誤。版本與灰度重要的規(guī)則可以引入版本管理和灰度發(fā)布。例如新規(guī)則先對(duì)10%的用戶生效觀察效果后再全量。5. 高級(jí)特性與深度優(yōu)化5.1 腳本與多行表達(dá)式處理復(fù)雜邏輯對(duì)于非常復(fù)雜的規(guī)則單行表達(dá)式可能難以維護(hù)。Aviator支持多行表達(dá)式和順序執(zhí)行類(lèi)似于一個(gè)簡(jiǎn)單的腳本。String complexRule “ — 計(jì)算基礎(chǔ)折扣 baseDiscount userLevel ‘VIP’ ? 0.15 : 0.05; — 計(jì)算活動(dòng)額外折扣 extraDiscount 0; if (contains(skuList, ‘FLASH_SALE_SKU’)) { extraDiscount 0.1; } else if (hourOfDay 20 hourOfDay 22) { extraDiscount 0.05; } — 計(jì)算總折扣率最高不超過(guò)0.3 totalDiscount baseDiscount extraDiscount; totalDiscount 0.3 ? 0.3 : totalDiscount; ”; Expression exp AviatorEvaluator.compile(complexRule); MapString, Object env new HashMap(); env.put(“userLevel”, “VIP”); env.put(“skuList”, Arrays.asList(“NORMAL_SKU”, “FLASH_SALE_SKU”)); env.put(“hourOfDay”, 21); // 注意執(zhí)行多行表達(dá)式時(shí)默認(rèn)返回最后一條語(yǔ)句的值 BigDecimal finalDiscount (BigDecimal) exp.execute(env); System.out.println(“最終折扣率” finalDiscount); // 輸出0.25注意事項(xiàng)多行表達(dá)式功能強(qiáng)大但過(guò)度使用會(huì)讓規(guī)則變得像代碼一樣難以管理違背了規(guī)則引擎“聲明式”配置的初衷。它更適合用來(lái)封裝一些復(fù)雜的計(jì)算過(guò)程而核心的業(yè)務(wù)條件判斷仍應(yīng)盡量保持簡(jiǎn)潔清晰。5.2 自定義語(yǔ)法與運(yùn)算符重載Aviator允許你自定義運(yùn)算符通過(guò)AviatorEvaluator.addOpFunction和修改語(yǔ)法特性通過(guò)AviatorEvaluator.setOption但這屬于高級(jí)用法除非有非常特殊的需求否則不建議修改。保持與標(biāo)準(zhǔn)語(yǔ)法的兼容性更利于團(tuán)隊(duì)協(xié)作和后期維護(hù)。一個(gè)相對(duì)安全的自定義是添加常量// 定義一些業(yè)務(wù)常量 AviatorEvaluator.defineConstant(“MAX_ORDER_AMOUNT”, 10000); AviatorEvaluator.defineConstant(“VIP_LEVEL_LIST”, Arrays.asList(“GOLD”, “DIAMOND”)); // 在表達(dá)式中直接使用 String rule “totalAmount MAX_ORDER_AMOUNT contains(VIP_LEVEL_LIST, userLevel)”;5.3 與Spring生態(tài)的深度集成在Spring Boot項(xiàng)目中我們可以將PromotionEngine包裝得更加優(yōu)雅。配置化將Aviator的緩存大小、啟用特性等放在application.yml中。監(jiān)聽(tīng)規(guī)則變更利用Spring的ApplicationEvent或集成配置中心如Nacos、Apollo在規(guī)則更新時(shí)觸發(fā)refreshRuleCache。健康檢查通過(guò)Spring Boot Actuator的HealthIndicator暴露規(guī)則引擎的健康狀態(tài)如緩存加載是否成功、最近一次規(guī)則執(zhí)行的平均耗時(shí)等。AOP切面可以為規(guī)則執(zhí)行方法添加切面統(tǒng)一進(jìn)行日志記錄、性能監(jiān)控和異常處理。Aspect Component Slf4j public class RuleExecutionAspect { Around(“execution(* com.yourcompany.engine..*.execute(..))”) public Object monitorRuleExecution(ProceedingJoinPoint pjp) throws Throwable { String ruleEngineName pjp.getTarget().getClass().getSimpleName(); long startTime System.currentTimeMillis(); try { Object result pjp.proceed(); long duration System.currentTimeMillis() - startTime; log.debug(“規(guī)則引擎 {} 執(zhí)行耗時(shí): {} ms”, ruleEngineName, duration); // 可以推送到監(jiān)控系統(tǒng)如Micrometer Metrics.timer(“rule.engine.execution.time”, “engine”, ruleEngineName).record(duration, TimeUnit.MILLISECONDS); return result; } catch (Exception e) { log.error(“規(guī)則引擎 {} 執(zhí)行失敗”, ruleEngineName, e); Metrics.counter(“rule.engine.execution.error”, “engine”, ruleEngineName).increment(); throw e; } } }6. 常見(jiàn)問(wèn)題、排查技巧與選型思考6.1 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查步驟與解決方案執(zhí)行時(shí)報(bào)ClassCastException1. 環(huán)境變量中的Java類(lèi)型與表達(dá)式預(yù)期不符。2. 自定義函數(shù)返回值類(lèi)型錯(cuò)誤。1. 檢查env.put的值類(lèi)型確保與表達(dá)式中使用方式匹配。例如表達(dá)式是age 18則env中的age應(yīng)為Integer或Long而不是String。2. 在自定義函數(shù)中使用FunctionUtils系列方法安全轉(zhuǎn)換類(lèi)型。表達(dá)式編譯失敗報(bào)語(yǔ)法錯(cuò)誤1. 表達(dá)式字符串有語(yǔ)法錯(cuò)誤拼寫(xiě)、括號(hào)不匹配等。2. 使用了未注冊(cè)的自定義函數(shù)或變量。1. 將表達(dá)式字符串復(fù)制到簡(jiǎn)單的測(cè)試程序中單獨(dú)編譯定位錯(cuò)誤行。2. 使用AviatorEvaluator.validate方法預(yù)先驗(yàn)證表達(dá)式但此方法檢查有限。3.最佳實(shí)踐在規(guī)則管理后臺(tái)提供表達(dá)式“校驗(yàn)”按鈕調(diào)用編譯接口并返回詳細(xì)錯(cuò)誤信息。規(guī)則執(zhí)行結(jié)果始終為false或不符合預(yù)期1. 環(huán)境變量數(shù)據(jù)未正確傳入或值為null/nil。2. 邏輯運(yùn)算符優(yōu)先級(jí)理解錯(cuò)誤。3. 字符串比較未考慮大小寫(xiě)。1. 在執(zhí)行前打印env內(nèi)容確認(rèn)數(shù)據(jù)無(wú)誤。br2. 在復(fù)雜邏輯表達(dá)式中多用括號(hào)()明確優(yōu)先級(jí)例如(a b) || c。br3. 字符串比較使用string.equals_ignore_case(str1, str2) 函數(shù)或提前統(tǒng)一轉(zhuǎn)大小寫(xiě)。性能突然下降1. 未命中緩存每次都在編譯表達(dá)式。2. 表達(dá)式過(guò)于復(fù)雜或自定義函數(shù)中有耗時(shí)操作。3. 環(huán)境變量Map過(guò)大。1. 檢查緩存實(shí)現(xiàn)確認(rèn)緩存大小和淘汰策略是否合理監(jiān)控緩存命中率。2. 對(duì)復(fù)雜表達(dá)式進(jìn)行拆分、簡(jiǎn)化。確保自定義函數(shù)是純內(nèi)存計(jì)算。3. 只將規(guī)則計(jì)算必需的數(shù)據(jù)放入env避免傳入整個(gè)大對(duì)象??罩羔槷惓PE在表達(dá)式中直接調(diào)用了可能返回null的Java對(duì)象的方法或?qū)傩浴?. 使用安全導(dǎo)航操作如果版本支持或三元運(yùn)算符處理空值user ! nil ? user.name : ‘default’。2. 在準(zhǔn)備環(huán)境數(shù)據(jù)時(shí)用Optional或空對(duì)象模式替換null。6.2 Aviator vs Drools如何選擇這是最常被問(wèn)到的問(wèn)題。簡(jiǎn)單對(duì)比如下特性AviatorDrools定位輕量級(jí)表達(dá)式求值引擎企業(yè)級(jí)規(guī)則管理系統(tǒng)BRMS核心模型表達(dá)式求值基于Rete算法的產(chǎn)生式規(guī)則系統(tǒng)學(xué)習(xí)曲線極低Java開(kāi)發(fā)者半小時(shí)上手陡峭需要學(xué)習(xí)DRL語(yǔ)言、Rete算法概念部署與集成一個(gè)Jar包無(wú)外部依賴嵌入應(yīng)用相對(duì)較重可獨(dú)立部署為規(guī)則服務(wù)性能極高編譯后接近原生Java高但推理引擎有一定開(kāi)銷(xiāo)規(guī)則復(fù)雜度適合條件判斷和計(jì)算邏輯復(fù)雜度中等適合復(fù)雜推理、多規(guī)則關(guān)聯(lián)、有狀態(tài)會(huì)話動(dòng)態(tài)更新非常方便更新表達(dá)式字符串即可支持但通常需要整套BRMS管理界面社區(qū)與生態(tài)活躍但功能聚焦非常龐大和成熟屬于JBoss生態(tài)典型場(chǎng)景促銷(xiāo)計(jì)算、風(fēng)控簡(jiǎn)單規(guī)則、動(dòng)態(tài)配置過(guò)濾、字段映射金融風(fēng)控復(fù)雜反欺詐、保險(xiǎn)核保、智能診斷選型建議選擇Aviator如果你的規(guī)則主要是“如果…那么…”的條件判斷和數(shù)值計(jì)算規(guī)則之間相對(duì)獨(dú)立變更頻繁且你希望以最小的成本和最快的速度集成到現(xiàn)有Java應(yīng)用中。它像是你代碼庫(kù)里的一個(gè)“超級(jí)工具類(lèi)”。選擇Drools如果你的業(yè)務(wù)規(guī)則極其復(fù)雜規(guī)則之間存在大量的交叉和關(guān)聯(lián)需要實(shí)現(xiàn)類(lèi)似“專家系統(tǒng)”的推理并且你有專門(mén)的團(tuán)隊(duì)來(lái)維護(hù)這套規(guī)則體系。它更像是一個(gè)獨(dú)立的“規(guī)則大腦”。對(duì)于絕大多數(shù)互聯(lián)網(wǎng)公司的業(yè)務(wù)場(chǎng)景營(yíng)銷(xiāo)、簡(jiǎn)單風(fēng)控、配置化流程Aviator的輕量和高效是巨大的優(yōu)勢(shì)。我個(gè)人的經(jīng)驗(yàn)是先用Aviator只有當(dāng)它的表達(dá)式模型無(wú)法清晰、優(yōu)雅地描述你的業(yè)務(wù)規(guī)則時(shí)才需要考慮Drools。6.3 最后的經(jīng)驗(yàn)之談使用Aviator幾年踩過(guò)一些坑也積累了一些確保項(xiàng)目成功的心得規(guī)則版本化與回滾規(guī)則配置一定要有版本管理。每次修改保存時(shí)記錄舊版本。一旦新規(guī)則上線出現(xiàn)問(wèn)題能快速回滾到上一個(gè)穩(wěn)定版本。這在運(yùn)營(yíng)頻繁調(diào)整規(guī)則的場(chǎng)景下是救命稻草。嚴(yán)格的測(cè)試沙盒線上規(guī)則引擎必須配備一個(gè)與生產(chǎn)環(huán)境數(shù)據(jù)隔離的測(cè)試沙盒。任何新規(guī)則或修改必須在沙盒中用真實(shí)的歷史數(shù)據(jù)或模擬數(shù)據(jù)驗(yàn)證通過(guò)后才能發(fā)布到生產(chǎn)環(huán)境。性能基線監(jiān)控為核心規(guī)則集建立性能基線如平均執(zhí)行時(shí)間P99線。當(dāng)規(guī)則變更導(dǎo)致執(zhí)行時(shí)間顯著偏離基線時(shí)監(jiān)控系統(tǒng)要能告警。這能幫你提前發(fā)現(xiàn)那些不經(jīng)意寫(xiě)出的低效表達(dá)式。表達(dá)式“消毒”如果規(guī)則表達(dá)式來(lái)自不完全受信任的源比如來(lái)自部分開(kāi)放的管理后臺(tái)要警惕表達(dá)式注入風(fēng)險(xiǎn)。避免使用AviatorEvaluator.exec()直接執(zhí)行字符串堅(jiān)持使用compile()??梢钥紤]對(duì)表達(dá)式進(jìn)行白名單過(guò)濾只允許出現(xiàn)特定的變量名和函數(shù)名。文檔與培訓(xùn)為運(yùn)營(yíng)和產(chǎn)品同學(xué)編寫(xiě)清晰的規(guī)則配置文檔用他們能懂的語(yǔ)言而不是代碼語(yǔ)法解釋每個(gè)條件因子的含義。定期進(jìn)行培訓(xùn)減少因誤解導(dǎo)致的配置錯(cuò)誤。Aviator不是一個(gè)龐大的系統(tǒng)而是一個(gè)精致強(qiáng)大的工具。把它用好的關(guān)鍵不在于掌握多少高深特性而在于能否圍繞它構(gòu)建起一套涵蓋配置、測(cè)試、發(fā)布、監(jiān)控的完整工程實(shí)踐。當(dāng)你把這套體系搭建起來(lái)后你會(huì)發(fā)現(xiàn)業(yè)務(wù)變化的壓力不再直接壓在研發(fā)的肩上而是轉(zhuǎn)化為一種可管理、可控制的配置能力。這種解放感正是規(guī)則引擎帶來(lái)的最大價(jià)值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月丁香六月婷婷,婷| 五月婷婷影视| 免费看片操逼| 国产乱子轮XXX农村| 婷婷激情社区| 婷婷丁香基地在线| 五月天五月色婷婷综合| 婷婷射图五月天| 国产又粗又大又爽又黄| 人妻AV在线| 97人人操人| 亚洲AV人人操| 婷婷亚洲五月| 99久久6| 操笔无码| 婷婷五月综合婷婷| 精品乱码视频| 成人噜噜网| 男人的天堂在线婷婷| 色五月综合| 热久久视频99| 性生活久久朋友人妻| 91精品丝袜久久久久久| 丁香婷婷性久久| 国产婷婷色综合AV蜜臀AV| 噜噜网免费视频| 五月丁香六月激情综合网| 综合99在线| 国产美女无遮挡裸体毛片A片| 停停五月色宗合| 深爱激情四射| 五月婷色丁香| 99热99成人| www.韩日视频| 日韩av免费版| 一区二区aV电影免费看| 成人一区在线观看| 色婷婷激情四射视频| 狠狠婷婷综合| 国产首页在线| 婷婷五月开心六月AV| 成人无码髙潮喷水A片| 99综合| 日本三久久| 天天做天天爽| 亚洲天天| 国产真实乱了老女人视频| 婷婷久久综合久| 五月丁香偷拍| 最新高清无码专区| 大香蕉在线99热| 六月成人网| 精品一区二区三区免费毛片爱| 五月婷婷大香蕉| 91碰视频| 婷婷五月成人| 久婷婷久草| 婷婷综合性爱网| av在线播放网站| 久久精品国产AV一区二区三区 | 婷婷五月丁香四射| 9精品在线| 大香蕉啪啪| 91丨九色丨国产打屁股| 任我肏视频精品| 97人人操人人拍| 欧美久久久中文字幕| 亚州欧美黄色电影| 亚洲啪啪啪啪| 综合视频五月| 99热6精品| 亚洲视频图片婷婷五月| www色色com| 久久人妻久久| 怡春院天天干| 丁香婷婷六月婷婷六月婷婷六月婷婷| 天天日,夜夜爽| 激情99在线视频| 另类视频五月天| 中文无码婷婷| 婷婷六月香| 色婷婷AⅤ| 婷婷五月亚洲综合| 综合网五月天123| 五月开心深爱激情网| 五月丁香六月婷婷激情网| 青青草原伊人网| 超碰操网| 婷婷五月天大香蕉在线视频观看| 色婷婷小说| 色综合xx| 91精品国产91久久久久青草| 超碰人人在线观看| 亚洲激情淫网| 玖玖爱资源站| 九九精品re免费视频| 欧美婷婷| 天天综合色| 日本丁香五月| 五月天婷婷色情| 亚洲激情网站无码| 色碰碰视频| 久久在线视频免费观看| 99精品自拍视频| 九月婷婷综合八月丁香在线观看| 久久色五月天| av一区免费看| 欧美英丁香开心快乐六月天网| 亚洲婷婷五月| 丁香伊人五月色婷婷五十路| 婷婷丁香人妻| 人人草人人爱| 秋霞免费三级片| 91精品综合久久久久久五月丁香| 艳妇野外情欲放荡HD| 丁香五月情| 婷婷射婷婷舔| 天天日天天久久青青| 香蕉婷婷色五月| AV五月丁香| 九色91视频| 一二线视频 另类| 亚洲情色一区| 亚洲午夜一区二区| 99九九中文字幕视频| 五月激情丁香五月宗合| 丁香五月婷婷啪啪| 激情小说五月丁香在线视频观看视频| 五月婷婷av| 第四色色六月色综合| 黄色99视频| 五月婷婷啪啪综合网| 国精产品一区一区三区免费视频| 五月婷婷六月丁香综合视频在线| 五月天婷婷久久| 日韩人妻无码精品| 欧美丁香五月97色| 99热碰碰热| 亚洲综合99| 亚洲综合五月天婷婷| 欧美色图天堂网| 亚洲欧美婷婷五月色综合| 99精品偷自拍| 色婷婷久久综合丁香五月| 亚洲综合五月| 婷婷五月花免费视频在线| 久久超视频| 精品婷婷丁香五| 五月婷婷co.m| 奇米影视在线视频| 狠狠高潮精品亚洲1| 91精品91久久久久77777| 五月天激情综合首页| 激情久久久久久久久久久| 91色色色视频| www.天天干| AV网址大全在| 大香蕉婷婷久久| www91久久| 激情综合网五月激情| 超碰人人插| 小视频一区| 少妇人妻偷人精品无码视频新浪| 激情内射p| av五月天婷婷丁香| 国产.亚洲.欧洲视频在线| 五月花激情网| 婷婷综合激情| 婷婷色色网| 婷婷色色亚洲| 五月丁香在线| 久久久妻人人人| 极品人妻VIDEOSSS人妻| 久久人妻伦理| 午夜免费试看| 琪琪色五月婷婷老师| 丁香涩涩五月天| 丁香五月狠狠在线观看| 噜噜噜久久| 99玖玖免费视频| 丁香六月婷婷久久综合| 亚洲综合色丁香五月天| 99视频在线观看网址| 激情綜合網址| 1995年关宝慧版蜘蛛女| 婷婷成人AV| 久久久久久激情| 五月丁香六月婷| 中文字幕网伦射乱中文| 久久a热| 久久99精品久久久久久噜噜| 成人无码精品1区2区3区免费看| 五月丁香久久丝袜啪啪| 五月停停色色丁香| 狠狠色综合图片| 色99视频| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 丁香五月天啪啪| 久久九九在线视频| 五月丁香美女| 六月丁香停| 综合网亚洲| xx综合网| 婷婷91| 国产真实乱对白精彩| 天天色激情| 丁香蜜臀黄色婷婷五月天| 婷色五月天| 99热日韩| 五月天自拍网| 天天做天天爱天天搞| 99欧美热| 欧美电影在线播放| 4399成人黄A片| 婷婷深爱五月丁香网| 精品女人九九九| a久久| 欧美黄色AA片哗啦啦啦| 大狠狠在线| 成人AV中文字幕| 欧美大片免费播放器| 79精品视频| 人妻爽爽爽久久久久久久久| 99黄色在线视频精品熟女| 爱久久小说下载网| 性爱综合网| 激情无码网| 六月米奇色综合| 日本色色网站| 国产婷婷久久| 97操男人的天堂| 99久久九九视频| 99精品久久久| 色五月超碰| 伊人色综在线| 五月婷婷婷自由综合| 激情AV| 一区二区aV电影免费看| 激情五月狠狠喔| 国产69久久久欧美黑人A片| 亚洲AV网址| 色五月丁香伊人五月| 五月婷婷伦理| 99热国内| 五月激情婷婷色| 综合婷婷| 五月婷丁香花| 九九热再线九九视频免费在线观看| 色五月偷偷| 国产97在线日韩亚洲女人被黑人巨大| 亚洲中文字幕AV在线| 欧美日韩aaa| 久久五月天婷婷| 天天操夜夜操| 婷婷操久久| 激情开心五月天| 欧美久久婷婷| 五月在线| 色五月婷婷影院| 久久婷婷五月| w婷婷五月婷婷w| 一丁香五月天月AV| 男女99免费视频| 婷婷月综合| 强伦轩人妻一区二区电影| 日韩五月丁香| 99re免费精品视频| 婷婷成人五月天| 国产免费一区二区在线A片视频| 婷婷少妇激情| 久热这里只有| 一二线视频 另类| AA片在线观看视频在线播放| 亚洲欧美成人在线观看| 五月天停婷基地| 狠狠色丁香婷婷久久综合| 91xxxx九色| 午夜丁香 婷婷| 99re热在线视频观看| 狠狠色色综合| 99在线观看视频蜜臀| 678五月丁香亚洲综合| 色丁香久综合在线久综合在线观看| 婷婷成人五月天一区| tingtingzonghewang| 欧美综合五月丁香五月天| www.99成人视频| 99久久这里只有精品| 精品99在线| 99爱视频免费| 五月婷婷欧洲| 色播丁香| 99re这里只有精品视频了| 天天色视频| 婷婷五月天影院| 香蕉久久国产AV一区二区| 欧美成人精品A片免费一区99| 丁香五月天AV在线 | 婷婷五点亚洲| 国产超碰在线| 久久五月天丁香| 日韩在线99| 丁香五月六月久久综合| 噜噜色婷婷| 激情综合久久| 丁香婷婷久久综合在线| 天天日天天干天天爱| 热热久久久久久久久| 五月天激情小说欧美激情| 综激情网| 丁香五月玖玖| 丁香五月自拍| 激情av在线| 日日做A爰片久久毛片A片英语| 天天久久婷婷| 婷婷五月开心中文字幕色| 激情婷婷五月| 九九色婷| 激情人妻蜜夜系列区| 亚洲AV无码一区二| 这里只有精品视频在线看| 成人综合视频在线| 97在线天堂| www.久久爱| 亚洲九九99精品视频在线播放| 伊人狠狠丁香婷婷综合尤物| 91在线资源| 丁香五月成人| 99欧州偷拍视频| 天天日天天日天天搞| www超碰| 丁香五月天亚洲综合| 日韩色色小视频| www.激情五月| 91日综合欧美| 另类激情网| 久久久久久久人妻| 青草青草久热这里只有精品| 色碰碰| 丁香av网| 激情五月丁香综合网站| 七月婷婷色香综合网| 538午夜激情| 婷婷五月天小说| 日韩一级一片内射视频4K| 九月影院義母在线播放| 久草视频一,二三四| 丁香久久激情俄| 色久五月| 综合色七七| 丁香久色| 久九男女天堂| 丁香婷在线| 国产精品18久久久| 五月天四色房丁香| 狠狠色综合五月人人| 色之综合网| 色999;丁香五月| 9有码中文| 六月婷婷开心| 99热这里有精品首页10| 91啪啪网| 久久婷婷综合基地| 久热这里只有精品6| 九九99免费视频| 五月天婷婷伊人| 99九九热视频| 日本超碰在线| 狠狠操天天操| 色五月丁香com| 五月综合激情综合久| 国产真人做爰视频免费| 狠狠色激情综合| 国产精品人人做人人爽人人添| 色婷婷成人丁香| www.五月天婷婷| 五月丁香| 四虎国产精品永久在线国在线| 婷婷五月天激情在线观看| 色优久久| 丁香五月综合网亚洲综合欧美狠狠| 欧美日本韩国亚洲| 综合图片色色| 久久久久9999| 色哟呦av| 国产综合婷婷| 日日干日日色| 久久丁香婷| 五月的色婷婷高潮| 色色色999| 欧美成人五月天| 五月花激情| 综合激情五月婷婷| 色噜噜婷婷| 涩五月丁香| 色色综合热| 伊人www22综合色| 欧美A级网站| 成人精品视频99在线观看免费| 婷婷五月天com| 色五月天 丁香| 人妻精品一区二区三区| 天天爽在线视频| 爱久久小说下载网| 丁香色成人| 亚洲视99| 懂色av蜜臀av粉嫩av永陈冠希| 五月色婷婷影院| 五月天婷婷久久日| 亚洲在线播放| 天天插天天插| 综合激情五月婷婷| 婷婷五月婷婷五月| 色情五月天小说| 婷婷五月天久草在线| 免费AV在线| 激情涩涩网| 激情丁香五月综合| 五月婷丁香| 色色网站在线| 六月丁香深深爱| 97超级操操| 91操操| 五月婷婷官网色| 九九热视频精品2| 超碰成人影视| 国产午夜精品AV一区二区麻豆 | 色婷婷色情| 91凹凸在线| 久久久国产精品黄毛片| 日本三级韩三级99久久| 五月丁香六月婷婷综合网站| 五月花成人网| 久久永久网址| 熟女激情网| 超碰熟女农村在线69| 99re思思热久久| 五月草视频| 色五月久久成人婷婷| 久久伊人9| 久久激情四射| 欧美性生交XXXXX无码小说| 亚洲激情综| 久久丁香五月婷| 天天日日天天| 色七色九九| 91人操| 久久五月天 91| 精品无码久久久久久久久| 久99在线视频| 五月婷婷六月丁香玖玖玫瑰91| 六月丁香婷婷开心综合基地| 欧美色色色色色色色色色色影视| 欧美在线干| 涩九九九九| 51精品国内探花| 国产AV一区二区三区日韩| 狠狠插狠狠操| 99精品性爱| 五月丁香激情婷婷| 久超超碰| 97人人操在线| 久久三级视频| 天天天干夜夜夜操| 久/久精品99看9| 丁香五月电影| 天天射影院| 亚洲久热| 丰满女老板BD高清A片| 另类视频五月天| 五月天综合视频| 亚洲精品亚洲人成人网| jiZZdr| 另类小说五月天| 99精品亚洲| 99热在线观看精品| 大学生高潮无套内谢视频| 九九热超碰| 久久99视频| 粉嫩AV久久一区二区三区| 色狠狠色噜噜AV天堂五区| 久久精品A片777777| 被强行糟蹋的女人A片| 99热在线观看| 69热91天堂| 玖玖婷婷五月天毛片| 九月色婷婷婷| 五月综合丁香婷婷| 日日操夜夜爽白洁| aaa日韩| 第四色首页| 泰州成人视频| 99性视频| 1024成人免费看| 九九re视频在线视频| 精品网站:999WWW| 丁香五月天AV在线| 五月婷婷丁香色吧网| 综合色播| 免费视频无码| 久久天堂婷婷五月| 久久天天天| 六月婷婷七月丁香| 国产精品美女| 婷婷成人基地| 91在线日本| 爱射综合| 人人叉久| 婷婷开心青青草| 婷婷色正月| 97热视频| 99热在线播放精品| 丁香婷婷久久| 激情六月综合| 97色在线| WWW免费视频碰碰碰碰| 久久99热只有精品| 99热这里只有精品99| 九九99在线免费在线观看视频| 在线理论片| 丁香六月婷婷开心婷婷网| 亚洲激情AV| 久久久久人妻精选| 日日夜夜狠狠| 97日在线视频| 久色网五月| 九九热九九| 婷婷酒色网| 欧美色图45678| 亚艹艹| 亚洲激情在线| 亚洲网视屏| 日日日日操| 综合色99| 成人在线网| 久久激情五月天| 色婷婷电影网| 97碰碰视频在线观看免费| AV国产有码| 99热在线精品观看| 丁香五月激情综合婷综| 夜夜撸天天日| 无码人妻丰满熟妇奶水区码| 婷婷五月激情四月综合 | 丁香六月婷婷久久综合| 沈娜娜av| 深爱激情网噜噜色| 99热在线播放| 只有精品视频在线观看| 五月丁香亭亭操逼| 操逼巨乳91| 激情五月天小说视频| 51国精产品自偷自偷综合| 色九月国产| 欧美激情综合色综合| www.婷婷| 婷婷丁香五月视频| 五月天激情小说| 五月丁香啪啪激情| 99色综合网| 狠狠se| 深爱五月网| 懂色av粉嫩av蜜臀av| 96人人操人人操人人| 色综合婷婷| 免费看无码视频A级| 六月婷婷久久| yiqicaoav| 日韩精品无码99| 国产精产国品一二三在观看 | 五月婷婷色色网址| 玖玖婷婷五月天| 激情五月婷色| 国产五月天欧美色| 色综合久久8| www.五月瑟| 久草婷婷在线| 天天爽天天摸| 九九激情视频| 9l视频自拍九色9l视频在线观看| 久热99热| 婷婷五月天亚洲| jiujiu热在线视频| 五月天婷婷小说| 开心五月激情| 香蕉AV777XXX色综合一区| 激情五月六月婷婷综合啪啪| 丁香情色五月| 亚洲欧洲中文日韩久久AV乱码| 激情av网| 97碰啪啪| 婷婷狠狠久久| 五月丁香亭亭A片| 玖玖精品视频| 99在线播放视频| 五月天婷婷丁香| 五月丁香啪啪激情| 99re在线免费视频| 婷婷激情综合| 久久这里只有精品无码| bukadeavzaixian| 亚洲激情综| 丁香五月天天哦| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 五月激情综合网| 一级A片天天操夜夜操| 五月婷婷先锋| 日本91在线| 五月婷无码| 五月婷婷 自拍| 综合久久97| WWW丁香五月| 99re资源在线视频导航| 涩综合网| 日本性激情色播| 九九综合网色全集| 大学生高潮无套内谢视频| 婷婷丁香色情| 六月99天天婷婷激情综合| 精品少妇人妻AV无码专区偷人 | 秋霞性爱AV| 日韩激情婷婷五月天| 欧美激情 日韩无码 婷婷 五月天| 五月婷六月| 亚洲天天免费| 婷婷娌伦网| 激情五月天婷婷视频| 玖玖婷婷五月| 中文字幕在线aⅴ免费观看| 丁香五月激情网| 婷婷色系婷色| 五月丁香啪啪激情| 奇米色大香蕉| 涩涩五月天| www.天天干| 伊人久久婷婷五月天激情四射| 久久jiuwww| 国产精品扒开腿做爽爽爽A片唱戏 青青草国产亚洲精品久久 | 色亚洲无码| 婷婷伊人綜合中文| 亚洲V国产V欧美V久久久久久| 久久色亭亭五月天| 狠狠狠狠狠草| 这里只精品| 婷婷五月综合社区| 成人短视频免费| 全部老头和老太XXXXX| 久青操| 夜夜撸天天日| 色欲香综合网| 婷婷五月天改成什么了| 国产精典视频在线观看| 色爱综合五月| 人妻免费网站| 人人人操 超碰| 丁香婷婷六月| 九九Av| 五月天色婷婷激情| 六月丁香啪啪| 人人操五月天| 五月丁香啪啪综合| 囯产精品久久欠久久久久久九大| 涩涩涩.com| 午夜青草资源| 激情综合色五月六月婷婷| 五月停亭六月,六月停亭的英语 | 五月丁香婷婷中文网| 美女丁香五月天| 婷色五月| 天天插天天玩天天干| 久久婷婷五月综合激情国产| 777久久久| 五月天激情黄色网址| 亚洲天堂婷婷| 第四色大香蕉| 伊人玖玖网| 99精品网| 欧美日比视频| 91精品无码| 91九色无码日韩| 色色色色色色色色色色色色色97| 99热在线只有精品| 五月丁香六月| 欧洲一区二区| 九九色精品| 九九大香视频| 99自拍视频在线观看| 99九九在线| 亚洲色啪| 五月天狠狠草| 色五婷婷开心缴| www.激情| www色色com| 26uuu| 综合网亚洲| 99热日本| 超碰人人插| 亭亭丁香97| 欧美婷婷精品激| 色一情一乱一乱一区9| 欧美久人人| 天天摸天天肏| va中文资源在线观看| 天天日天天操天天干| 另类综合婷婷五月天欧美视频| 天天狠狠六月婷丁香影院| 久久九精品| 99色在线视频| 色99综合色88| 涩九九九九| 就要去操亚洲成人精品五月天丁香婷婷| 激情五月综合视频| 亚洲成人网站在线播放| 91啪啪视频| 无码G高清天| 99精品小视频| 久久九九免费视频| 热日韩欧美| 色五月婷婷影院| 色五月婷婷 成人| 一级A片天天操夜夜操| 丁香五月婷婷五月天| 五月激情啪啪啪| 免费无码毛片一区二区A片| 99视频综合网| 久久综合丁香五月| 色婷婷成人| 五月丁香六月综合激情| 丁J香六月首页| 婷婷99| 26uuu亚洲欧美| 97在线综合| 婷婷综合中文| 丁香婷婷六月天| 五月丁香婷婷中文网| 丁香色综合| 超碰在线观看三级片| 婷婷情色五月天| 五月色丁香婷婷中文字幕| 夜夜撸日日操| 91麻豆国产三级精品福利在线观看| 99九无网码| 99福利视频| 99色精品| 中文AV在线观看| 五月丁香狠狠地噜噜噜噜| 婷婷丁香午夜综合影视| 91婷婷色| av人人操| 欧美亚洲操逼| 另类专区在线观看| 97人妻碰碰碰久久香蕉| 99热这里只有精品最新地址获取| 色五月激情综合网| 色综合丁香婷婷| 婷婷金品综合视频| 五月婷婷啪啪啪啪| 梁铮版《蜘蛛女侠》在线| 99性爱| 91国产精品视频播放| 激情五月天婷婷久久久久久久久久久| 大香线蕉伊人| 综合久久综合综合| 天天做天天爱天天玩夜夜爽| 极品人妻VIDEOSSS人妻 | 这里只有精品免费| 97碰碰在线看视频免费| 99热地址| 欧美久久久久久久久中文字幕| 九九婷婷五月天影视| 五月天偷拍| 另类图片色五月| 日韩一级网站| 日韩av网站在线观看| 天天橾夜夜爽| 欧美日韩成人h| 婷婷婷五月天最新综合你懂的| 丁香六月综合激情| 婷婷激情五月天网站| 九九婷婷网五月天| 丁香五月亚洲激情婷婷射| 大香蕉九操| 久久婷婷五月综合伊人| 六月丁香综合| 久久久99久久| 99色在线| 久鲁鲁色网| 日韩成人电影AV| 另类色网| 亚洲精品V天堂中文字幕 | 一级性爱视频| 五月婷婷黄色毛片| 五月天 婷 欧美亚洲| 亚洲色图81p| 美欧日韩国产成人在战| 色色免费网站| 色爱亚洲| 婷婷5月天av| 热思思九九| 色欲五月婷婷| 丁香六月综合激| 超碰猛烈的性猛交| 大香蕉五月天| 97人人草| 亚洲第一视频 久久| 97超级碰碰碰久久久| 久久美女五月天| 日本色99| 1000部毛片A片免费观看| 激情合网婷婷| 日本在线wwww| WWW久久久| 国庆精品久久| 久久婷婷一级片| 开心五月深爱五月| 日本色色网| 婷婷D区| 五月色亚洲| 91天天操天天干天天射| 99性爱| 亚洲丁香五月在线观看| 骚五月婷婷| 五月婷婷丁香六月| 伊人婷婷五月天av| 97欧美在线| 国产成人综合网| 五月婷婷啪啪网| 亚州操逼网| 极品少妇XXXX精品少妇偷拍| 色情五月停停丁香| 日本久久高清| 色婷网站| 第四色激情网| 久色国产| 操一区| www,99视频| 久久久激情视频| 色五月激情综合| 97五月婷婷| 日本人妻伦在线中文字幕| 五月在线| 极品 少妇 内射| 综合激情肏逼网| 国产精品人成A片一区二区| 可以看的AV网站| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 97碰碰视频在线观看免费| 99精品国产在热久久| 婷婷国产成人| 婷婷五月天色网久| 亚洲网视屏| 热婷婷av| 精品国产AV色一区二区深夜久久| 五月天激情丁香| 亚洲丁香五月深爱五月| www.99热在线观看| 97久久精品视频| 国产精品18久久久| 大香蕉婷婷色| 激情五月天婷婷五月天| 天天噪夜夜爽| 五月综合久久| 丁香五月最新网址| 丁香五月婷婷啪啪视频| 久久人人看| 人人综合久| 五月激情婷婷丁香| 亚洲男人的天堂婷婷色五月| 丁香无月在线观看| 五夜丁香| 亚洲精品九九| 亚洲成人AV高清字幕| 丁香五月六月综合激情| 丁香婷婷九月| 这里只有精品视频在线| 26UUU精品一区二区Com| 精品网站99| 欧美A级网站| 久久久久亚洲AV成人无码电影| 亭亭丁香97| 久久综合五月天激情小说网站| 爱射综合| 玖玖婷婷五月天| 久久久久久久97| 天天综合色丁香| 激情婷婷六月天| www99热| AV79| 99爱精品视频| 天天天日天天天干| 先锋av性爱成人电影| 5月婷婷6月丁香aV| 天天免费成年人视频| 色色热99| 五月天色播网| 思思热思在线精品视频| 久久这里只有国产| 丁香五月婷婷啪| 亚洲视99| 天天摸天天爽| 丁香婷婷六月天| 五月婷婷精品视频| 丁香五月冃欧美| 99re这里只有精品在线观看| 久久机只有这里精品| 麻豆五月丁香婷婷| 色婷婷五月天不卡| 五月丁香六月情| 久久人妻精品| 色综合久久44| 日韩色色视频| 国产亚洲色婷婷久久99精品91| 人妻AV在线| AAA级久久久精品| 亚洲AV成人一区二区在线观看| 依人大香蕉在钱1| 亚洲人成网站999久久久综合| 被强行糟蹋的女人A片| 91久久日日| 五月天婷久久| 五月黄色婷婷| 五月丁香六月激情综合| 人妻中文在线| 丁香五月婷婷呀| 色丁香五月婷婷在线| 色婷婷久久综合中文久久一本| 五月婷视频| www.91久久| 99re在线播放| 日韩小视频在线99| 婷婷五月电影| 色五月婷婷五月久久| www激情五月天| 成人av在线网站| 九九色综合| 九月婷婷人人操人人舔人人爱| 日韩一级网站| 日韩 欧美 国产 一区 二区| 丁香五月婷婷骚视屏| 丁香 久久| 激情久久久| 日逼影音先锋AV男人资源站| 激情综合五| 五月丁小婷婷激情四射| 夜夜爱影院| WWW、日本色丁香co m| 五月婷婷丁香狠狠撸久久| 日韩在线9| 中国丰满熟女A片免费观| 99热在线网站| 亚洲激情亚洲激情 | 无码一区二区三区四区五区91c| 婷婷伊人综合中文字幕| 丁香婷五月天| 播播网色播播| 色狠狠色噜噜AV天堂五区| 大香久久伊人网| 开心婷婷五| 婷婷午夜天| 成人电影一区| A级毛片高清免费不卡播放谢谢谢谢| 九九热这里只有精品556| 亚洲激情97五月天| 99热6这里只有精品| 99久久综合狠狠综合久久| 超碰在线视屏| 俺也高清无码高清视频| 99热这里都是精品| 九九九九九九综合| 亚州视频九九99| 九九色色网| 99视频啪啪| 日本美女天天日天天爽| 九九热精品99| 91丁香色五月| 婷婷五月丁香五月丁香| 久久99综合网| 色九九九综合| 色狠狠六月| 99精品视频网站| 亚洲人妻电影| 色五月婷婷五月丁香五月| 丁香六月激情| 婷婷情色五月天| 六月合五月婷| 五月天丁香色色| 五月色婷婷在线观看| 日本久久人| 色婷狠狠| 婷婷丁香综合成人| 亚洲欧洲中文日韩久久AV乱码| 久久久婷婷婷| 中文字幕,综合,91| 九 九九九AV| 天天色天天爱天天爽| 五月天综合在线| 五月丁香啪啪| 色激情综合| 天堂在线9| 天天艹夜夜艹| 人人操人| 99在线亚洲| 女同在线9| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 玖玖99精品视频| www,99热| 一区无码| 五月天综合在线观看| 久久男人网婷婷| 视色综合| 国产亚洲AV人片在线| 六月天六月婷| 综合色色五月| 五月天婷婷乱| 丁香花大香蕉婷婷综合| 五月丁香六月合| 乱精品一区字幕二区| 夜夜噜夜夜奇| AV中文网| 夜夜操天天爽| 殴美97色| www.夜夜操.com| 99综合熟女| 狼人狠狠操| 武则天精品久久| 五月天色色网站| 色色五月天婷婷| 亚洲婷婷五月天| ji'qing'luan'ren'lun| 黄色热99| 这里只有精彩亚洲视频推荐| 色色六月| 色爱综合网| 9999三级片| 五月综合无码| 五月六月丁香婷婷在线观看| 亚洲成av人影院| 欧洲高清免费久久| 操比激情五月| 亚洲成人超碰| 丁香色五月婷婷17C| 五月天啪啪| 伊人五月天婷婷| 99玖玖人人| 色情五月综合婷婷| 五月天色狠狠| 日本成人内射| 九九综合色综合| 天天色综合天天| 成人国产网站在线免费看| 天天摸色吧天天摸色吧| 婷婷综合97| 久久人妻视频| 99热99热不卡| 欧美日比视频| 国产日韩欧美| 欧美VA在线| 亚洲九区| 五月婷婷综合激情小说| 日韩淑女人妻luan伦激情精品一区二| 丁香五月网址| 9久热精品在线视频| 激情五月天婷婷在线网址发给我| 久/久精品99看9| 超碰婷婷色| 91人碰| 日韩一66精品| 伊人大香蕉在线视频| 亚洲色频| 日日日日操| 97色干| 97自拍视频网| 五月天精品| 色五月激情婷婷| 99热婷婷| 日韩成人影片在线观看| 久久只有18视频| 丁香久久久| 丁香婷婷激情综合五月激情 | 精品99在线| 五月天网址在线刘玥| 99熟女啪啪视频| 夜夜天天久久婷婷| 69久久99精品久久久久婷婷| 精品欧美一区二区三区久久久| 午夜婷婷久久 | 天天日天天插| 久草狼人| 婷婷五月天性| 亚洲va欧美| 99久久久久久久| 天堂婷婷综合| 丁香五月天啪啪| 五月天激情无码| 三区激情四射av| AV操逼网| 丁香五月天激情四射网络不好| 大香蕉九九| 国産精品| 丁香六月五月天| 午夜精品777| 国产免费一区二区在线A片视频| 91久久九九| 欧美日本韩国亚洲| 九九免费视频| 色五月天丁香婷婷| 99热这里只有精品免费观看| 久久狠色噜噜狠狠狠狠97| 五月婷婷狠狠干| 国产综合丁香五月天| 超碰在线50| 99热66| 成人精品在线观看| 国产免费一区二区三区三州老师F1F1.CC | 色五月婷婷综合在线| 第四色首页| 激情综合婷婷| 欧洲精品欧洲情| 91丨九色丨大屁股| 狼人婷婷久久| 日韩三及成人AV片| 97操在线资源| 五月丁香六月停停停| 色狠狠色综合久久久绯色aⅴ影视| 久久曰曰| 久久久久人妻| 亚洲天天操| 91狠狠综合久久| 色五月91| 特黄三级片| 五月丁香 啪啪| 97人人搞| 9l视频自拍九色9l视频在线观看| 色综合天天综合成人网| 天天做天天爱天天要| 五月天婷婷爱| 激情小说视频图片| 激情五月天开心总和网| 日日日天天干| 桃色激情网| 婷婷六月啪啪 | 五月天激情小说网| 五月丁香六月激情综合| 噜噜色com| 婷婷综合激情| 中文字幕永久在线| 婷婷综合欧美| 日本本土色网第一区| 久久人妻乱子伦| 久久香蕉婷婷五月天| 天天日夜夜夜操操操操| 婷婷丁香五月噜噜噜| 丁香成人色情五月天| 婷婷五月天开心网| 青青草原伊人网| 色五月婷婷av| www.夜夜操.com| 国产欧美日韩综合精品一区二区| 亚洲情综合五月天| 亚洲美女裸体被操在线观看| 精品动漫 无码av| 天天综合色丁香| 久久五月视频| 久久狠色噜噜狠狠狠狠97| 色久五月| 天天色天天爱天天爱天天爱y| 日本色五月| 夜夜撸天天操| 粉嫩AV久久一区二区三区| 九九九九九九热| 激情无码网| 婷婷五月中文在线| 天天爽综合| 99热这里有精品| 精品五月天| 丁香网五月天| 五月丁香久人妻中文| 天天狠狠夜夜狠狠2023| 色狠狠色噜噜AV天堂五区| 婷婷婷五月香蕉| 超碰成人电影| 色插综合网| 久久免片| 狠狠草狠狠草| 五月婷婷很很色| 黄色激情久久| 亚洲激情高潮| 青青草激情网| 激情深爱五月天| 激情超碰网| 国产超碰在线| 99热的无码| 99精品自拍| 色婷丁香91| 成人av播放| 99热这里只有精品2024| 久久婷婷五月综合激情国产 | 欧美99热| 伊人网色婷婷五月天| 碰碰91| av在线婷婷| 丁香五月性| 狠狠色丁香久久婷婷综合五月| 秋霞性爱AV| 丁香五月天亚洲综合| 天天日天天做天天舔| 色情综合网| 日韩成人电影AV| 97碰免费精采视频| 美女主播野战视步页| 99在线观看视频| www.91五月| 99久久久久| 夜夜爱网站| 香蕉久久国产AV一区二区| 99在线资源| 成人五月天视频播放| 亚洲综合色婷婷| 久久9热| 五月天激情国产综合AV| 五月婷婷激情综合| 久久久五月天婷婷成人网| 欧美丁香六月在线观看视频| 九九综合色综合| 色综啪啪| 婷婷深爱五月亚洲综合| 五月天色影院| 一级二级色大片| 久久婷婷五月综合色丁香| 日日操天天操| 色琪琪一综合久久激情五月视频| 婷婷开心久久| 三级片AAA久久久AAA久久久AAA | 婷婷五月天激情视频| 五月天色综合| 五月婷婷影院| 99热精品在线观看| 人操91在线| 日日狠夜夜狠| 搡BBBB搡BBB搡18| 天天日日夜夜爽| 婷婷丁香五另类网站| 婷婷欧美激情| 日日噜狠狠色| www久久久久久久久久久久久久久久久| 夜夜骑操AV| 爱射综合| 丁香综合网| 99精品久久久| 亚卅毛片| 五月婷婷六月情| 青青草婷婷久久| 婷婷王月天影院| 色噜噜狠狠狠狠色综合久欧美| 亚洲婷婷丁香五月亚洲| 99色综合| 99这里只有精品视频在线| 免费亚洲婷婷| aaa丁香五月天| 久久精品性爱| 天天插天天玩天天干| 久久综合激情| 操操碰| 大香蕉人妻| 激情婷婷综合| 亚洲亚洲人成综合网络|