精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

四個(gè)流行的Java開源規(guī)則引擎和入門

開發(fā) 后端
本文主要分享一些基于Java的規(guī)則引擎,這些規(guī)則引擎是目前比較流行的項(xiàng)目,并簡(jiǎn)單介紹這些規(guī)則引擎的使用方式。

在許多業(yè)務(wù)系統(tǒng)中,會(huì)有大量的業(yè)務(wù)規(guī)則配置,而且隨著政策制度、業(yè)務(wù)流程甚至是管理者的決策發(fā)生變化,這些業(yè)務(wù)規(guī)則也需要進(jìn)行更改。這種變化在一些行業(yè)特別頻繁,并且要求快速響應(yīng)。

規(guī)則引擎的作用是為了適應(yīng)這種變更需求,實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)快速且低成本的更新。一般是將業(yè)務(wù)規(guī)則的配置單獨(dú)拿出來,使之與業(yè)務(wù)系統(tǒng)保持低耦合,如果這個(gè)用于配置的模塊做得足夠通用且獨(dú)立,那么它就可以成為一個(gè)規(guī)則引擎系統(tǒng)。通過規(guī)則引擎可以快速響應(yīng)業(yè)務(wù)規(guī)則的變化。這種方式不需要修改代碼,減少了修改業(yè)務(wù)代碼之后出現(xiàn)錯(cuò)誤的可能性,如果規(guī)則引擎提供前端操作界面,還能夠支持業(yè)務(wù)人員輕松上手配置業(yè)務(wù)規(guī)則。 

本文主要分享一些基于Java的規(guī)則引擎,這些規(guī)則引擎是目前比較流行的項(xiàng)目,包括:Drolls、Easy RulesRuleBook、OpenL Tablets。并簡(jiǎn)單介紹這些規(guī)則引擎的使用方式。

1.Drools

https://www.drools.org/

https://github.com/kiegroup/drools

Drools是一個(gè)業(yè)務(wù)規(guī)則管理系統(tǒng)(BRMS)。主要功能模塊包括:核心業(yè)務(wù)規(guī)則引擎(BRE)、Web創(chuàng)作和規(guī)則管理應(yīng)用程序(Drools Workbench)、決策模型和符號(hào)(DMN)模型以及用于開發(fā)的IDE插件(idea、eclipse等)。

Drools體系架構(gòu)如下圖所示:

Drools架構(gòu)的執(zhí)行步驟如下:

  • 將規(guī)則加載到規(guī)則庫中,該規(guī)則庫始終保持可用。
  • 事實(shí)(Facts)被保存到工作內(nèi)存(Working Memory)中,它們可以被修改或撤回。
  • Pattern Matcher將新的或現(xiàn)有的事實(shí)與規(guī)則進(jìn)行匹配, 這個(gè)過程稱為模式匹配,該過程由規(guī)則引擎執(zhí)行。
  • agenda在沖突解決策略的幫助下管理沖突規(guī)則的執(zhí)行順序。

以下是SpringBoot的Drools使用例子。

(1)定義Pom.xml

創(chuàng)建一個(gè)基本的springBoot應(yīng)用程序,并將drools依賴項(xiàng)添加到pom.xml。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.6.6</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.praveen.drools.example</groupId>
   <artifactId>springboot-drools-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>springboot-drools-demo</name>
   <description>Demo project for Spring Boot with Drools Engine</description>
   <properties>
      <java.version>11</java.version>
      <drools.version>7.67.0.Final</drools.version>
      <springfox-swagger2.version>3.0.0</springfox-swagger2.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-core</artifactId>
         <version>${drools.version}</version>
      </dependency>

      <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-compiler</artifactId>
         <version>${drools.version}</version>
      </dependency>

      <dependency>
         <groupId>org.drools</groupId>
         <artifactId>drools-decisiontables</artifactId>
         <version>${drools.version}</version>
      </dependency>

      <!-- swagger ui -->
      <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-boot-starter</artifactId>
         <version>${springfox-swagger2.version}</version>
      </dependency>

      <dependency>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-swagger-ui</artifactId>
         <version>${springfox-swagger2.version}</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

