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

Spring Cloud Gateway實(shí)現(xiàn)灰度發(fā)布實(shí)現(xiàn)原理

開發(fā) 前端
灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。在其上可以進(jìn)行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開始用產(chǎn)品特性B,如果用戶對(duì)B沒有什么反對(duì)意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來。

什么是灰度發(fā)布

灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。在其上可以進(jìn)行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開始用產(chǎn)品特性B,如果用戶對(duì)B沒有什么反對(duì)意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來。灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度。

灰度發(fā)布類型

  • 金絲雀發(fā)布

將少量的請(qǐng)求引流到新版本上,因此部署新版本服務(wù)只需極小數(shù)的機(jī)器。驗(yàn)證新版本符合預(yù)期后,逐步調(diào)整流量權(quán)重比例,使得流量慢慢從老版本遷移至新版本,期間可以根據(jù)設(shè)置的流量比例,對(duì)新版本服務(wù)進(jìn)行擴(kuò)容,同時(shí)對(duì)老版本服務(wù)進(jìn)行縮容,使得底層資源得到最大化利用。

圖片


金絲雀發(fā)布的優(yōu)點(diǎn):

  1. 按比例將流量無差別地導(dǎo)向新版本,新版本故障影響范圍小;
  2. 發(fā)布期間逐步對(duì)新版本擴(kuò)容,同時(shí)對(duì)老版本縮容,資源利用率高。

金絲雀發(fā)布的缺點(diǎn):

  1. 流量無差別地導(dǎo)向新版本,可能會(huì)影響重要用戶的體驗(yàn);
  2. 發(fā)布周期長。

  • A/B測試

A/B 測試基于用戶請(qǐng)求的元信息將流量路由到新版本,這是一種基于請(qǐng)求內(nèi)容匹配的灰度發(fā)布策略。只有匹配特定規(guī)則的請(qǐng)求才會(huì)被引流到新版本,常見的做法包括基于 Header 和 Cookie。基于 Header 方式例子,例如 User-Agent 的值為 Android 的請(qǐng)求 (來自安卓系統(tǒng)的請(qǐng)求)可以訪問新版本,其他系統(tǒng)仍然訪問舊版本。基于 Cookie 方式的例子,Cookie 中通常包含具有業(yè)務(wù)語義的用戶信息,例如普通用戶可以訪問新版本,VIP 用戶仍然訪問舊版本。

圖片


  • 藍(lán)綠發(fā)布

藍(lán)綠發(fā)布需要對(duì)服務(wù)的新版本進(jìn)行冗余部署,一般新版本的機(jī)器規(guī)格和數(shù)量與舊版本保持一致,相當(dāng)于該服務(wù)有兩套完全相同的部署環(huán)境,只不過此時(shí)只有舊版本在對(duì)外提供服務(wù),新版本作為熱備。當(dāng)服務(wù)進(jìn)行版本升級(jí)時(shí),我們只需將流量全部切換到新版本即可,舊版本作為熱備。由于冗余部署的緣故,所以不必?fù)?dān)心新版本的資源不夠。如果新版本上線后出現(xiàn)嚴(yán)重的程序 BUG,那么我們只需將流量全部切回至舊版本,大大縮短故障恢復(fù)的時(shí)間。

圖片

Gateway實(shí)現(xiàn)灰度發(fā)布

本篇將文章將通過A/B測試方式實(shí)現(xiàn)灰度發(fā)布。接下來將展示在Spring Cloud Gateway中實(shí)現(xiàn)A/B測試核心組件。

  • 引入依賴?
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.4</version>
</dependency>
  • 自定義負(fù)載均衡器

自定義負(fù)載均衡器作用是根據(jù)請(qǐng)求的header中的v進(jìn)行服務(wù)實(shí)例的篩選。?

public class GrayRoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {


private static final Log log = LogFactory.getLog(RoundRobinLoadBalancer.class);


final AtomicInteger position;


final String serviceId;


ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;


public GrayRoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId) {
this(serviceInstanceListSupplierProvider, serviceId, new Random().nextInt(1000));
}


public GrayRoundRobinLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
String serviceId, int seedPosition) {
this.serviceId = serviceId;
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
this.position = new AtomicInteger(seedPosition);
}


@SuppressWarnings("rawtypes")
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
.getIfAvailable(NoopServiceInstanceListSupplier::new);
return supplier.get(request).next()
.map(serviceInstances -> processInstanceResponse(supplier, serviceInstances, request));
}


