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

SpringCloud CircuitBreaker斷路器應用詳解

開發 前端
在上面我們所看到的API,如:CircuitBreaker,CircuitBreakerFactory這些接口(抽象類)的定義都在Spring Cloud Commons包中定義,而具體的實現我們還需要自己根據情況引入。如Resilience4J或者Sentinel,本篇內容使用Resilience4J。

環境:Springboot2.6.14 + Spring Cloud2021.0.5


概述

Spring Cloud Circuit breaker提供了一個跨不同斷路器實現的抽象。它為你的應用程序提供了一致的API,讓你(開發人員)選擇最適合你應用程序需求的斷路器實現。

Spring Cloud支持以下斷路器實現:

  • Resilience4J
  • Sentinel
  • Spring Retry

核心概念

要在代碼中創建斷路器,可以使用CircuitBreakerFactory API。當你在classpath中包含SpringCloud CircuitBreaker啟動器時,會自動為你創建一個實現了這個API的bean。下面的例子展示了如何使用這個API:?

@Service
public static class DemoControllerService {
private RestTemplate rest;
private CircuitBreakerFactory cbFactory;


public DemoControllerService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
this.rest = rest;
this.cbFactory = cbFactory;
}


public String slow() {
return cbFactory.create("slow").run(() -> rest.getForObject("/slow", String.class), throwable -> "fallback");
}


}

以上是斷路器的基本使用方法。CircuitBreakerFactory.create API創建一個名為CircuitBreaker的類實例。run方法接受一個Supplier和一個Function作為參數。Supplier是要封裝在斷路器中的代碼。該函數是在斷路器跳閘時運行的備用機制也就是會調用run方法的第二個參數Function

實現原理

  • 自動配置

在上面我們所看到的API,如:CircuitBreakerCircuitBreakerFactory這些接口(抽象類)的定義都在Spring Cloud Commons包中定義,而具體的實現我們還需要自己根據情況引入。如Resilience4J或者Sentinel,本篇內容使用Resilience4J。

首先,引入Ressilience4J自動配置

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>

引入該依賴后自動配置CircuitBreakerFactory的實現?

// 可以通過spring.cloud.circuitbreaker.resilience4j.enabled控制是否啟用,默認開啟
@EnableConfigurationProperties(Resilience4JConfigurationProperties.class)
@ConditionalOnProperty(name = { "spring.cloud.circuitbreaker.resilience4j.enabled",
"spring.cloud.circuitbreaker.resilience4j.blocking.enabled" }, matchIfMissing = true)
public class Resilience4JAutoConfiguration {
@Autowired(required = false)
private List<Customizer<Resilience4JCircuitBreakerFactory>> customizers = new ArrayList<>();


@Bean
@ConditionalOnMissingBean(CircuitBreakerFactory.class)
public Resilience4JCircuitBreakerFactory resilience4jCircuitBreakerFactory(
CircuitBreakerRegistry circuitBreakerRegistry, TimeLimiterRegistry timeLimiterRegistry,
@Autowired(required = false) Resilience4jBulkheadProvider bulkheadProvider,
Resilience4JConfigurationProperties resilience4JConfigurationProperties) {
Resilience4JCircuitBreakerFactory factory = new Resilience4JCircuitBreakerFactory(circuitBreakerRegistry,
timeLimiterRegistry, bulkheadProvider, resilience4JConfigurationProperties);
customizers.forEach(customizer -> customizer.customize(factory));
return factory;
}
}

有了上面的工廠類Resilience4JCircuitBreakerFactory后我們就可以通過該工廠進行實際的開發了。

在上面的Bean創建方法參數中有幾個非常重要的核心類:

  1. CircuitBreakerRegistry

該類用來配置注冊創建CircuitBreaker實例。

  1. TimeLimiterRegistry

該類用來注冊配置每一個實例(CircuitBreaker)的時間限制。

  1. Resilience4jBulkheadProvider

該類主要是提供了隔離機制,其內通過BulkheadRegistry及
ThreadPoolBulkheadRegistry注冊配置每一個實例的隔離機制及線程池隔離配置。

  • 核心類Resilience4JCircuitBreakerFactory

在需要進行熔斷降級操作都需用通過該工廠進行創建CircuitBreaker實例?