(2)創(chuàng)建一個(gè)名為DroolsConfig.java的java配置類。

package com.praveen.drools.example.configuration;

import com.praveen.drools.example.service.CustomerCategorizeService;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Drools Config.
 * @author Praveen.Nair
 */
@Configuration
public class DroolsConfig {

    private static final String RULES_CUSTOMER_RULES_DRL = "rules/customer-category.drl";

    @Bean
    public KieContainer kieContainer() { 
        final KieServices kieServices = KieServices.Factory.get();
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_CUSTOMER_RULES_DRL));
        KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
        kb.buildAll();
        KieModule kieModule = kb.getKieModule();
        return kieServices.newKieContainer(kieModule.getReleaseId());
    }
}

這個(gè)配置類創(chuàng)建一個(gè)springbean KieContainer,通過加載應(yīng)用程序/resources文件夾下的規(guī)則文件來構(gòu)建規(guī)則引擎。

創(chuàng)建KieFileSystem實(shí)例并從應(yīng)用程序的resources目錄加載DRL文件。接著使用KieService和KieBuilder創(chuàng)建KieContainer并將其配置為spring bean。

(3)創(chuàng)建模型類

創(chuàng)建名為CustomerRequest的Pojo類和字段。

package com.praveen.drools.example.model;

import java.util.Objects;
import java.util.StringJoiner;

/**
 * Customer request POJO.
 * @author Praveen.Nair
 */
public final class CustomerRequest {

    private final long id;
    private final Integer age;
    private final String gender;
    private final Integer numberOfOrders;

    public CustomerRequest(long id, Integer age, String gender, Integer numberOfOrders) {
        this.id = id;
        this.age = age;
        this.gender = gender;
        this.numberOfOrders = numberOfOrders;
    }

    public long getId() {
        return id;
    }

    public Integer getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }

    public Integer getNumberOfOrders() {
        return numberOfOrders;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        CustomerRequest that = (CustomerRequest) o;
        return id == that.id &&
                Objects.equals(age, that.age) &&
                Objects.equals(gender, that.gender) &&
                Objects.equals(numberOfOrders, that.numberOfOrders);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, age, gender, numberOfOrders);
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", CustomerRequest.class.getSimpleName() + "[", "]")
                .add("id=" + id)
                .add("age=" + age)
                .add("gender=" + gender)
                .add("numberOfOrders='" + numberOfOrders + "'")
                .toString();
    }
}

我們將這個(gè)類作為請(qǐng)求對(duì)象參數(shù)傳給規(guī)則引擎,并且將字段作為輸入發(fā)送到定義的規(guī)則中,以便為派生customerType。

另外,再定義了一個(gè)名為CustomerCategory.java的java枚舉,用于保存客戶類別,規(guī)則引擎根據(jù)該值派生客戶類型。

package com.praveen.drools.example.model;

/**
 * Customer Categories.
 */
public enum CustomerCategory {

    GENERAL, KIDS, SENIOR_CITIZEN, SUSPENDED;

    public String getValue() {
        return this.toString();
    }
}

創(chuàng)建一個(gè)名為CustomerType的響應(yīng)POJO類,如下所示。

package com.praveen.drools.example.model;

import java.util.Objects;
import java.util.StringJoiner;

/**
 * CustomerType Response model.
 * @author Praveen.Nair
 */
public class CustomerType {

    private CustomerCategory customerType;

    public CustomerCategory getCustomerType() {
        return customerType;
    }

    public void setCustomerType(CustomerCategory customerType) {
        this.customerType = customerType;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        CustomerType that = (CustomerType) o;
        return customerType == that.customerType;
    }

    @Override
    public int hashCode() {
        return Objects.hash(customerType);
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", CustomerType.class.getSimpleName() + "[", "]")
                .add("customerType=" + customerType)
                .toString();
    }
}

