国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Nacos+Spring Cloud Gateway動態路由配置實現步驟

瀏覽:3日期:2023-06-26 13:39:46
目錄前言一、Nacos環境準備1、啟動Nacos配置中心并創建路由配置2、連接Nacos配置中心二、項目構建1、項目結構2、編寫測試代碼三、測試動態網關配置1、啟動服務,觀察注冊中心2、訪問網關,觀察服務日志四、總結前言

Nacos最近項目一直在使用,其簡單靈活,支持更細粒度的命令空間,分組等為麻煩復雜的環境切換提供了方便;同時也很好支持動態路由的配置,只需要簡單的幾步即可。在國產的注冊中心、配置中心中比較突出,容易上手,本文通過gateway、nacos-consumer、nacos-provider三個簡單模塊來展示:Nacos下動態路由配置。

 博文中源碼已上傳至github(https://github.com/Jian0110/learning-cloudalibaba),歡迎小伙伴們star

一、Nacos環境準備1、啟動Nacos配置中心并創建路由配置

具體的Nacos怎么配置就不介紹了,可以參考阿里巴巴的官方介紹,這里通過windows直接本地啟動開啟單機模式,登錄Nacos Console,創建dev的namespace,在dev下的默認分組下創建gateway-router的dataId

Nacos+Spring Cloud Gateway動態路由配置實現步驟

gateway-router的主要初始化配置如下:關于gateway的組成(id,order、predicates斷言,uri)這里就不詳細說明的了,可以自行百度下

Nacos+Spring Cloud Gateway動態路由配置實現步驟

[{ 'id': 'consumer-router', 'order': 0, 'predicates': [{'args': { 'pattern': '/consume/**'},'name': 'Path' }], 'uri': 'lb://nacos-consumer'},{ 'id': 'provider-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/provide/**'},'name': 'Path' }], 'uri': 'lb://nacos-provider'}]2、連接Nacos配置中心

通常在項目中配置“配置中心”往往都是在bootstrap.propertis(yaml)中配置,這樣才能保證項目中路由配置從Nacos Config中讀取。

# nacos配置中心配置建議在bootstrap.properties中配置spring.cloud.nacos.config.server-addr=127.0.0.1:8848#spring.cloud.nacos.config.file-extension=properties# 配置中心的命名空間:dev 的命名空間(環境)spring.cloud.nacos.config.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea

Application啟動類中增加注解@EnableDiscoveryClient,才能保證連接到Nacos Config

@SpringBootApplication@EnableDiscoveryClientpublic class GatewayApplication{ public static void main( String[] args ) {SpringApplication.run(GatewayApplication.class, args); }}二、項目構建1、項目結構

創建簡單的springboot多模塊結構,推薦使用idea創建

1)Nacos父模塊:

<groupId>com.springcloud</groupId><artifactId>nacos</artifactId><version>0.0.1-SNAPSHOT</version><name>nacos</name><description>Nacos Demo</description>

首先pom文件引入Spring Cloud Alibaba Nacos組件:注冊中心nacos-discovery與配置中心nacos-config

<!--nacos 客戶端 注冊中心--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${alibaba-nacos.version}</version> </dependency> <!--nacos 客戶端 配置中心--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>${alibaba-nacos.version}</version> </dependency>

其次再引入Spring Cloud相關組件依賴

<dependencyManagement><dependencies> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope> </dependency></dependencies></dependencyManagement>

其它組件依賴引入(修正:如果引入了nacos-api相關的JSON依賴,那么fastjson就不需要再引入了,否則可能沖突):

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version></dependency><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>

注意,這里有個坑,spring cloud gateway使用的web框架為webflux,和springMVC不兼容。所以不要引入(修正:只有gateway服務不用引入springMVC,其他需要引入)

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

2)三個子模塊:gateway、nacos-consumer、nacos-provider

<modules><module>nacos-provider</module><module>nacos-consumer</module><module>gateway</module></modules>

結構截圖如下所示:

Nacos+Spring Cloud Gateway動態路由配置實現步驟

3)三個服務的端口分別為:

nacos-consume:6001

nacos-provider:6002

gateway:6003

4)服務架構如下:

Nacos+Spring Cloud Gateway動態路由配置實現步驟

2、編寫測試代碼

(1)在gateway模塊中主要實現以下功能:

第一,從Nacos配置中心中加載動態路由的相關配置,就需要讀取Nacos的命名空間namespace,通過dataId獲取配置