public class Resilience4JCircuitBreakerFactory {
private CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.ofDefaults();
private TimeLimiterRegistry timeLimiterRegistry = TimeLimiterRegistry.ofDefaults();
private ExecutorService executorService = Executors.newCachedThreadPool();
private Function<String, Resilience4JConfigBuilder.Resilience4JCircuitBreakerConfiguration> defaultConfiguration;


public Resilience4JCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry,
TimeLimiterRegistry timeLimiterRegistry, Resilience4jBulkheadProvider bulkheadProvider,
Resilience4JConfigurationProperties resilience4JConfigurationProperties) {
this.circuitBreakerRegistry = circuitBreakerRegistry;
this.timeLimiterRegistry = timeLimiterRegistry;
this.bulkheadProvider = bulkheadProvider;
// 獲取默認的配置(當沒有為具體的id實例創建配置時,使用該默認配置)
this.defaultConfiguration = id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(this.circuitBreakerRegistry.getDefaultConfig())
.timeLimiterConfig(this.timeLimiterRegistry.getDefaultConfig()).build();
this.resilience4JConfigurationProperties = resilience4JConfigurationProperties;
}
}

創建CircuitBreaker實例

public Resilience4JCircuitBreaker create(String id) {
return create(id, id, this.executorService);
}
private Resilience4JCircuitBreaker create(String id, String groupName,
ExecutorService circuitBreakerExecutorService) {
// 根據實例id獲取對應的配置,如果不存在則使用默認的配置
// 初始是沒有對應id的配置
Resilience4JConfigBuilder.Resilience4JCircuitBreakerConfiguration config = getConfigurations()
.computeIfAbsent(id, defaultConfiguration);
// spring.cloud.circuitbreaker.resilience4j.disableThreadPool 默認false
if (resilience4JConfigurationProperties.isDisableThreadPool()) {
return new Resilience4JCircuitBreaker(id, groupName, config.getCircuitBreakerConfig(),
config.getTimeLimiterConfig(), circuitBreakerRegistry, timeLimiterRegistry,
Optional.ofNullable(circuitBreakerCustomizers.get(id)), bulkheadProvider);
} else {
// 創建CircuitBreaker實例,這里的config.getCircuitBreakerConfig和config.getTimeLimiterConfig
// 兩個方法返回的默認的配置(首次)
return new Resilience4JCircuitBreaker(id, groupName, config.getCircuitBreakerConfig(),
config.getTimeLimiterConfig(), circuitBreakerRegistry, timeLimiterRegistry,
circuitBreakerExecutorService, Optional.ofNullable(circuitBreakerCustomizers.get(id)),bulkheadProvider);
}
}

Resilience4JCircuitBreaker實例?

public class Resilience4JCircuitBreaker implements CircuitBreaker {
public Resilience4JCircuitBreaker(String id, String groupName,
io.github.resilience4j.circuitbreaker.CircuitBreakerConfig circuitBreakerConfig,
TimeLimiterConfig timeLimiterConfig, CircuitBreakerRegistry circuitBreakerRegistry,
TimeLimiterRegistry timeLimiterRegistry, ExecutorService executorService,
Optional<Customizer<io.github.resilience4j.circuitbreaker.CircuitBreaker>> circuitBreakerCustomizer,
Resilience4jBulkheadProvider bulkheadProvider) {
this.id = id;
this.groupName = groupName;
this.circuitBreakerConfig = circuitBreakerConfig;
this.registry = circuitBreakerRegistry;
this.timeLimiterRegistry = timeLimiterRegistry;
this.timeLimiterConfig = timeLimiterConfig;
this.executorService = executorService;
// ...
}
public <T> T run(Supplier<T> toRun, Function<Throwable, T> fallback) {
// ...
// 下面的CircuitBreaker和TimeLimiter都會先從Registry中獲取,不存在則使用默認的
// 從CircuitBreakerRegistry獲取對應Id實例配置,如果不存在則返回的就是當前circuitBreakerConfig
io.github.resilience4j.circuitbreaker.CircuitBreaker defaultCircuitBreaker = registry.circuitBreaker(this.id,
this.circuitBreakerConfig, tags);
// 如果對應Id實例配置不存在則應用默認的timeLimiterConfig配置
TimeLimiter timeLimiter = timeLimiterRegistry.timeLimiter(id, timeLimiterConfig, tags);
// ...
}
}