(4) 定義Drools規(guī)則

創(chuàng)建一個(gè)名為customer-category.drl的drools規(guī)則文件,并將該文件放在目錄/src/main/resources/rules下。


import com.praveen.drools.example.model.CustomerRequest
import com.praveen.drools.example.model.CustomerCategory;
global com.praveen.drools.example.model.CustomerType customerType;

dialect "mvel"

rule "Categorize customer based on age"
    when
        CustomerRequest(age < 20)
    then
        customerType.setCustomerType(CustomerCategory.KIDS);
end

rule "Categorize senior citizen customer based on age"
    when
        CustomerRequest(age > 50)
    then
      customerType.setCustomerType(CustomerCategory.SENIOR_CITIZEN);
end

rule "Categorize customer based on number of orders"
    when
        CustomerRequest(numberOfOrders == 0)
    then
        customerType.setCustomerType(CustomerCategory.SUSPENDED);
end

rule "Categorize customer general case"
    when
        CustomerRequest((gender == "M" || gender == "F") && age > 20 && age < 50)
    then
        customerType.setCustomerType(CustomerCategory.GENERAL);
end

需要在DRL文件中import 使用到的模型。定義一個(gè)名為customerType的全局參數(shù),作為多個(gè)規(guī)則之間共享數(shù)據(jù)。

DRL文件可以包含一個(gè)或多個(gè)規(guī)則。可以使用mvel語法來指定規(guī)則。此外,每個(gè)規(guī)則都可以使用rule關(guān)鍵字進(jìn)行描述。

然后定義when-then語法來指定規(guī)則的條件。根據(jù)Customer請(qǐng)求的輸入值,我們將設(shè)置customerType結(jié)果。

(5) 添加服務(wù)層和控制層

創(chuàng)建一個(gè)名為CustomerCategorizeService的服務(wù)類,并添加以下內(nèi)容。

package com.praveen.drools.example.service;

import com.praveen.drools.example.model.CustomerRequest;
import com.praveen.drools.example.model.CustomerType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 * Customer Categorization service.
 * @author Praveen.Nair
 */
public class CustomerCategorizeService {

    private final KieContainer kieContainer;

    public CustomerCategorizeService(KieContainer kieContainer) {
        this.kieContainer = kieContainer;
    }

    public CustomerType getCustomerType(CustomerRequest customerRequest) {
        CustomerType customerType = new CustomerType();
        KieSession kieSession = kieContainer.newKieSession();
        kieSession.setGlobal("customerType", customerType);
        kieSession.insert(customerRequest);
        kieSession.fireAllRules();
        kieSession.dispose();
        return customerType;
    }
}

使用注入的KieContainer實(shí)例創(chuàng)建KieSession實(shí)例。返回一個(gè)CustomerType類型的全局參數(shù),這個(gè)CustomerType將用于保存規(guī)則執(zhí)行結(jié)果。

使用insert方法將customerRequest傳遞給DRL文件,然后我們通過調(diào)用fireAllRules方法觸發(fā)所有規(guī)則,最后通過調(diào)用KieSession的dispose方法終止會(huì)話。

接著開發(fā)一個(gè)Controller 將服務(wù)發(fā)布為一個(gè)API: /API/getCustomerType。API的入?yún)镃ustomerRequest對(duì)象,返回類型為CustomerType。Controller代碼如下所示:

package
com.praveen.drools.example.web;

import com.praveen.drools.example.model.CustomerRequest;
import com.praveen.drools.example.model.CustomerType;
import com.praveen.drools.example.service.CustomerCategorizeService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/getCustomerType")
public class CustomerCategorizeController {

    private final CustomerCategorizeService customerCategorizeService;

    public CustomerCategorizeController(
            CustomerCategorizeService customerCategorizeService) {
        this.customerCategorizeService = customerCategorizeService;
    }