@SuppressWarnings("rawtypes")
private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier,
List<ServiceInstance> serviceInstances, Request request) {
Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(serviceInstances, request);
if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());
}
return serviceInstanceResponse;
}


@SuppressWarnings("rawtypes")
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, Request request) {
if (instances.isEmpty()) {
if (log.isWarnEnabled()) {
log.warn("No servers available for service: " + serviceId);
}
return new EmptyResponse();
}
List<ServiceInstance> result = instances.stream().filter(instance -> {
Map<String, String> metadata = instance.getMetadata();
Object orgId = metadata.get("v");
RequestDataContext context = (RequestDataContext) request.getContext() ;
RequestData requestData = context.getClientRequest() ;
String v = null ;
if (requestData instanceof GrayRequestData) {
GrayRequestData grayRequestData = (GrayRequestData) requestData ;
queryV = grayRequestData.getQueryParams().getFirst("v") ;
}
String value = requestData.getHeaders().getFirst("v") ;
return v != null && (v.equals(value) || v.equals(queryV)) ;
}).collect(Collectors.toList());
if (result.isEmpty()) {
result = instances;
}
int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;


ServiceInstance instance = result.get(pos % result.size());


return new DefaultResponse(instance);
}


}

以上負(fù)載均衡器將從header或者請(qǐng)求參數(shù)中獲取v參數(shù),然后根據(jù)v參數(shù)的值從服務(wù)實(shí)例列表中獲取metadata信息進(jìn)行比對(duì)。

全局過濾器

該過濾器的作用是通過上面的負(fù)載均衡器從其中選擇一個(gè)服務(wù)實(shí)例進(jìn)行服務(wù)的調(diào)用?

@SuppressWarnings({ "rawtypes", "unchecked" })
@Component
public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Ordered {


private static final Log log = LogFactory.getLog(GrayReactiveLoadBalancerClientFilter.class);

/**
* Order of filter.
*/
public static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10150;


private final LoadBalancerClientFactory clientFactory;


private final GatewayLoadBalancerProperties properties;




public GrayReactiveLoadBalancerClientFilter(LoadBalancerClientFactory clientFactory,
GatewayLoadBalancerProperties properties) {
this.clientFactory = clientFactory;
this.properties = properties;
}


@Override
public int getOrder() {
return LOAD_BALANCER_CLIENT_FILTER_ORDER;
}


@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
String schemePrefix = exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR);
if (url == null || (!"packlb".equals(url.getScheme()) && !"packlb".equals(schemePrefix))) {
return chain.filter(exchange);
}
// preserve the original url
addOriginalRequestUrl(exchange, url);


URI requestUri = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
String serviceId = requestUri.getHost();
Set<LoadBalancerLifecycle> supportedLifecycleProcessors = LoadBalancerLifecycleValidator
.getSupportedLifecycleProcessors(clientFactory.getInstances(serviceId, LoadBalancerLifecycle.class),
RequestDataContext.class, ResponseData.class, ServiceInstance.class);
DefaultRequest<RequestDataContext> lbRequest = new DefaultRequest<>(
new RequestDataContext(new GrayRequestData(exchange.getRequest()), getHint(serviceId)));
LoadBalancerProperties loadBalancerProperties = clientFactory.getProperties(serviceId);
return choose(lbRequest, serviceId, supportedLifecycleProcessors).doOnNext(response -> {


if (!response.hasServer()) {
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle
.onComplete(new CompletionContext<>(CompletionContext.Status.DISCARD, lbRequest, response)));
throw NotFoundException.create(properties.isUse404(), "Unable to find instance for " + url.getHost());
}


ServiceInstance retrievedInstance = response.getServer();


URI uri = exchange.getRequest().getURI();


// if the `lb:<scheme>` mechanism was used, use `<scheme>` as the default,
// if the loadbalancer doesn't provide one.
String overrideScheme = retrievedInstance.isSecure() ? "https" : "http";
if (schemePrefix != null) {
overrideScheme = url.getScheme();
}


DelegatingServiceInstance serviceInstance = new DelegatingServiceInstance(retrievedInstance,
overrideScheme);


URI requestUrl = reconstructURI(serviceInstance, uri);


if (log.isTraceEnabled()) {
log.trace("LoadBalancerClientFilter url chosen: " + requestUrl);
}
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, response);
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStartRequest(lbRequest, response));
}).then(chain.filter(exchange))
.doOnError(throwable -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle
.onComplete(new CompletionContext<ResponseData, ServiceInstance, RequestDataContext>(
CompletionContext.Status.FAILED, throwable, lbRequest,
exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR)))))
.doOnSuccess(aVoid -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle
.onComplete(new CompletionContext<ResponseData, ServiceInstance, RequestDataContext>(
CompletionContext.Status.SUCCESS, lbRequest,
exchange.getAttribute(GATEWAY_LOADBALANCER_RESPONSE_ATTR), buildResponseData(exchange,
loadBalancerProperties.isUseRawStatusCodeInResponseData())))));
}