CircuitBreakerRegistry注冊器

該注冊器將配置文件中配置的實例配置進行注冊并提供默認的配置

@Import({CircuitBreakerConfigurationOnMissingBean.class, FallbackConfigurationOnMissingBean.class})
public class CircuitBreakerAutoConfiguration {}

CircuitBreakerConfigurationOnMissingBean該類注冊CircuitBreakerRegistry

@Configuration
public class CircuitBreakerConfigurationOnMissingBean extends AbstractCircuitBreakerConfigurationOnMissingBean {


public CircuitBreakerConfigurationOnMissingBean(CircuitBreakerConfigurationProperties circuitBreakerProperties) {
super(circuitBreakerProperties);
}
}

屬性配置?

// 相關配置都在該屬性配置中
@ConfigurationProperties(prefix = "resilience4j.circuitbreaker")
public class CircuitBreakerProperties extends CircuitBreakerConfigurationProperties {}

AbstractCircuitBreakerConfigurationOnMissingBean?

@Configuration
@Import({FallbackConfigurationOnMissingBean.class, SpelResolverConfigurationOnMissingBean.class})
public abstract class AbstractCircuitBreakerConfigurationOnMissingBean {
protected final CircuitBreakerConfiguration circuitBreakerConfiguration;
protected final CircuitBreakerConfigurationProperties circuitBreakerProperties;
public AbstractCircuitBreakerConfigurationOnMissingBean(CircuitBreakerConfigurationProperties circuitBreakerProperties) {
this.circuitBreakerProperties = circuitBreakerProperties;
this.circuitBreakerConfiguration = new CircuitBreakerConfiguration(circuitBreakerProperties);
}
@Bean
@ConditionalOnMissingBean
public CircuitBreakerRegistry circuitBreakerRegistry(
EventConsumerRegistry<CircuitBreakerEvent> eventConsumerRegistry,
RegistryEventConsumer<CircuitBreaker> circuitBreakerRegistryEventConsumer,
@Qualifier("compositeCircuitBreakerCustomizer") CompositeCustomizer<CircuitBreakerConfigCustomizer> compositeCircuitBreakerCustomizer) {
// 創建實例
return circuitBreakerConfiguration
.circuitBreakerRegistry(eventConsumerRegistry, circuitBreakerRegistryEventConsumer,compositeCircuitBreakerCustomizer);
}
}

CircuitBreakerConfiguration?

@Configuration
public class CircuitBreakerConfiguration {
private final CircuitBreakerConfigurationProperties circuitBreakerProperties;
public CircuitBreakerConfiguration(CircuitBreakerConfigurationProperties circuitBreakerProperties) {
this.circuitBreakerProperties = circuitBreakerProperties;
}
@Bean
public CircuitBreakerRegistry circuitBreakerRegistry(
EventConsumerRegistry<CircuitBreakerEvent> eventConsumerRegistry,
RegistryEventConsumer<CircuitBreaker> circuitBreakerRegistryEventConsumer,
@Qualifier("compositeCircuitBreakerCustomizer") CompositeCustomizer<CircuitBreakerConfigCustomizer> compositeCircuitBreakerCustomizer) {
// 將resilience4j.circuitbreaker.configs所有配置進行注冊
CircuitBreakerRegistry circuitBreakerRegistry = createCircuitBreakerRegistry(
circuitBreakerProperties, circuitBreakerRegistryEventConsumer,
compositeCircuitBreakerCustomizer);
//...
// 將resilience4j.circuitbreaker.instances所有配置進行注冊
initCircuitBreakerRegistry(circuitBreakerRegistry, compositeCircuitBreakerCustomizer);
return circuitBreakerRegistry;
}
}

上面的configs和instances所有的配置都會注冊到AbstractRegistry.entryMap中。

獲取實例Id配置

io.github.resilience4j.circuitbreaker.CircuitBreaker defaultCircuitBreaker = registry.circuitBreaker(this.id,this.circuitBreakerConfig, tags);
// InMemoryCircuitBreakerRegistry
public CircuitBreaker circuitBreaker(String name, CircuitBreakerConfig config,io.vavr.collection.Map<String, String> tags) {
return computeIfAbsent(name, () -> CircuitBreaker.of(name, Objects.requireNonNull(config, CONFIG_MUST_NOT_BE_NULL), getAllTags(tags)));
}
// AbstractRegistry
protected E computeIfAbsent(String name, Supplier<E> supplier) {
// 從map獲取
return entryMap.computeIfAbsent(Objects.requireNonNull(name, NAME_MUST_NOT_BE_NULL), k -> {
E entry = supplier.get();
eventProcessor.processEvent(new EntryAddedEvent<>(entry));
return entry;
});
}