/** * 路由類配置 */@Configurationpublic class GatewayConfig { public static final long DEFAULT_TIMEOUT = 30000; public static String NACOS_SERVER_ADDR; public static String NACOS_NAMESPACE; public static String NACOS_ROUTE_DATA_ID; public static String NACOS_ROUTE_GROUP; @Value('${spring.cloud.nacos.discovery.server-addr}') public void setNacosServerAddr(String nacosServerAddr){NACOS_SERVER_ADDR = nacosServerAddr; } @Value('${spring.cloud.nacos.discovery.namespace}') public void setNacosNamespace(String nacosNamespace){NACOS_NAMESPACE = nacosNamespace; } @Value('${nacos.gateway.route.config.data-id}') public void setNacosRouteDataId(String nacosRouteDataId){NACOS_ROUTE_DATA_ID = nacosRouteDataId; } @Value('${nacos.gateway.route.config.group}') public void setNacosRouteGroup(String nacosRouteGroup){NACOS_ROUTE_GROUP = nacosRouteGroup; }}

properties配置關于Nacos下讀取gateway-router的配置:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.cloud.nacos.discovery.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8eanacos.gateway.route.config.data-id=gateway-routernacos.gateway.route.config.group=DEFAULT_GROUP

第二,初始化路由,監聽動態路由配置的數據源變化(2020.12.28解決刪除路由不生效問題);

/** * * 通過nacos下發動態路由配置,監聽Nacos中gateway-route配置 * */@Component@Slf4j@DependsOn({'gatewayConfig'}) // 依賴于gatewayConfig beanpublic class DynamicRouteServiceImplByNacos { @Autowired private DynamicRouteServiceImpl dynamicRouteService; private ConfigService configService; @PostConstruct public void init() {log.info('gateway route init...');try{ configService = initConfigService(); if(configService == null){log.warn('initConfigService fail');return; } String configInfo = configService.getConfig(GatewayConfig.NACOS_ROUTE_DATA_ID, GatewayConfig.NACOS_ROUTE_GROUP, GatewayConfig.DEFAULT_TIMEOUT); log.info('獲取網關當前配置:rn{}',configInfo); List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class); for(RouteDefinition definition : definitionList){log.info('update route : {}',definition.toString());dynamicRouteService.add(definition); }} catch (Exception e) { log.error('初始化網關路由時發生錯誤',e);}dynamicRouteByNacosListener(GatewayConfig.NACOS_ROUTE_DATA_ID,GatewayConfig.NACOS_ROUTE_GROUP); } /** * 監聽Nacos下發的動態路由配置 * @param dataId * @param group */ public void dynamicRouteByNacosListener (String dataId, String group){try { configService.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) { log.info('進行網關更新:nr{}',configInfo); List<RouteDefinition> definitionList = JSON.parseArray(configInfo, RouteDefinition.class); log.info('update route : {}',definitionList.toString()); dynamicRouteService.updateList(definitionList);}@Overridepublic Executor getExecutor() { log.info('getExecutornr'); return null;} });} catch (NacosException e) { log.error('從nacos接收動態路由配置出錯!!!',e);} } /** * 初始化網關路由 nacos config * @return */ private ConfigService initConfigService(){try{ Properties properties = new Properties(); properties.setProperty('serverAddr',GatewayConfig.NACOS_SERVER_ADDR); properties.setProperty('namespace',GatewayConfig.NACOS_NAMESPACE); return configService= NacosFactory.createConfigService(properties);} catch (Exception e) { log.error('初始化網關路由時發生錯誤',e); return null;} }}

第三,刷新最新的動態路由變化,實現動態增刪改路由(2020.12.28解決刪除路由不生效問題)