@SuppressWarnings("deprecation")
private ResponseData buildResponseData(ServerWebExchange exchange, boolean useRawStatusCodes) {
if (useRawStatusCodes) {
return new ResponseData(new GrayRequestData(exchange.getRequest()), exchange.getResponse());
}
return new ResponseData(exchange.getResponse(), new RequestData(exchange.getRequest()));
}


protected URI reconstructURI(ServiceInstance serviceInstance, URI original) {
return LoadBalancerUriTools.reconstructURI(serviceInstance, original);
}


private Mono<Response<ServiceInstance>> choose(Request<RequestDataContext> lbRequest, String serviceId,
Set<LoadBalancerLifecycle> supportedLifecycleProcessors) {
ReactorLoadBalancer<ServiceInstance> loadBalancer = this.clientFactory.getInstance(serviceId,
ReactorServiceInstanceLoadBalancer.class);
if (loadBalancer == null) {
throw new NotFoundException("No loadbalancer available for " + serviceId);
}
supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest));
return loadBalancer.choose(lbRequest);
}


private String getHint(String serviceId) {
LoadBalancerProperties loadBalancerProperties = clientFactory.getProperties(serviceId);
Map<String, String> hints = loadBalancerProperties.getHint();
String defaultHint = hints.getOrDefault("default", "default");
String hintPropertyValue = hints.get(serviceId);
return hintPropertyValue != null ? hintPropertyValue : defaultHint;
}


}

配置

@Configuration
public class GrayDefaultConfiguration {


@Bean
public GrayRoundRobinLoadBalancer grayRandomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new GrayRoundRobinLoadBalancer(
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}

// 由于沒有使用服務(wù)注冊(cè)及發(fā)現(xiàn),這里通過編碼的方式定義服務(wù)實(shí)例
@Bean
public ServiceInstanceListSupplier sscServiceInstanceListSupplier() {
return new ServiceInstanceListSupplier() {
@Override
public Flux<List<ServiceInstance>> get() {
List<ServiceInstance> instances = new ArrayList<>() ;
Map<String, String> metadata1 = new HashMap<>() ;
metadata1.put("v", "1") ;
ServiceInstance s1 = new DefaultServiceInstance("s1", "ssc", "localhost", 8088 , false, metadata1) ;
instances.add(s1) ;

Map<String, String> metadata2 = new HashMap<>() ;
metadata2.put("v", "2") ;
ServiceInstance s2 = new DefaultServiceInstance("s2", "ssc", "localhost", 8099 , false, metadata2) ;
instances.add(s2) ;

return Flux.just(instances) ;
}
@Override
public String getServiceId() {
return "ssc" ;
}
};
}

}

負(fù)載均衡客戶端設(shè)置默認(rèn)的配置

@LoadBalancerClients(defaultConfiguration = GrayDefaultConfiguration.class)
public class SpringCloudGatewayApplication {
}

以上就是實(shí)現(xiàn)灰度發(fā)布的核心組件。

圖片

測試,設(shè)置不同的v返回不同服務(wù)的結(jié)果數(shù)據(jù)

完畢!!!

責(zé)任編輯:武曉燕 來源: 實(shí)戰(zhàn)案例錦集
相關(guān)推薦

2024-01-29 08:00:00

架構(gòu)微服務(wù)開發(fā)

2024-05-13 18:35:06

負(fù)載均衡主機(jī)端口

2019-08-22 09:55:17

RedisAPI數(shù)據(jù)

2024-12-16 13:34:35

2023-02-28 08:57:06

Spring上下線緩存

2025-03-04 08:53:10

2025-06-09 01:01:00

2022-08-15 09:22:12

JWT認(rèn)證系統(tǒng)

2021-12-27 15:01:21

KubernetesLinux命令

2022-01-07 07:29:08

Rbac權(quán)限模型