    @PostMapping
    public ResponseEntity<CustomerType> getCustomer(@RequestBody CustomerRequest customerRequest) {
        CustomerType customerType = customerCategorizeService.getCustomerType(customerRequest);
        return new ResponseEntity<>(customerType, HttpStatus.OK);
    }

}

2.Easy Rules

https://github.com/j-easy/easy-rules

EasyRule是一個(gè)輕量級(jí)的規(guī)則引擎。它提供了用于創(chuàng)建規(guī)則的抽象以及規(guī)則引擎API,它通過運(yùn)行一組規(guī)則來檢測(cè)條件并執(zhí)行操作。

以下是EasyRule的一些核心特性:

  • 輕量級(jí)類庫和容易上手
  • 基于POJO的開發(fā)與注解的編程模型
  • 基于MVEL表達(dá)式的編程模型(適用于極簡(jiǎn)單的規(guī)則,一般不推薦)
  • 支持根據(jù)簡(jiǎn)單的規(guī)則創(chuàng)建組合規(guī)則
  • 方便且適用于java的抽象的業(yè)務(wù)模型規(guī)則

以下是Java中使用EasyRules的例子:

(1)在Maven中引入依賴包

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>3.3.0</version>
</dependency>

(2)定義規(guī)則

Easy Rules提供了一些選項(xiàng)來創(chuàng)建規(guī)則:

  • 聲明性注解;
  • API;
  • 表達(dá)式語言;
  • 規(guī)則描述符。

定義方式如下面Java代碼:

@Rule(name = "cart total rule", description = "Give 10% off when shopping cart is greater than $200" )
public class CartTotalRule {

    @Condition
    public boolean cartTotal(@Fact("cart") Cart cart) {
        return cart.isGreaterThanTwoHundered;
    }

    @Action
    public void giveDiscount(@Fact("cart") Cart cart) {
       cart.setTotalDiscount(200);
    }
}

(3)最后基于事實(shí)數(shù)據(jù)執(zhí)行規(guī)則引擎

public class CartTotalRuleTest {
    public static void main(String[] args) {
        // define facts
        Facts facts = new Facts();
        facts.put("cart", get_customer_cart);

        // define rules
        Rule cartTotalRUle = CartTotalRule
        Rules rules = new Rules();
        rules.register(cartTotalRUle);

        // fire rules on known facts
        RulesEngine rulesEngine = new DefaultRulesEngine();
        rulesEngine.fire(rules, facts);
    }
}

3.RuleBook

https://github.com/deliveredtechnologies/rulebook

RuleBook提供了一個(gè)簡(jiǎn)單、靈活并且直觀的DSL。RuleBook提供了易于使用的Lambda特定語言或POJO方式來定義規(guī)則,Java開發(fā)人員可以通過帶注解的POJO來組織大規(guī)模規(guī)則集合,替代那些又臭又長(zhǎng)的“if/else”。

以下是在Java使用RuleBook的Demo。

(1)Maven

<dependency>
    <groupId>com.deliveredtechnologies</groupId>
    <artifactId>rulebook-core</artifactId>
    <version>${version}</version>
</dependency>

(2)Java定義規(guī)則

public class Cart{
    private double cartTotal;
    private String cartId;
    private Customer user;
    private List cartEntries;

    //getter and setter
}

public class ShoppingCartRule extends CoRRuleBook {

    @Override
    public void defineRules() {

        //give 10% off when cart total is greater than $200
      addRule(RuleBuilder.create().withFactType(Cart.class).withResultType(Double.class)
        .when(facts -> facts.getOne().getCartTotal() > 200)
        .then((facts, result) -> result.setValue(20))
        .stop()
        .build());
}

(3)執(zhí)行規(guī)則:

public class CartPromotionRule {
    public static void main(String[] args) {
      RuleBook cartPromotion = RuleBookBuilder.create(ShoppingCartRule.class).withResultType(Double.class)
        .withDefaultResult(0.0)
        .build();
      NameValueReferableMap facts = new FactMap();
      facts.setValue("cart", new Cart(450.0, 123456, customer, entries));
      cartPromotion.run(facts);
    }
}

4.OpenL Tablets

http://openl-tablets.org/

https://github.com/openl-tablets/openl-tablets

OpenL Tablets 是一個(gè)基于 Java和Excel決策表工具的業(yè)務(wù)規(guī)則引擎(BRE)和業(yè)務(wù)規(guī)則管理系統(tǒng)(BRMS)。

主要包括以下幾個(gè)部分:

  • Business Rules Engines(業(yè)務(wù)規(guī)則引擎)
  • WebStudio
  • Web services(web服務(wù))
  • Rule repository(基于JCR的實(shí)現(xiàn)的規(guī)則庫)

以下是在Java中使用OpenL Tablets的例子。

(1)Maven

<dependency>
    <groupId>org.openl</groupId>
    <artifactId>org.openl.core</artifactId>
    <version>${version}</version>
</dependency>
<dependency>
    <groupId>org.openl.rules</groupId>
    <artifactId>org.openl.rules</artifactId>
    <version>${version}</version>
</dependency>

(2)java實(shí)現(xiàn)

public class Main {
    private CartPromotionRules instance;

    public static void main(String[] args) {
        Main rules = new Main();
        // setup user and case here
        rules.process(aCase);
    }

    public void process(Case aCase) {
        EngineFactory engineFactory = new RulesEngineFactory(
          getClass().getClassLoader()
            .getResource("rules.xls"), CartPromotionRules.class);
        instance = engineFactory.newEngineInstance();
        instance.executePromotion(aCase, new Response());
    }
}
責(zé)任編輯:趙寧寧 來源: andflow
相關(guān)推薦

2013-06-17 10:25:16

連接池Java

2009-03-13 09:39:34

JavaScript函數(shù)調(diào)用規(guī)則

2013-03-18 13:31:28

2020-08-25 08:47:15

開源軟件技巧

2016-08-29 23:00:29

大數(shù)據(jù)數(shù)據(jù)分析

2022-02-23 15:09:18

數(shù)字化轉(zhuǎn)型國(guó)有企業(yè)數(shù)據(jù)

2018-11-02 08:53:28

開源Android郵件客戶端

2021-09-08 10:32:36

云計(jì)算云計(jì)算環(huán)境云應(yīng)用

2024-11-09 08:26:52

Python裝飾器

2025-03-31 08:45:00

作用域Python編程

2023-01-28 09:52:39

2022-03-14 10:34:14

企業(yè)開源軟件IT領(lǐng)導(dǎo)者

2020-09-10 10:16:09

開源代碼安全性漏洞惡意組件

2024-06-25 12:45:05

2009-05-20 10:09:55

編碼習(xí)慣代碼風(fēng)格Java

2011-04-19 16:06:57

typedef

2024-02-27 11:14:26

CIOIT領(lǐng)導(dǎo)層管理技術(shù)團(tuán)隊(duì)

2022-08-05 14:26:50

Kubernetes容器工具

2024-08-19 00:05:25

2013-05-22 16:37:15

優(yōu)化IAP設(shè)計(jì)運(yùn)營(yíng)推廣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产第一亚洲| 国产在线黄色| 亚洲三级影院| 亚洲精品视频二区| 一级在线免费视频| av片在线观看永久免费| av在线不卡电影| 国产精品视频男人的天堂| 欧美成人精品一区二区免费看片| 欧美日韩另类图片| 欧美日韩精品欧美日韩精品一| 在线观看17c| 嫩草研究院在线| 国产成人精品影视| 国产精品wwwwww| 免费网站看av| 日韩电影一区| 日韩电视剧在线观看免费网站| 久久这里只精品| 国产污视频在线播放| 亚洲欧洲一区二区三区| 九色视频成人porny| 一区二区日韩视频| 久久经典综合| 97精品在线观看| 亚洲欧美一区二区三区四区五区| 国产亚洲一区二区三区不卡| 精品精品国产高清一毛片一天堂| 高清一区在线观看| 伊人成综合网站| 亚洲成人综合视频| 国产精品12p| 大乳在线免费观看| 91美女视频网站| 国产精品区一区二区三在线播放| 国产伦理吴梦梦伦理| 石原莉奈一区二区三区在线观看| 午夜精品一区二区三区在线视频 | 91免费观看视频| 7777精品伊久久久大香线蕉语言| 日韩久久久久久久久久| 一本色道精品久久一区二区三区| 欧美大片免费看| 免费成年人视频在线观看| 欧美偷拍自拍| 在线亚洲男人天堂| 亚洲av无码一区二区三区人 | 久草热8精品视频在线观看| 奇门遁甲1982国语版免费观看高清 | 波多野结衣视频免费观看| 亚洲国产精品一区| 久久久久久av| 久久久久亚洲av成人片| 综合五月婷婷| 欧美第一淫aaasss性| 久久久久亚洲av片无码| 欧美第一精品| 久久久久www| 欧美人禽zoz0强交| 欧美视频一区| 欧美激情一二区| 日本三级中文字幕| 99国产精品| 欧美一区在线直播| 中文字幕国产在线观看| 国产精品美女久久久| 欧美又大又粗又长| www.国产毛片| 免费在线看成人av| 亚洲www视频| 亚洲成人一二三区| 北条麻妃一区二区三区| 久久久久久久久久久久久久一区 | 久久久久北条麻妃免费看| 小早川怜子一区二区的演员表| 99成人超碰| 欧美国产在线视频| 日韩黄色精品视频| 久久成人一区| 成人免费视频网址| 成人无码一区二区三区| 91在线视频网址| 午夜精品一区二区在线观看的| 麻豆传媒在线观看| 亚洲人成网站色在线观看| 毛片在线视频观看| 美女露胸视频在线观看| 欧美午夜精品一区二区蜜桃| 亚洲网中文字幕| 国产欧美三级电影| 亚洲欧美三级伦理| 亚洲人与黑人屁股眼交| 狠狠色综合网| 国产精品亚洲视频在线观看| 国产ts人妖调教重口男| 99久久久无码国产精品| 亚洲国产精品一区在线观看不卡| 18网站在线观看| 日韩欧美福利视频| 一本之道在线视频| 日韩av字幕| 日韩视频免费看| 日韩久久久久久久久| 美国毛片一区二区| 国产九区一区在线| 9i精品一二三区| 亚洲成av人片| 黄色小视频免费网站| 卡通动漫精品一区二区三区| 夜夜嗨av色综合久久久综合网| 美女福利视频在线观看| 日韩精品亚洲一区| 国产精品国色综合久久| lutube成人福利在线观看| 亚洲一区二区不卡免费| 国产精品久久a| 日韩av黄色在线| 欧美激情高清视频| 一级黄色片网站| 久久久久久久av麻豆果冻| 视色,视色影院,视色影库,视色网| 久久人体大尺度| 精品奇米国产一区二区三区| 成年人看的免费视频| 亚洲综合日本| 国产精品一区二区三区免费观看| 麻豆影视在线观看_| 欧美日韩午夜剧场| 图片区偷拍区小说区| 日韩激情免费| 日韩美女免费线视频| 天天射天天操天天干| 依依成人综合视频| 亚洲 国产 图片| 日本激情一区| 国产精品海角社区在线观看| 日韩porn| 色婷婷久久99综合精品jk白丝| 国产精品久久久久久亚洲色| 欧美精品自拍| 亚洲综合av影视| 国产盗摄在线观看| 欧美日韩国产另类一区| 超碰人人人人人人人| 日产国产高清一区二区三区| 欧美三级电影在线播放| 小早川怜子影音先锋在线观看| 亚洲国产精品中文| 日韩少妇裸体做爰视频| 成人av在线播放网址| www.av91| 理论片一区二区在线| 国内精品一区二区三区| 欧美 日韩 人妻 高清 中文| 亚洲午夜电影网| 亚洲激情 欧美| 99国产精品视频免费观看一公开 | 美丽的姑娘在线观看免费动漫| 天天色天天爱天天射综合| 国产视频久久久久久| 亚洲毛片网站| 美女三级99| 日日夜夜天天综合| 在线视频一区二区| 亚洲网站免费观看| 亚洲免费在线电影| 美女网站视频在线观看| 亚洲九九精品| 欧美日韩一区二区视频在线观看| 少妇精品视频一区二区免费看| 在线观看日韩www视频免费| 亚洲中文一区二区三区| 亚洲视频一区二区在线观看| wwwxxxx在线观看| 亚洲精品资源| 天堂资源在线亚洲资源| 色狠狠一区二区三区| 欧美高清激情视频| 天堂中文在线8| 欧美午夜精品久久久久久浪潮 | 亚洲三级理论片| 中文字幕99页| 日韩高清在线一区| 日韩 欧美 自拍| 大奶一区二区三区| 国产精品电影一区| 免费在线观看黄| 亚洲电影免费观看高清完整版在线观看 | 秋霞午夜鲁丝一区二区老狼| 艳母动漫在线观看| 久久悠悠精品综合网| 国产精品视频内| 91福利区在线观看| 色噜噜狠狠狠综合曰曰曰88av | 日韩第二十一页| 久久久天堂国产精品女人| 精品视频二区| 日韩女优视频免费观看| 日本中文字幕第一页| 亚洲欧美自拍偷拍| 蜜桃精品一区二区| 国产美女久久久久| 国产熟女高潮视频| 国产精品九九| 亚洲三级一区| 天堂资源在线亚洲| 91久久精品美女高潮| 中文字幕在线看片| 久久综合电影一区| 国产综合视频一区二区三区免费| 欧美一二三四区在线| 精产国品一区二区| 亚洲综合色婷婷| 日本一二三不卡视频| av在线免费不卡| 麻豆传媒在线看| 蜜臀va亚洲va欧美va天堂| 人妻无码久久一区二区三区免费| 国产精品成人av| 日韩亚洲一区在线播放| 欧美久久精品| 99在线观看视频| 曰本一区二区| 国产精品永久免费观看| 在线天堂新版最新版在线8| 九九精品在线视频| 日本在线免费网| 国产一区二区三区丝袜| 男人天堂资源在线| 亚洲精品美女在线观看播放| 亚洲精品18p| 91精品国产全国免费观看| 中文字幕在线观看免费| 欧美天天综合色影久久精品| 丰满少妇乱子伦精品看片| 一区二区三区欧美在线观看| 国产精品视频一区二区在线观看| 国产女人水真多18毛片18精品视频| 人妻在线日韩免费视频| 成人av在线影院| 看全色黄大色黄女片18| 国产成人午夜精品影院观看视频 | 日本一区二区乱| 91日本在线视频| 3d动漫一区二区三区在线观看| 国产精品久久久一区| 亚洲第一影院| 国产精品日韩在线一区| 欧美日韩成人影院| 国产精品国语对白| 午夜日韩成人影院| 国产成人精品久久二区二区91| 日韩激情电影免费看| 91国内揄拍国内精品对白| 国产精品论坛| 亲子乱一区二区三区电影| 这里有精品可以观看| 庆余年2免费日韩剧观看大牛| 热99精品里视频精品| 69久久精品无码一区二区| 久久国产综合精品| 91插插插插插插插插| 秋霞av亚洲一区二区三| 午夜在线观看av| 久久精品国产亚洲高清剧情介绍| 男人舔女人下面高潮视频| 老牛嫩草一区二区三区日本 | 爽好久久久欧美精品| 成年人视频网站免费观看| 另类亚洲自拍| 69久久久久久| 国产一区不卡精品| 国内自拍偷拍视频| 91香蕉国产在线观看软件| 免费黄色在线视频| 中文一区二区完整视频在线观看| 欧美巨胸大乳hitomi| 亚洲视频一二三| 精品视频久久久久| 第一福利永久视频精品| 无码人妻丰满熟妇区五十路| 欧美午夜一区二区三区 | 大胆人体一区二区| 国产精品电影网| 国模大尺度视频一区二区| 成人一区二区三区四区| 九九综合九九| 咪咪色在线视频| 亚洲美女一区| 精品999在线| 国产99久久久久久免费看农村| 波多野结衣影院| 国产精品毛片久久久久久| 91视频免费在线看| 欧美性生活大片免费观看网址| 一级黄色片在线看| 亚洲国产婷婷香蕉久久久久久| 黄网在线观看| 久久6精品影院| 成人开心激情| 国产伦精品一区二区三区免 | 国产96在线 | 亚洲| 日韩高清电影一区| 911亚洲精选| 国产精品你懂的| 可以在线观看av的网站| 91麻豆精品国产| 国产综合在线观看| 欧美黄色小视频| 日韩欧美精品一区二区综合视频| 成人三级视频在线观看一区二区| 人人狠狠综合久久亚洲婷| 激情五月宗合网| 国产激情精品久久久第一区二区 | 精品久久久久久久中文字幕| 一区二区三区免费在线| 国产手机视频精品| 羞羞的视频在线观看| 日韩av电影在线免费播放| 91在线一区| 先锋影音男人资源| 日韩av一区二区三区四区| 欧美精品黑人猛交高潮| 一区二区理论电影在线观看| 美女黄页在线观看| 精品丝袜一区二区三区| 成人爽a毛片免费啪啪动漫| 成人免费视频网址| 成人免费电影网址| 国产午夜福利视频在线观看| 成人一区二区三区在线观看| 影音先锋男人资源在线观看| 色综合亚洲欧洲| 四虎永久在线观看| 欧美大荫蒂xxx| 亚洲欧美日本国产| 日本一道在线观看| 久88久久88久久久| 免费精品在线视频| 欧美在线播放高清精品| 免费黄色在线视频网站| 性色av香蕉一区二区| 国产精品毛片视频| 我的公把我弄高潮了视频| 国产精品18久久久久久久久久久久| 婷婷激情四射网| 欧美美女视频在线观看| 视频三区在线| 国产综合色香蕉精品| 久久伦理在线| 日本人69视频| 亚洲视频在线观看一区| 国产欧美久久久| 欧美成人亚洲成人| 亚洲天堂av资源在线观看| 国产情侣第一页| 成人综合在线观看| 国产情侣在线视频| 亚洲精品国产拍免费91在线| av福利在线导航| 蜜桃麻豆91| 日韩成人午夜精品| 国产精品视频在| 日韩无一区二区| 里番在线播放| 国产一区精品在线| 久久久精品网| 国产探花视频在线| 欧美久久久久久久久中文字幕| 日韩激情美女| 久草一区二区| 日本亚洲三级在线| 日本在线一级片| 亚洲国产一区二区三区在线观看 | 欧美午夜理伦三级在线观看| 免费黄色网页在线观看| 7777奇米亚洲综合久久| 最新国产拍偷乱拍精品| 91中文字幕永久在线| 欧美亚洲国产一区在线观看网站| 福利视频在线| 国产一区在线观| 三级精品在线观看| 我要看黄色一级片| 亚洲国产成人精品一区二区| av有声小说一区二区三区| 中文字幕中文字幕在线中心一区| 国产成人亚洲综合a∨婷婷图片| 亚洲免费黄色网址| 少妇激情综合网| 国产在线播放精品| 国产理论在线播放| 一区二区三区不卡视频| 日中文字幕在线| 91久久国产综合久久蜜月精品| 日韩天天综合| 日韩在线视频免费看| 亚洲黄色片网站| 伊人久久大香伊蕉在人线观看热v| 久久国产成人精品国产成人亚洲|