/** * 動態更新路由網關service * 1)實現一個Spring提供的事件推送接口ApplicationEventPublisherAware * 2)提供動態路由的基礎方法,可通過獲取bean操作該類的方法。該類提供新增路由、更新路由、刪除路由,然后實現發布的功能。 */@Slf4j@Servicepublic class DynamicRouteServiceImpl implements ApplicationEventPublisherAware { @Autowired private RouteDefinitionWriter routeDefinitionWriter; @Autowired private RouteDefinitionLocator routeDefinitionLocator; /** * 發布事件 */ @Autowired private ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher; } /** * 刪除路由 * @param id * @return */ public String delete(String id) {try { log.info('gateway delete route id {}',id); this.routeDefinitionWriter.delete(Mono.just(id)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return 'delete success';} catch (Exception e) { return 'delete fail';} } /** * 更新路由 * @param definitions * @return */ public String updateList(List<RouteDefinition> definitions) {log.info('gateway update route {}',definitions);// 刪除緩存routerDefinitionList<RouteDefinition> routeDefinitionsExits = routeDefinitionLocator.getRouteDefinitions().buffer().blockFirst();if (!CollectionUtils.isEmpty(routeDefinitionsExits)) { routeDefinitionsExits.forEach(routeDefinition -> {log.info('delete routeDefinition:{}', routeDefinition);delete(routeDefinition.getId()); });}definitions.forEach(definition -> { updateById(definition);});return 'success'; } /** * 更新路由 * @param definition * @return */ public String updateById(RouteDefinition definition) {try { log.info('gateway update route {}',definition); this.routeDefinitionWriter.delete(Mono.just(definition.getId()));} catch (Exception e) { return 'update fail,not find route routeId: '+definition.getId();}try { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.publisher.publishEvent(new RefreshRoutesEvent(this)); return 'success';} catch (Exception e) { return 'update route fail';} } /** * 增加路由 * @param definition * @return */ public String add(RouteDefinition definition) {log.info('gateway add route {}',definition);routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return 'success'; }}三、測試動態網關配置1、啟動服務,觀察注冊中心

分別啟動gateway、nacos-consumer、nacos-provider三個服務,觀察是否已經在Nacos上正確注冊

Nacos+Spring Cloud Gateway動態路由配置實現步驟

注意:需要指定注冊中心的namespace為dev的空間,即spring.cloud.nacos.discovery.namespace=08ecd1e5-c042-410a-84d5-b0a8fbeed8ea

2、訪問網關,觀察服務日志

(1)查看gateway服務的初始化啟動日志:會發現可以正常從Nacos獲取配置gateway-router網關配置文件內容,并進行正確路由加載...

2020-05-10 14:33:44.557 INFO 1272 --- [ main] c.g.r.DynamicRouteServiceImplByNacos : gateway route init...2020-05-10 14:33:44.578 INFO 1272 --- [ main] c.g.r.DynamicRouteServiceImplByNacos : 獲取網關當前配置:[{ 'id': 'consumer-router', 'order': 0, 'predicates': [{'args': { 'pattern': '/consume/**'},'name': 'Path' }], 'uri': 'lb://nacos-consumer'},{ 'id': 'provider-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/provide/**'},'name': 'Path' }], 'uri': 'lb://nacos-provider'}]2020-05-10 14:33:44.691 INFO 1272 --- [ main] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’consumer-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}2020-05-10 14:33:44.691 INFO 1272 --- [ main] c.g.service.DynamicRouteServiceImpl : gateway add route RouteDefinition{id=’consumer-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}2020-05-10 14:33:45.192 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]2020-05-10 14:33:45.192 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]2020-05-10 14:33:45.192 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]2020-05-10 14:33:45.193 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]2020-05-10 14:33:45.193 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]2020-05-10 14:33:45.193 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]2020-05-10 14:33:45.194 INFO 1272 --- [ main] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]2020-05-10 14:33:45.335 INFO 1272 --- [ main] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’provider-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}2020-05-10 14:33:45.335 INFO 1272 --- [ main] c.g.service.DynamicRouteServiceImpl : gateway add route RouteDefinition{id=’provider-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}2020-05-10 14:33:45.336 INFO 1272 --- [ main] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’github-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/github}}], filters=[], uri=https://github.com, order=3, metadata={}}2020-05-10 14:33:45.336 INFO 1272 --- [ main] c.g.service.DynamicRouteServiceImpl : gateway add route RouteDefinition{id=’github-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/github}}], filters=[], uri=https://github.com, order=3, metadata={}}

但這只能說明是初始化靜態路由,下面我們改變gateway-router網關配置內容,追加github-router路由

[{ 'id': 'consumer-router', 'order': 0, 'predicates': [{'args': { 'pattern': '/consume/**'},'name': 'Path' }], 'uri': 'lb://nacos-consumer'},{ 'id': 'provider-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/provide/**'},'name': 'Path' }], 'uri': 'lb://nacos-provider'},{ 'id': 'github-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/github/**'},'name': 'Path' }], 'uri': 'https://github.com'}]

之后點擊發布更新路由配置

Nacos+Spring Cloud Gateway動態路由配置實現步驟

觀察gateway服務日志,有沒有監聽,并且進行正確的路由更新:如下日志所示,最新路由配置立馬被打印,并且進行正確路由更新