2023-07-24 08:00:56

客戶端訪問指定

2022-08-02 08:32:21

Spring項(xiàng)目網(wǎng)關(guān)

2023-02-13 08:10:40

Gateway網(wǎng)關(guān)Spring

2023-09-15 08:18:49

cookie網(wǎng)關(guān)代理

2023-07-13 09:01:39

Bean接口容器

2023-03-08 09:03:55

2022-02-15 14:22:46

灰度發(fā)布互聯(lián)網(wǎng)業(yè)務(wù)

2021-01-14 07:54:19

Spring Clou應(yīng)用路由

2021-06-04 08:48:46

Spring ClouMaven Centr版本

2023-01-26 01:41:27

核心全局過濾器
點(diǎn)贊
收藏

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

欧美综合在线第二页| 欧美精品一区二区三区在线播放 | 六月婷婷综合网| 在线免费高清一区二区三区| 亚洲欧美制服综合另类| 91精品视频国产| 超碰在线cao| 中文字幕欧美国产| 国产欧美一区二区三区另类精品| 日本视频网站在线观看| 自拍偷拍欧美专区| 亚洲性生活视频| 国产精品日日摸夜夜爽| 色成人免费网站| 亚洲在线一区二区三区| 日韩高清三级| 日本毛片在线观看| 国产综合久久久久影院| 青青草一区二区| 亚洲av鲁丝一区二区三区| 你懂的视频欧美| 欧美成va人片在线观看| www.99在线| 免费h在线看| 亚洲精品成人天堂一二三| 日韩欧美视频一区二区| 日韩一级中文字幕| 国产一区视频网站| 国产精品丝袜高跟| 国产精品久久久久久久妇| 伊人久久大香线| 最近2019中文字幕大全第二页| 国产av一区二区三区传媒| 四虎影视成人精品国库在线观看| 欧美日韩中国免费专区在线看| 久久香蕉视频网站| 黄av在线播放| 国产精品成人一区二区三区夜夜夜| 国内一区在线| 丰满人妻一区二区三区免费视频| 蜜桃精品视频在线| 日韩暖暖在线视频| 啦啦啦免费高清视频在线观看| 黄色亚洲在线| 欧美精品videossex性护士| 久草福利资源在线| 欧美3p在线观看| 色偷偷91综合久久噜噜| 五月婷婷婷婷婷| 日韩av久操| 中文字幕欧美视频在线| 免费一级特黄3大片视频| 国产欧美日韩精品一区二区三区| 日韩hd视频在线观看| 国产一线在线观看| 福利欧美精品在线| 日韩电影视频免费| 日本黄色特级片| 最新国产一区| 亚洲欧美第一页| 成人免费毛片糖心| 成人综合久久| 久久亚洲影音av资源网| 青草草在线视频| 狠狠入ady亚洲精品经典电影| 欧美华人在线视频| 成年人免费看毛片| 久久久久久黄| 国产精品一区久久久| 亚洲午夜精品久久久| 国内精品久久久久影院一蜜桃| 成人中文字幕+乱码+中文字幕| 国产精品伊人久久| 成人在线视频首页| 欧美日韩精品久久| 免费日本一区二区三区视频| 亚洲欧美福利一区二区| 欧美精品久久久久久久自慰| 黄色综合网址| 欧美日韩精品三区| 欧美图片自拍偷拍| 美女少妇全过程你懂的久久| 中文字幕欧美国内| 精品亚洲永久免费| 久久精品一区| 92福利视频午夜1000合集在线观看 | 日韩一区二区三区精品| 精品嫩草影院久久| 欧洲美一区二区三区亚洲| 久久人体视频| 性色av一区二区三区| 波多野结衣视频免费观看| 国精产品一区一区三区mba视频| 国产激情一区二区三区在线观看| 三级av在线播放| 国产精品传媒在线| 国产乱子伦农村叉叉叉| 日韩护士脚交太爽了| 欧美videossexotv100| 3d动漫精品啪啪一区二区下载 | 日韩av黄色网址| 欧美成人xxxx| 亚洲风情亚aⅴ在线发布| jizz18女人高潮| 亚洲日本视频| 成人激情视频小说免费下载| 污视频网站免费观看| 亚洲欧洲av另类| 国产l精品国产亚洲区久久| 精品国产第一国产综合精品| 亚洲欧美在线播放| 天天干中文字幕| 奇米四色…亚洲| 精品欧美日韩在线| 亚洲羞羞网站| 欧美美女网站色| 在哪里可以看毛片| 99视频精品| 成人情视频高清免费观看电影| av午夜在线| 狠狠躁天天躁日日躁欧美| 中文字幕欧美视频| 久久美女视频| 国产精品91久久久久久| 色婷婷中文字幕| 亚洲综合在线免费观看| 最新av免费在线观看| 精品72久久久久中文字幕| 午夜精品在线视频| 懂色av一区二区三区四区| 综合久久久久久| 制服丝袜综合网| 欧美伦理影院| 国产成人一区二区三区小说| 日本美女一级视频| 亚洲国产一区在线观看| wwwww在线观看| 欧美成人有码| 亚洲一区二区三区成人在线视频精品 | 亚洲黄色中文字幕| 欧美精品一区二区高清在线观看 | 自由日本语亚洲人高潮| 91系列在线观看| 久久精品视频免费看| 欧美图区在线视频| 欧美日韩中文字幕视频| 日产国产欧美视频一区精品| 欧美视频1区| 国产v综合v| 最近2019年手机中文字幕| 国产精品第6页| 中文字幕第一区| 粉色视频免费看| 99精品视频在线观看免费播放| 国产精品自产拍在线观看| 在线观看av黄网站永久| 欧美日韩不卡一区二区| 蜜桃av.com| 国产毛片一区二区| www.av蜜桃| 网红女主播少妇精品视频| 欧美在线一区二区三区四| 久热av在线| 欧美日韩免费高清一区色橹橹 | 韩国福利在线| 欧美日韩久久久| 九九精品视频免费| 福利一区二区在线观看| 亚洲熟妇国产熟妇肥婆| 久久99国产精品视频| 国产精品三级在线| 成人影院在线看| 亚洲国模精品一区| 中文字幕手机在线视频| 亚洲欧洲日韩av| zjzjzjzjzj亚洲女人| 国产精品日本| 一区二区在线观| 国产精品色呦| 国产精品日韩在线一区| 日本色护士高潮视频在线观看| 亚洲精品国偷自产在线99热| 波多野结衣在线观看一区| 国产精品国产a| 国产污在线观看| 免费精品视频在线| 日韩专区第三页| 精品日韩在线| 99在线热播| 国产成人精品一区二区三区在线| 久久综合亚洲社区| 欧美色图另类| 日韩免费视频一区| 欧美激情一区二区三区免费观看 | 怡红院成永久免费人全部视频| 亚洲激情第一区| 无码人妻精品一区二区中文| 国产成人鲁色资源国产91色综| 99视频免费播放| 精品91视频| 中文字幕欧美日韩一区二区| 欧美一级一片| 亚洲永久免费观看| 欧美xxxx做受欧美护士| 久久久久久国产三级电影| 99中文字幕一区| 亚洲精品大尺度| 国产亲伦免费视频播放| 在线看一区二区| 日韩av片在线播放| 一区二区三区四区国产精品| 韩国三级hd中文字幕| 99久久精品国产观看| a级大片免费看| 麻豆久久久久久久| 日韩a在线播放| 9久re热视频在线精品| 黄黄视频在线观看| 日韩久久综合| 日韩区国产区| 久久av导航| 精品一区二区三区日本| 日韩一区二区三区在线看| 国产日韩在线看| 午夜av成人| 国产91在线播放九色快色| av今日在线| 久久久久久久一区二区| 中文在线观看免费| 久久成人精品视频| 日本亚洲精品| 中文日韩电影网站| a中文在线播放| 亚洲网站在线观看| 国产视频网站在线| 亚洲图片欧美午夜| 国产精品一级伦理| 一区二区欧美在线| 大地资源中文在线观看免费版| 国产视频综合在线| 男同在线观看| 国产一区二区动漫| eeuss影院在线播放| 中文字幕日韩欧美在线 | 老牛国内精品亚洲成av人片| 国产chinese精品一区二区| 77成人影视| 国产精品久久久久久久免费大片| 亚洲精品午夜| 国产一区二区精品在线| 欧美日韩国产片| 国产成人综合亚洲| 成人黄色动漫| 欧美国产日韩精品| 欧美一卡二卡| 欧美精品www| caoporn-草棚在线视频最| 欧美激情亚洲一区| √8天堂资源地址中文在线| 久久久人成影片一区二区三区| 色av手机在线| 午夜精品久久久久久久99黑人| 黄色在线看片| 88国产精品欧美一区二区三区| 国产黄大片在线观看| 91精品国产91| 免费电影日韩网站| 国产精品老牛影院在线观看| 成人做爰免费视频免费看| 国产精品九九久久久久久久| 国产69精品久久| 91久久在线视频| 中文字幕日韩在线| 久久国产精品久久| 成人一级毛片| 久久最新免费视频| 亚洲成色精品| 欧美爱爱视频免费看| 久久深夜福利| 日本高清久久久| 成人免费的视频| 亚洲码无人客一区二区三区| 国产精品久久久久毛片软件| 欧美黑人猛猛猛| 精品国产1区2区| 亚洲天堂国产精品| 精品国产亚洲一区二区三区在线观看| 四虎免费在线观看| 中文字幕精品一区二区精品| av免费网站在线| 日本亚洲精品在线观看| 日韩午夜电影免费看| 国产精品久久久久久久久久久久冷| 伊人精品一区| 欧美一级特黄aaaaaa在线看片| 99精品免费网| 网站在线你懂的| 91网上在线视频| 亚洲精品卡一卡二| 激情久久av一区av二区av三区| 黄色大全在线观看| www.欧美.com| 伊人网在线视频观看| 亚洲日韩欧美一区二区在线| 天天操天天干视频| 欧美美女视频在线观看| 深夜福利免费在线观看| 久久国产精品久久久| 久久青青视频| 国产精品久久精品国产| 成人中文在线| 国产精品亚洲αv天堂无码| 国产乱码精品1区2区3区| 人妻少妇无码精品视频区| 亚洲自拍欧美精品| 国产又粗又猛又爽又黄的| 亚洲精品小视频| 日本理论片午伦夜理片在线观看| 国产精品久久久久久久av电影| 精品少妇3p| 日本大片免费看| 精品一区二区在线免费观看| 精品无码一区二区三区| 亚洲国产精品一区二区www| 97人妻精品一区二区三区软件 | 欧美精品videosex性欧美| 欧美成人毛片| 日本一区二区三区视频在线播放| 伊人久久久大香线蕉综合直播 | 99久久99久久久精品齐齐| 国产极品国产极品| 欧美日韩免费高清一区色橹橹 | 成人h动漫精品一区二区器材| 亚洲永久一区二区三区在线| 美女网站久久| 成人无码www在线看免费| 亚洲在线免费播放| 亚洲国产精品久久人人爱潘金莲 | 极品美女销魂一区二区三区 | 亚洲第一福利视频在线| www.com在线观看| 欧美成人精品在线观看| 亚洲伊人精品酒店| 中文字幕一区二区三区四区五区| 喷白浆一区二区| 欧美性受xxxx黑人| 欧美少妇bbb| gogogo高清在线观看免费完整版| 国产精品精品国产| 国产中文精品久高清在线不| 国产精品宾馆在线精品酒店| 不卡欧美aaaaa| 在线能看的av| 精品一区电影国产| 88xx成人免费观看视频库 | 91九色单男在线观看| 久久久久久久久丰满| 国产精品久久久久久久99| 亚洲蜜臀av乱码久久精品蜜桃| a级片免费视频| 久久久久免费精品国产| 日韩三区视频| 成年网站在线播放| 亚洲日本电影在线| 国产综合在线播放| 热久久免费国产视频| 欧美性感美女一区二区| 中文字幕一区二区在线观看视频 | 日韩中文字幕亚洲| 日韩第一区第二区| 国产极品尤物在线| 国产女人18水真多18精品一级做| 一本久道久久综合无码中文| 欧美日本黄视频| 日韩mv欧美mv国产网站| 美女网站免费观看视频| 亚洲视频精选在线| 头脑特工队2在线播放| 国产成人精品久久亚洲高清不卡| 久久美女视频| 久久久久亚洲无码| 在线精品视频一区二区三四| www.久久ai| 另类视频在线观看+1080p| 久久精品久久精品| 精品肉丝脚一区二区三区| 亚洲人成伊人成综合网久久久 | 7777精品伊人久久久大香线蕉超级流畅 | 精品中文字幕av| 国产精品免费人成网站| 亚洲国产欧美另类| 国产精品久久久久久久app| 午夜久久黄色| 懂色av蜜桃av| 亚洲第一二三四五区| 欧美电影在线观看网站| 精品中文字幕av| 亚洲自拍偷拍九九九| 天天综合视频在线观看| 久久av二区|