TimeLimiterRegistry注冊器

該配置與CircuitBreakerRegistry的配置類似,這里不贅述

以上就是Resilience4J的實現原理

Resilience4J配置

resilience4j:
circuitbreaker:
#configs:
# default:
# minimumNumberOfCalls: 5 #默認配置
instances:
#在Feign中使用的命名
DemoFeignformat:
minimumNumberOfCalls: 5
lkk:
minimumNumberOfCalls: 2
timelimiter:
configs:
#為任何調用提供默認的配置
default:
timeoutDuration: 1s
instances:
DemoFeignformat:
timeoutDuration: 1s
DemoFeigndate3:
timeoutDuration: 5s
lkk:
timeoutDuration: 1s

在上面Feign的命名規則如下:

如果開啟了如下配置:?

feign:
circuitbreaker:
enabled: true
alphanumericIds:
enabled: true
public class FeignClientFactoryBean {
<T> T getTarget() {
Feign.Builder builder = feign(context);
}
}
public final class FeignCircuitBreaker {
public static final class Builder extends Feign.Builder {
public Feign build(final FallbackFactory<?> nullableFallbackFactory) {
// FeignCircuitBreakerInvocationHandler執行調用
super.invocationHandlerFactory((target, dispatch) -> new FeignCircuitBreakerInvocationHandler(circuitBreakerFactory,
feignClientName, target, dispatch, nullableFallbackFactory,
circuitBreakerGroupEnabled, circuitBreakerNameResolver));
return super.build();
}
}
}

FeignCircuitBreakerInvocationHandler?

class FeignCircuitBreakerInvocationHandler implements InvocationHandler {
private final CircuitBreakerNameResolver circuitBreakerNameResolver;
public Object invoke() {
String circuitName = circuitBreakerNameResolver.resolveCircuitBreakerName(feignClientName, target, method);
CircuitBreaker circuitBreaker = circuitBreakerGroupEnabled ? factory.create(circuitName, feignClientName) : factory.create(circuitName);
}
}
static class AlphanumericCircuitBreakerNameResolver extends DefaultCircuitBreakerNameResolver {


@Override
public String resolveCircuitBreakerName(String feignClientName, Target<?> target, Method method) {
return super.resolveCircuitBreakerName(feignClientName, target, method).replaceAll("[^a-zA-Z0-9]", "");
}
}
static class DefaultCircuitBreakerNameResolver implements CircuitBreakerNameResolver {


@Override
public String resolveCircuitBreakerName(String feignClientName, Target<?> target, Method method) {
return Feign.configKey(target.type(), method);
}
}
public abstract class Feign {
// 開啟了Alphanumeric會將特殊字符全部刪除
public static String configKey(Class targetType, Method method) {
StringBuilder builder = new StringBuilder();
builder.append(targetType.getSimpleName());
builder.append('#').append(method.getName()).append('(');
for (Type param : method.getGenericParameterTypes()) {
param = Types.resolve(targetType, targetType, param);
builder.append(Types.getRawType(param).getSimpleName()).append(',');
}
if (method.getParameterTypes().length > 0) {
builder.deleteCharAt(builder.length() - 1);
}
return builder.append(')').toString();
}
}

以上就是基于Resilience4J的實現原理及配置實現

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2021-12-09 08:57:46

Spring ClouCircuit Bre斷路器

2021-12-15 08:15:26

Spring Circuit BreSpring Clou

2022-10-08 11:39:56

斷路器Golang項目

2022-09-15 15:25:47

spring-微服務

2020-09-15 08:38:13

Sentinel攔截Spring

2019-10-15 08:41:37

SpringCloud框架服務器

2023-11-09 18:01:46

JavaSpring容器化

2023-11-06 08:25:33

項目遠程接口

2024-10-06 08:35:44

2017-03-13 08:58:46

Spring Clou概覽架構

2017-06-25 13:33:25

Spring Clou微服務架構