2020-05-10 14:42:27.576 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos : 進行網關更新:[{ 'id': 'consumer-router', 'order': 0, 'predicates': [{'args': { 'pattern': '/consume/**'},'name': 'Path' }], 'uri': 'lb://nacos-consumer'},{ 'id': 'provider-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/provide/**'},'name': 'Path' }], 'uri': 'lb://nacos-provider'},{ 'id': 'github-router', 'order': 2, 'predicates': [{'args': { 'pattern': '/github/**'},'name': 'Path' }], 'uri': 'https://github.com'}]2020-05-10 14:42:27.576 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’consumer-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}2020-05-10 14:42:27.576 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl : gateway update route RouteDefinition{id=’consumer-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/consume/**}}], filters=[], uri=lb://nacos-consumer, order=0, metadata={}}2020-05-10 14:42:27.578 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’provider-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}2020-05-10 14:42:27.578 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl : gateway update route RouteDefinition{id=’provider-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/provide/**}}], filters=[], uri=lb://nacos-provider, order=2, metadata={}}2020-05-10 14:42:27.580 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.r.DynamicRouteServiceImplByNacos : update route : RouteDefinition{id=’github-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/github/**}}], filters=[], uri=https://github.com, order=2, metadata={}}2020-05-10 14:42:27.580 INFO 1272 --- [d5-b0a8fbeed8ea] c.g.service.DynamicRouteServiceImpl : gateway update route RouteDefinition{id=’github-router’, predicates=[PredicateDefinition{name=’Path’, args={pattern=/github/**}}], filters=[], uri=https://github.com, order=2, metadata={}}

其實,還有辦法可以知道我們的gateway服務有沒有監聽Nacos的gateway-router配置,那就是在Nacos Console--->監聽查詢----->選擇配置---->輸入配置文件的namespace與Group:可以發現我本地IP地址127.0.0.1對配置文件gateway-router進行了監聽

Nacos+Spring Cloud Gateway動態路由配置實現步驟

(2)訪問gateway網關服務:http://localhost:6003/consume/sayHello/nacos

Nacos+Spring Cloud Gateway動態路由配置實現步驟

查看consumer服務日志:

2020-05-10 14:55:07.257 INFO 6552 --- [nio-6001-exec-2] c.n.c.controller.ConsumeController : I’m calling nacos-consumer service by dynamic gateway...

發現跳轉至consumer服務,并且訪問了consumer服務的CosnumerController

(3)訪問gateway網關服務:http://localhost:6003/provider/sayHello/nacos

Nacos+Spring Cloud Gateway動態路由配置實現步驟

查看provider服務日志:

2020-05-10 14:56:56.144 INFO 10024 --- [nio-6002-exec-1] c.n.p.controller.ProviderController : I’m calling nacos-provider service by dynamic gateway...

發現跳轉至consumer服務,并且訪問了provider服務的ProviderController

(4)訪問訪問gateway網關服務:http://localhost:6003/github,正確跳轉至github頁面

Nacos+Spring Cloud Gateway動態路由配置實現步驟

四、總結

1)Spring Cloud Gateway作用不光只是簡單的跳轉重定向,還可以實現用戶的驗證登錄,解決跨域,日志攔截,權限控制,限流,熔斷,負載均衡,黑名單和白名單機制等。是微服務架構不二的選擇;

2)Nacos的配置中心支持動態獲取配置文件,可以將一些全局的經常變更的配置文件放在Nacos下,需要到微服務自行獲取。

2020.12.28解決刪除路由不生效問題,主要是利用RouteDefinitionLocator先讀取變化之前的RouteDefinition,之后刪除重新再更新,或者可以實現routeDefinitionWriter、RouteDefinitionLocator重寫如下方法:

Mono<Void> save(Mono<RouteDefinition> route);Mono<Void> delete(Mono<String> routeId);Flux<RouteDefinition> getRouteDefinitions();

到此這篇關于Nacos+Spring Cloud Gateway動態路由配置實現步驟的文章就介紹到這了,更多相關Spring Cloud Gateway動態路由內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 亚洲国产精品自产拍在线播放 | 一级待一黄aaa大片在线还看 | 在线视频一二三区 | 色偷偷资源网 | 欧美一级特黄一片免费 | 欧美精品三区 | 日本波多野结衣在线 | 亚洲成人黄色网址 | 丝袜美腿精品一区二区三 | 日韩大片高清播放器大全 | 国产精品视频久久久 | www.乱 | 国产一级片网址 | 欧美日韩一区二区三区高清不卡 | 亚洲精品91香蕉综合区 | 欧美一级毛片aaa片 欧美一级毛片不卡免费观看 | 国产中文字幕在线观看 | 台湾三级毛片 | 神马我我不卡伦影视 | 国产在线欧美精品 | 一色屋成人免费精品网站 | 亚洲一区在线播放 | 日韩一区二区三区免费视频 | 欧美一级在线播放 | 成人午夜在线播放 | 国产二区精品 | 亚洲国产精品看片在线观看 | 国产午夜永久福利视频在线观看 | 亚洲精品国产专区一区 | 不卡一级aaa全黄毛片 | 日本人的色道免费网站 | 中文字幕成人免费高清在线 | 亚洲天堂2016 | 操操综合网 | 性欧美一级毛片欧美片 | 国产美女精品一区二区三区 | 亚洲免费在线 | 欧美性猛交xxxxx按摩国内 | 亚洲在线影院 | 久草免费公开视频 | 精品国产一区二区在线观看 |