2023-02-07 07:43:27

微服務應用框架

2024-04-03 08:58:48

軟件架構隔板
點贊
收藏

51CTO技術棧公眾號

午夜亚洲伦理| 日本一区影院| 国产精品欧美一级免费| 国产欧美在线看| 国产黄色的视频| 超碰精品在线| 欧美在线观看视频一区二区| 中文字幕欧美日韩一区二区三区| 丰满人妻一区二区三区四区53| 欧美亚洲三级| 日韩有码在线视频| 天天躁日日躁狠狠躁av麻豆男男| 成人免费影院| 综合色中文字幕| 九九热久久66| 国产乱叫456在线| 亚洲欧美日韩国产综合精品二区| 久久精品国产v日韩v亚洲| 美女伦理水蜜桃4| 成人在线免费| 精品福利视频导航| 在线观看成人av电影| 天堂在线观看免费视频| 久久99精品网久久| 91成人福利在线| 日韩福利小视频| 少妇一区二区视频| 精品奇米国产一区二区三区| 国产区二区三区| 97人人爽人人澡人人精品| 欧美国产欧美亚州国产日韩mv天天看完整| 99国产在线| 亚洲天堂手机版| 久久福利精品| 91国内产香蕉| 免费中文字幕在线观看| 日韩精品一区二区三区免费观影| 日韩国产高清视频在线| 绯色av蜜臀vs少妇| 日韩成人在线电影| 色婷婷久久99综合精品jk白丝| 日本a在线天堂| 日本不卡视频| 欧美国产精品一区二区| 欧美日韩国产高清视频| 日本高清视频网站| 高清成人免费视频| 亚洲最大成人在线| 国产精品久久久久久久成人午夜| 秋霞电影一区二区| 国产精品美腿一区在线看| 国产精品第5页| 国产亚洲一级| 97热精品视频官网| 激情五月色婷婷| av成人毛片| 68精品国产免费久久久久久婷婷 | 欧美色图色综合| aa国产成人| 欧美日韩亚洲国产一区| 精品视频免费在线播放| 91美女主播在线视频| 亚洲在线视频免费观看| 久久久久久久9| 永久免费网站在线| 亚洲一区二区三区在线看 | 亚洲欧美成人| 日本精品视频在线观看| 日本一区二区免费电影| 天堂蜜桃一区二区三区 | 日韩一区免费| 亚洲国产精品高清久久久| 深夜视频在线观看| 欧美日韩一区二区三区四区不卡 | 青青草视频一区| 国产精品一区二区三区在线播放| 亚洲最新av网站| 国产乱码精品一区二区三区忘忧草| 91情侣在线视频| 色呦呦中文字幕| 国产欧美精品一区二区色综合朱莉| 台湾成人av| 91精选在线| 精品成人久久av| 婷婷六月天在线| 91精品在线免费视频| 精品美女被调教视频大全网站| 中文字幕在线永久| 超碰成人久久| 欧美精品激情在线观看| 日韩免费av网站| 狠狠色丁香久久婷婷综合_中| 97久久天天综合色天天综合色hd | 狠狠88综合久久久久综合网| 国模视频一区二区| 亚洲欧美综合另类| 久久一区激情| 国产在线久久久| 精品黑人一区二区三区国语馆| 成人黄色在线视频| 欧美一级日本a级v片| 日本视频在线观看| 亚洲欧美日韩久久| 日本日本19xxxⅹhd乱影响| 久久69成人| 亚洲精品在线三区| 欧美做受高潮6| 91精品精品| 97精品国产97久久久久久免费| 午夜精品一区二| 国产又黄又大久久| 91久久偷偷做嫩草影院| 番号在线播放| 亚洲成国产人片在线观看| 18岁视频在线观看| 成人日韩视频| 日韩精品在线观看一区二区| 国产黄色录像片| 国产精品久久久久久久久久妞妞 | 国产精品亚洲综合在线观看 | 亚洲日穴在线视频| 欧美视频在线观看视频| 57pao成人永久免费| 亚洲第一av网| 四虎地址8848| 国产精品一区亚洲| 亚洲一区亚洲二区亚洲三区| 你懂的好爽在线观看| 亚洲激情网站免费观看| 亚洲精品无码久久久久久| 第四色在线一区二区| 中文字幕久热精品在线视频| 六月丁香在线视频| 国产高清精品久久久久| 日韩精品久久久| 99在线视频影院| 欧美一区三区四区| 婷婷国产成人精品视频| 国产乱码精品| 99久热re在线精品视频| 午夜在线小视频| 色综合久久中文综合久久97 | 国内精品伊人久久久久av影院| 日本不卡免费新一二三区| ****av在线网毛片| 91精品免费在线| 久操视频在线观看免费| 亚洲视频二区| 国产高清一区二区三区| 黄a在线观看| 欧美色男人天堂| 日韩精品电影一区二区三区| 免费日韩精品中文字幕视频在线| 成人资源av| 亚洲欧美成人影院| 7777精品伊人久久久大香线蕉 | 丁香啪啪综合成人亚洲| 日日夜夜精品视频| 欧美国产日韩二区| 国产色视频在线| 自拍偷拍亚洲综合| 亚洲欧美日韩精品一区| 日韩成人精品一区二区| 国产成人一区二区三区| 欧洲一区av| 午夜日韩在线观看| 精品少妇一区二区三区免费观| 亚洲精品人人| 91久热免费在线视频| 黄在线免费看| 欧美电影一区二区| 亚洲精品视频网址| 精品午夜久久福利影院| 一区二区三区我不卡| 亚洲一区有码| 美女福利精品视频| 亚洲国产成人一区二区 | 国产青草视频在线观看| 亚洲一区网址| 日韩免费视频在线观看| 国产三区四区在线观看| 欧美日韩中文字幕一区二区| www..com.cn蕾丝视频在线观看免费版| 久久亚洲视频| 亚洲丰满在线| 国产精品一站二站| 欧美亚洲视频在线看网址| av女名字大全列表| 在线观看免费亚洲| 秋霞欧美一区二区三区视频免费| 国产在线播精品第三| 日韩精品视频在线观看视频| 日韩大片在线免费观看| 国产精品黄色av| 国产二区三区在线| 亚洲国内高清视频| 波多野结衣电车痴汉| 国产精品第13页| 无码人妻丰满熟妇啪啪网站| 国产亚洲激情| 激情六月天婷婷| 欧洲精品一区| 国产精品一区二区在线| 18+激情视频在线| 日韩精品视频免费专区在线播放 | youjizz亚洲女人| 国产精品一区二区免费不卡 | 欧美精品v国产精品v日韩精品 | 亚洲一区二区三区四区的| 丰满大乳奶做爰ⅹxx视频| 日韩极品在线观看| 日本高清视频免费在线观看| 亚洲人成网亚洲欧洲无码| 国产欧美一区二区三区四区 | 欧美一区第一页| 欧美成年黄网站色视频| 亚洲丁香婷深爱综合| 亚洲精品一区二三区| 亚洲免费伊人电影| 艳妇乳肉豪妇荡乳xxx| 麻豆极品一区二区三区| 国产l精品国产亚洲区久久| 亚洲人体av| 欧美日韩综合精品| 亚洲国产欧美国产第一区| 国产精品va在线播放| 成人三级小说| 亚洲一区999| 男男电影完整版在线观看| 欧美一区二区三区免费在线看 | 欧美日本在线看| 久久精品视频1| 日韩毛片视频在线看| 在线免费观看视频| 91在线免费播放| 亚洲精品成人无码毛片| 欧美aaaaaa午夜精品| 免费无码不卡视频在线观看| 欧美黄在线观看| 正在播放一区二区三区| 色狮一区二区三区四区视频| 欧美日韩亚洲一区二区三区四区| 91精品国产乱码久久久竹菊| 国产在线观看一区二区三区| 黄瓜视频成人app免费| 久久久久久久久中文字幕| 欧美一区二区三区在线观看免费| 中文字幕自拍vr一区二区三区| 三级黄视频在线观看| 精品久久久久久久久久久院品网 | 欧美日韩经典丝袜| 久久亚洲精品小早川怜子66| 18免费在线视频| 亚洲天堂av网| 九色在线视频蝌蚪| 亚洲男人天天操| 亚洲卡一卡二卡三| 日韩欧美在线网站| 国产美女免费视频| 777亚洲妇女| 一区二区三区www污污污网站| 欧美日韩国产综合新一区| 久久99精品波多结衣一区| 亚洲一区二区免费视频| 欧美成人免费看| 亚洲主播在线播放| 久久久久久久久97| 亚洲国产日韩综合久久精品| 三级黄色录像视频| 又紧又大又爽精品一区二区| 欧美黑人性猛交xxx| 亚洲女人****多毛耸耸8| 永久久久久久久| 一区二区高清免费观看影视大全| 久久久91视频| 亚洲国产精品一区二区久久| 国产性猛交普通话对白| 亚洲午夜久久久久| 久久久久久久99| 欧美日韩亚洲一区二区| 懂色av中文字幕| 日韩视频一区在线观看| 亚洲精品久久久蜜桃动漫| 精品粉嫩超白一线天av| 亚洲 另类 春色 国产| 亚洲色图美腿丝袜| 日本视频不卡| 欧美疯狂做受xxxx高潮| 日本高清不卡一区二区三区视频| 国产美女被下药99| 日韩一区二区三区精品视频第3页| 国产伦精品一区二区三区视频孕妇 | 超碰成人免费| 日本视频精品一区| 国产精品99久久精品| 日本精品久久久久久久久久| 久久婷婷一区| 亚洲综合20p| 91免费小视频| 美女福利视频网| 亚洲国产一区二区三区青草影视| 东京热一区二区三区四区| 欧美日韩国产不卡| 日本黄色免费视频| 久久精品视频在线| 咪咪网在线视频| 成人日韩av在线| 欧美美女啪啪| 天天干天天操天天干天天操| 国产精品久久久久久久久久妞妞 | 国产曰批免费观看久久久| 久久精品女同亚洲女同13| 国产精品进线69影院| 日韩久久精品视频| 欧美性大战xxxxx久久久| 性一交一乱一色一视频麻豆| 亚洲视频欧洲视频| 182在线视频观看| 91精品国产自产在线老师啪| 精品av导航| 一区国产精品| 久久五月激情| 日韩av手机在线播放| 亚洲欧洲美洲综合色网| 国产无套丰满白嫩对白| 精品国产污污免费网站入口 | 成人毛片视频在线观看| 国产suv精品一区二区68| 色婷婷综合激情| 婷婷五月综合激情| 欧美大学生性色视频| 成人免费一区| 蜜桃视频在线观看91| 狠狠爱综合网| 1314成人网| 国产精品系列在线| 国产www在线| 制服丝袜在线91| 麻豆tv在线| 国产精品日日摸夜夜添夜夜av| 九九热播视频在线精品6| 国产成年人在线观看| 制服诱惑一区二区| 国产老熟女伦老熟妇露脸| 一区二区免费视频| av网站免费大全| 久久久精品免费| 高清成人在线| 午夜免费电影一区在线观看| 久久综合九色| 欧美特黄一区二区三区| 天天免费综合色| 92久久精品一区二区| 欧美插天视频在线播放| 4438五月综合| 午夜啪啪福利视频| 精品一区二区三区免费毛片爱| 色偷偷www8888| 欧美一卡2卡3卡4卡| 国产黄a三级三级三级av在线看| 国产日韩欧美视频| 99九九热只有国产精品| 日本激情综合网| 国产精品免费人成网站| 在线免费a视频| 久久久国产一区二区三区| 在线欧美激情| 国产又粗又大又爽的视频| 成人精品亚洲人成在线| 国产午夜久久久| 日韩av综合网| 国产精品av一区二区三区 | 激情婷婷综合| 九九九在线观看视频| 国产精品久久午夜| 国产精品国产一区二区三区四区| 欧美多人爱爱视频网站| **爰片久久毛片| 久久黄色片视频| 久久日一线二线三线suv| 国产成人一级片| 久久夜精品香蕉| 日韩一区二区三区色| 精品欧美一区免费观看α√| 久久精品一区四区| 99热这里只有精品1| 国内精品在线一区| 国产aⅴ精品一区二区三区久久| 天天爽天天爽夜夜爽| 亚洲欧美综合另类在线卡通| 国产av无码专区亚洲av麻豆| 久久久久久这里只有精品| 西瓜成人精品人成网站| 午夜两性免费视频| 香蕉成人啪国产精品视频综合网| 邻居大乳一区二区三区| 91精品美女在线| 亚洲高清网站| 肉色超薄丝袜脚交69xx图片| 精品国产免费人成电影在线观看四季|