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

OpenFeign奪命連環九問?

開發 前端
OpenFeign的@FeignClient?可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態代理的方式產生實現類,實現類中做負載均衡并調用其他服務。

?大家好,我是不才陳某~

前面介紹了Spring Cloud 中的靈魂擺渡者Nacos,和它的前輩們相比不僅僅功能強大,而且部署非常簡單。

今天介紹一款服務調用的組件:OpenFeign?,同樣是一款超越先輩(Ribbon、Feign)的狠角色。

文章目錄如下:

圖片

這篇文章之前陳某發過,全網閱讀 10W+ ,時隔一年發出來讓大家復習復習,部分讀者看過可以直接跳過

1、Feign是什么?

Feign也是一個狠角色,Feign旨在使得Java Http客戶端變得更容易。

Feign集成了Ribbon、RestTemplate實現了負載均衡的執行Http調用,只不過對原有的方式(Ribbon+RestTemplate)進行了封裝,開發者不必手動使用RestTemplate調服務,而是定義一個接口,在這個接口中標注一個注解即可完成服務調用,這樣更加符合面向接口編程的宗旨,簡化了開發。

圖片

但遺憾的是Feign現在停止迭代了,當然現在也是有不少企業在用。

有想要學習Feign的讀者可以上spring Cloud官網學習,陳某這里也不再詳細介紹了,不是今天的重點。

2、openFeign是什么?

前面介紹過停止迭代的Feign,簡單點來說:OpenFeign是springcloud在Feign的基礎上支持了SpringMVC的注解,如@RequestMapping?等等。OpenFeign的@FeignClient?可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態代理的方式產生實現類,實現類中做負載均衡并調用其他服務。

官網地址:https://docs.spring.io/spring-cloud-openfeign/docs/2.2.10.BUILD-SNAPSHOT/reference/html

3、Feign和openFeign有什么區別?

Feign

openFiegn

Feign是SpringCloud組件中一個輕量級RESTful的HTTP服務客戶端,Feign內置了Ribbon,用來做客戶端負載均衡,去調用服務注冊中心的服務。Feign的使用方式是:使用Feign的注解定義接口,調用這個接口,就可以調用服務注冊中心的服務

OpenFeign 是SpringCloud在Feign的基礎上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通過動態代理的方式產生實現類,實現類中做負載均衡并調用其他服務。

4、環境準備

本篇文章Spring Cloud版本、JDK環境、項目環境均和上一篇Nacos的環境相同:五十五張圖告訴你微服務的靈魂擺渡者Nacos究竟有多強?。

注冊中心就不再使用Eureka?了,直接使用Nacos作為注冊和配置中心,有不會的可以查看Nacos文章。

本篇文章搭建的項目結構如下圖:

圖片

注冊中心使用Nacos,創建個微服務,分別為服務提供者Produce,服務消費者Consumer。

5、創建服務提供者

既然是微服務之間的相互調用,那么一定會有服務提供者了,創建openFeign-provider9005,注冊進入Nacos中,配置如下:

server:
port: 9005
spring:
application:
## 指定服務名稱,在nacos中的名字
name: openFeign-provider
cloud:
nacos:
discovery:
# nacos的服務地址,nacos-server中IP地址:端口號
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯
include: '*'

注意:此處的spring.application.name指定的名稱將會在openFeign接口調用中使用。

項目源碼都會上傳,關于如何注冊進入Nacos,添加什么依賴源碼都會有,結合陳某上篇Nacos文章,這都不是難事!

6、創建服務消費者

新建一個模塊openFeign-consumer9006作為消費者服務,步驟如下。

1)添加依賴

除了Nacos的注冊中心的依賴,還要添加openFeign的依賴,如下:

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

2)添加注解@EnableFeignClients開啟openFeign功能

老套路了,在Spring boot 主啟動類上添加一個注解@EnableFeignClients,開啟openFeign功能,如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OpenFeignConsumer9006Application
{
public static void main(String[] args) {
SpringApplication.run(OpenFeignConsumer9006Application.class, args);
}
}

3)新建openFeign接口

新建一個openFeign接口,使用@FeignClient注解標注,如下:

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
}

注意:該注解@FeignClient?中的value屬性指定了服務提供者在nacos注冊中心的服務名。

4)新建一個Controller調試

新建一個controller用來調試接口,直接調用openFeign的接口,如下:

@RestController
@RequestMapping("/openfeign")
public class OpenFeignController {

}

好了,至此一個openFeign的微服務就搭建好了,并未實現具體的功能,下面一點點實現。

7、openFeign如何傳參?

開發中接口傳參的方式有很多,但是在openFeign中的傳參是有一定規則的,下面詳細介紹。

1)傳遞JSON數據

這個也是接口開發中常用的傳參規則,在Spring Boot 中通過@RequestBody標識入參。

provider接口中JSON傳參方法如下:

@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/order2")
public Order createOrder2(@RequestBody Order order){
return order;
}
}

consumer中openFeign接口中傳參代碼如下:

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 參數默認是@RequestBody標注的,這里的@RequestBody可以不填
* 方法名稱任意
*/
@PostMapping("/openfeign/provider/order2")
Order createOrder2(@RequestBody Order order);
}

注意:openFeign?默認的傳參方式就是JSON傳參(@RequestBody?),因此定義接口的時候可以不用@RequestBody注解標注,不過為了規范,一般都填上。

2)POJO表單傳參

這種傳參方式也是比較常用,參數使用POJO對象接收。

provider服務提供者代碼如下:

@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/order1")
public Order createOrder1(Order order){
return order;
}
}

consumer消費者openFeign代碼如下:

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 參數默認是@RequestBody標注的,如果通過POJO表單傳參的,使用@SpringQueryMap標注
*/
@PostMapping("/openfeign/provider/order1")
Order createOrder1(@SpringQueryMap Order order);
}

網上很多人疑惑POJO表單方式如何傳參,官方文檔明確給出了解決方案,如下:

openFeign提供了一個注解@SpringQueryMap完美解決POJO表單傳參。

3)URL中攜帶參數

此種方式針對restful方式中的GET請求,也是比較常用請求方式。

provider服務提供者代碼如下:

@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {

@GetMapping("/test/{id}")
public String test(@PathVariable("id")Integer id){
return "accept one msg id="+id;
}

consumer消費者openFeign接口如下:

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {

@GetMapping("/openfeign/provider/test/{id}")
String get(@PathVariable("id")Integer id);
}

使用注解@PathVariable接收url中的占位符,這種方式很好理解。

4)另類傳參

此種方式傳參不建議使用,但是也有很多開發在用。

provider服務提供者代碼如下:

@RestController
@RequestMapping("/openfeign/provider")
public class OpenFeignProviderController {
@PostMapping("/test2")
public String test2(String id,String name){
return MessageFormat.format("accept on msg id={0},name={1}",id,name);
}
}

consumer消費者openFeign接口傳參如下:

@FeignClient(value = "openFeign-provider")
public interface OpenFeignService {
/**
* 必須要@RequestParam注解標注,且value屬性必須填上參數名
* 方法參數名可以任意,但是@RequestParam注解中的value屬性必須和provider中的參數名相同
*/
@PostMapping("/openfeign/provider/test2")
String test(@RequestParam("id") String arg1,@RequestParam("name") String arg2);
}

5)總結

傳參的方式有很多,比如文件傳參.....陳某這里只是列舉了四種常見得傳參方式。

8、超時如何處理?

想要理解超時處理,先看一個例子:我將provider服務接口睡眠3秒鐘,接口如下:

@PostMapping("/test2")
public String test2(String id,String name) throws InterruptedException {
Thread.sleep(3000);
return MessageFormat.format("accept on msg id={0},name={1}",id,name);
}

此時,我們調用consumer的openFeign接口返回結果如下圖:

很明顯的看出程序異常了,返回了接口調用超時。what?why?...........

openFeign其實是有默認的超時時間的,默認分別是連接超時時間10秒?、讀超時時間60秒?,源碼在feign.Request.Options#Options()這個方法中,如下圖:

那么問題來了:為什么我只設置了睡眠3秒就報超時呢?

其實openFeign集成了Ribbon,Ribbon的默認超時連接時間、讀超時時間都是是1秒,源碼在org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer#execute()方法中,如下圖:

源碼大致意思:如果openFeign沒有設置對應得超時時間,那么將會采用Ribbon的默認超時時間。

理解了超時設置的原理,由之產生兩種方案也是很明了了,如下:

  • 設置openFeign的超時時間
  • 設置Ribbon的超時時間

1)設置Ribbon的超時時間(不推薦)

設置很簡單,在配置文件中添加如下設置:

ribbon:
# 值的是建立鏈接所用的時間,適用于網絡狀況正常的情況下, 兩端鏈接所用的時間
ReadTimeout: 5000
# 指的是建立鏈接后從服務器讀取可用資源所用的時間
ConectTimeout: 5000

2)設置openFeign的超時時間(推薦)

openFeign設置超時時間非常簡單,只需要在配置文件中配置,如下:

feign:
client:
config:
## default 設置的全局超時時間,指定服務名稱可以設置單個服務的超時時間
default:
connectTimeout: 5000
readTimeout: 5000

default設置的是全局超時時間,對所有的openFeign接口服務都生效

但是正常的業務邏輯中可能涉及到多個openFeign接口的調用,如下圖:

上圖中的偽代碼如下:

public T invoke(){
//1. 調用serviceA
serviceA();

//2. 調用serviceA
serviceB();

//3. 調用serviceA
serviceC();
}

那么上面配置的全局超時時間能不能通過呢?很顯然是serviceA、serviceB?能夠成功調用,但是serviceC并不能成功執行,肯定報超時。

此時我們可以給serviceC這個服務單獨配置一個超時時間,配置如下:

feign:
client:
config:
## default 設置的全局超時時間,指定服務名稱可以設置單個服務的超時時間
default:
connectTimeout: 5000
readTimeout: 5000
## 為serviceC這個服務單獨配置超時時間
serviceC:
connectTimeout: 30000
readTimeout: 30000

注意:單個配置的超時時間將會覆蓋全局配置。

9、如何開啟日志增強?

openFeign雖然提供了日志增強功能,但是默認是不顯示任何日志的,不過開發者在調試階段可以自己配置日志的級別。

openFeign的日志級別如下:

  • NONE:默認的,不顯示任何日志;
  • BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間;
  • HEADERS:除了BASIC中定義的信息之外,還有請求和響應的頭信息;
  • FULL:除了HEADERS中定義的信息之外,還有請求和響應的正文及元數據。

配置起來也很簡單,步驟如下:

1)配置類中配置日志級別

需要自定義一個配置類,在其中設置日志級別,如下:

注意:這里的logger是feign包里的。

2)yaml文件中設置接口日志級別

只需要在配置文件中調整指定包或者openFeign的接口日志級別,如下:

logging:
level:
cn.myjszl.service: debug

這里的cn.myjszl.service是openFeign接口所在的包名,當然你也可以配置一個特定的openFeign接口。

3)演示效果

上述步驟將日志設置成了FULL,此時發出請求,日志效果如下圖:

日志中詳細的打印出了請求頭、請求體的內容。

10、如何替換默認的httpclient?

Feign在默認情況下使用的是JDK原生的URLConnection發送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection。

在生產環境中,通常不使用默認的http client,通常有如下兩種選擇:

  • 使用ApacheHttpClient
  • 使用OkHttp

至于哪個更好,其實各有千秋,我比較傾向于ApacheHttpClient,畢竟老牌子了,穩定性不在話下。

那么如何替換掉呢?其實很簡單,下面演示使用ApacheHttpClient替換。

1)添加ApacheHttpClient依賴

在openFeign接口服務的pom文件添加如下依賴:

<!--     使用Apache HttpClient替換Feign原生httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>

<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

為什么要添加上面的依賴呢?從源碼中不難看出,請看org.springframework.cloud.openfeign.FeignAutoConfiguration.HttpClientFeignConfiguration這個類,代碼如下:

圖片

上述紅色框中的生成條件,其中的@ConditionalOnClass(ApacheHttpClient.class)?,必須要有ApacheHttpClient?這個類才會生效,并且feign.httpclient.enabled?這個配置要設置為true。

2)配置文件中開啟

在配置文件中要配置開啟,代碼如下:

feign:
client:
httpclient:
# 開啟 Http Client
enabled: true

3)如何驗證已經替換成功?

其實很簡單,在feign.SynchronousMethodHandler#executeAndDecode()這個方法中可以清楚的看出調用哪個client,如下圖:

圖片

上圖中可以看到最終調用的是ApacheHttpClient。

4)總結

上述步驟僅僅演示一種替換方案,剩下的一種不再演示了,原理相同。

11、如何通訊優化?

在講如何優化之前先來看一下GZIP 壓縮算法,概念如下:

gzip是一種數據格式,采用用deflate算法壓縮數據;gzip是一種流行的數據壓縮算法,應用十分廣泛,尤其是在Linux平臺。

當GZIP壓縮到一個純文本數據時,效果是非常明顯的,大約可以減少70%以上的數據大小。

網絡數據經過壓縮后實際上降低了網絡傳輸的字節數,最明顯的好處就是可以加快網頁加載的速度。網頁加載速度加快的好處不言而喻,除了節省流量,改善用戶的瀏覽體驗外,另一個潛在的好處是GZIP與搜索引擎的抓取工具有著更好的關系。例如 Google就可以通過直接讀取GZIP文件來比普通手工抓取更快地檢索網頁。

GZIP壓縮傳輸的原理如下圖:

按照上圖拆解出的步驟如下:

  • 客戶端向服務器請求頭中帶有:Accept-Encoding:gzip,deflate 字段,向服務器表示,客戶端支持的壓縮格式(gzip或者deflate),如果不發送該消息頭,服務器是不會壓縮的。
  • 服務端在收到請求之后,如果發現請求頭中含有Accept-Encoding字段,并且支持該類型的壓縮,就對響應報文壓縮之后返回給客戶端,并且攜帶Content-Encoding:gzip消息頭,表示響應報文是根據該格式壓縮過的。
  • 客戶端接收到響應之后,先判斷是否有Content-Encoding消息頭,如果有,按該格式解壓報文。否則按正常報文處理。

openFeign支持請求/響應開啟GZIP壓縮,整體的流程如下圖:

上圖中涉及到GZIP傳輸的只有兩塊,分別是Application client -> Application Service、 Application Service->Application client。

注意:openFeign支持的GZIP僅僅是在openFeign接口的請求和響應,即是openFeign消費者調用服務提供者的接口。

openFeign開啟GZIP步驟也是很簡單,只需要在配置文件中開啟如下配置:

feign:
## 開啟壓縮
compression:
request:
enabled: true
## 開啟壓縮的閾值,單位字節,默認2048,即是2k,這里為了演示效果設置成10字節
min-request-size: 10
mime-types: text/xml,application/xml,application/json
response:
enabled: true

上述配置完成之后,發出請求,可以清楚看到請求頭中已經攜帶了GZIP壓縮,如下圖:

12、如何熔斷降級

常見的熔斷降級框架有Hystrix、Sentinel?,openFeign默認支持的就是Hystrix,這個在官方文檔上就有體現,畢竟是一奶同胞嘛,哈哈...........

但是阿里的Sentinel無論是功能特性、簡單易上手等各方面都完全秒殺Hystrix,因此此章節就使用openFeign+Sentinel進行整合實現服務降級。

說明:此處并不著重介紹Sentinel,陳某打算放在下一篇文章詳細介紹Sentinel的強大之處。

1)添加Sentinel依賴

在openFeign-consumer9006消費者的pom文件添加sentinel依賴(由于使用了聚合模塊,不指定版本號),如下:

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2)配置文件中開啟sentinel熔斷降級

要想openFeign使用sentinel的降級功能,還需要在配置文件中開啟,添加如下配置:

feign:
sentinel:
enabled: true

3)添加降級回調類

這個類一定要和openFeign接口實現同一個類,如下圖:

OpenFeignFallbackService?這個是降級回調的類,一旦OpenFeignService中對應得接口出現了異常則會調用這個類中對應得方法進行降級處理。

4)添加fallback屬性

在@FeignClient?中添加fallback屬性,屬性值是降級回調的類,如下:

@FeignClient(value = "openFeign-provider",fallback = OpenFeignFallbackService.class)
public interface OpenFeignService {}

5)演示

經過如上4個步驟,openFeign的熔斷降級已經設置完成了,此時演示下效果。

通過postman調用http://localhost:9006/openfeign/order3這個接口,正常邏輯返回如下圖:

現在手動造個異常,在服務提供的接口中拋出異常,如下圖:

圖片

此時重新調用http://localhost:9006/openfeign/order3,返回如下圖:

圖片

哦豁,可以很清楚的看到服務已經成功降級調用,哦了,功能完成。

注意:實際開發中返回結果應該根據架構統一定制,陳某這里只是為了演示方便,不要借鑒,哈哈。。。

13、總結

本篇文章主要面對初學者,深入的源碼以及熔斷降級放在后面詳細介紹,文中若有表述不清,錯誤的地方歡迎指正!

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2024-03-13 13:56:11

openFeignHttp服務調用

2021-10-26 15:56:57

kafka數據平臺,

2023-03-08 09:03:55

2023-04-26 09:16:17

2021-11-08 14:10:37

分布式Spring鏈路

2021-06-04 14:38:12

網絡通信TCP揮手

2022-03-25 09:01:36

Spring循環依賴面試

2021-01-19 05:24:36

ThreadLocal線程編程

2019-05-29 15:17:43

TCPHTTPSSL

2022-05-14 21:19:22

ThreadLocaJDKsynchroniz

2021-07-21 09:15:27

MySQL數據庫面試

2025-08-26 02:22:00

2021-04-26 17:58:41

MySQLIO

2022-04-01 12:40:13

MySQL數據庫

2022-01-24 14:08:16

Redis面試命令

2021-11-11 17:34:54

數據庫索引面試

2021-07-30 16:16:54

網絡面試TCP

2009-07-29 19:52:04

布線測試

2020-05-14 17:41:40

Redis 6.0多線程數據庫

2025-06-03 01:45:00

點贊
收藏

51CTO技術棧公眾號

亚洲欧美在线视频| 青青草精品视频| 日韩av影视综合网| 欧美 国产 日本| 91福利在线视频| 国产sm精品调教视频网站| 日本成人黄色片| 午夜精品一区二区三区视频| 国产精品巨作av| 欧美日韩成人在线一区| 丰满少妇大力进入| 性开放的欧美大片| 不卡的av电影| 91在线观看免费观看| wwwxxx亚洲| 香蕉av一区二区| 亚洲天堂免费在线| 国产女主播在线播放| 欧美va在线观看| 亚洲成av人片在www色猫咪| 亚洲 国产 欧美一区| 好男人在线视频www| 日韩电影免费在线观看网站| 久久久久亚洲精品国产| 91n在线视频| 欧美猛男做受videos| 精品国产亚洲在线| 精品人妻一区二区三| 日韩不卡在线| 色欲综合视频天天天| www.av蜜桃| 国产剧情在线| 亚洲欧洲日韩在线| 日韩欧美国产二区| 熟妇人妻中文av无码| 国产成人av影院| 亚洲一区二区三区香蕉| 一区二区 亚洲| 日韩国产精品91| 日韩免费观看在线观看| 九一国产在线观看| 亚洲高清电影| 久久久伊人欧美| 精品无码久久久久久久久| 97在线精品| 精品国偷自产在线视频99| 99国产精品免费| 成人毛片免费看| 中文日韩电影网站| 久久精品三级视频| 成人看的视频| 日韩最新免费不卡| 日本 欧美 国产| 91成人观看| 欧美成人精品激情在线观看| 欧美日韩在线观看成人| 一区二区三区网站| 精品中文字幕视频| 日本熟妇毛茸茸丰满| 日韩天天综合| 欧美中文字幕在线观看| 91丝袜一区二区三区| 美女久久网站| 国产精品入口免费视频一| 中文在线免费看视频| 免费观看日韩av| 成人精品在线观看| 精品人妻伦一区二区三区久久| 国产精品亚洲第一区在线暖暖韩国| 亚洲一区二区三区777| 午夜美女福利视频| va亚洲va日韩不卡在线观看| 免费观看成人高| 午夜在线小视频| 亚洲欧美激情在线| 91丨porny丨探花| 日韩pacopacomama| 欧美精品三级在线观看| 伊人av在线播放| 亚洲警察之高压线| www.欧美免费| 久久久久久久福利| 麻豆久久精品| 亚洲综合社区网| 日本成人动漫在线观看| 国产亚洲精品aa| 国产卡一卡二在线| 日韩激情电影免费看| 欧美日韩国产成人在线91 | 午夜亚洲福利在线老司机| 热久久这里只有| 国产精品特级毛片一区二区三区| 国产精品88888| 欧美亚洲免费高清在线观看| 国产cdts系列另类在线观看| 亚洲成人自拍偷拍| 亚洲人辣妹窥探嘘嘘| 18国产精品| 伊人久久综合97精品| 麻豆疯狂做受xxxx高潮视频| 久久精品人人做人人爽电影蜜月| 成人性生交大片免费看小说| 深爱五月激情五月| 国产精品久久久久久一区二区三区| 97超碰国产精品| 777午夜精品电影免费看| 日韩欧美三级在线| 日韩不卡av在线| 亚洲日本黄色| 成人黄色免费网站在线观看| 性感美女福利视频| 一区二区三区在线观看网站| 亚洲一区在线不卡| 乱亲女h秽乱长久久久| 日韩中文字幕国产精品| 免费观看成人毛片| 国产精品一级片在线观看| 色噜噜色狠狠狠狠狠综合色一| 久久免费电影| 555www色欧美视频| 四虎成人免费影院| 久久久人人人| 国产一区精品视频| 羞羞视频在线观看不卡| 欧美日韩精品一区视频| 亚洲女优在线观看| 免费亚洲视频| 久久国产手机看片| 国产伦子伦对白在线播放观看| 欧美丰满少妇xxxxx高潮对白| av永久免费观看| 久久大逼视频| 久久99精品久久久久久三级 | 色婷婷综合在线观看| 狠狠综合久久av一区二区蜜桃| 7m精品福利视频导航| 黄色一级大片在线免费看国产| 亚洲免费观看在线视频| 国产永久免费网站| 久久综合88| 国产精品自产拍在线观看| 国产一区二区影视| 欧美性生交xxxxx久久久| 一级特级黄色片| 亚洲国产一区二区精品专区| 国产66精品久久久久999小说| 成人日韩欧美| 欧美一区二区精品久久911| 无码黑人精品一区二区| 国产精品自拍av| 国风产精品一区二区| 久久久久久爱| 欧美日韩不卡合集视频| 亚洲精品久久久狠狠狠爱 | 日韩欧美中文字幕在线视频 | 99成人精品| 国产精品区一区二区三在线播放| 欧洲在线视频| 日韩精品一区二区三区在线观看| 久久久久久激情| 成人97人人超碰人人99| 少妇人妻在线视频| 一区二区三区韩国免费中文网站| 欧美中文在线免费| 成人在线免费公开观看视频| 欧美日韩国产一区二区三区地区| 国产黄色小视频网站| 国产精品资源在线观看| 无码中文字幕色专区| 九九久久精品| 国产精品久久久久免费a∨大胸 | 蜜桃久久久久| 欧洲成人免费视频| 成人性爱视频在线观看| 欧美一区二区三区在线观看视频| 久久综合加勒比| 99精品久久只有精品| av视屏在线播放| 影视亚洲一区二区三区| 国产一区免费观看| 日韩在线短视频| 操91在线视频| 天堂国产一区二区三区| 欧美亚一区二区| 美女福利视频在线观看| 成人av网在线| 中文字幕视频在线免费观看| 欧美淫片网站| 任我爽在线视频精品一| 精品久久亚洲| 欧美一级大片在线免费观看| 色三级在线观看| 亚洲国产精彩中文乱码av在线播放| www.国产一区二区| 亚洲精品成a人| 人妻精品久久久久中文| 成人禁用看黄a在线| 麻豆三级在线观看| 亚洲午夜一级| 在线视频精品一区| 香蕉久久夜色精品国产使用方法| 国产美女久久精品香蕉69| av日韩国产| www.日韩系列| 手机亚洲第一页| 日韩免费福利电影在线观看| 91青青草视频| 午夜伊人狠狠久久| 日韩精品一区二区亚洲av性色 | 好久没做在线观看| 在线午夜精品自拍| 天天干,天天操,天天射| 欧美一区二区三区免费| 国产天堂第一区| 高跟丝袜一区二区三区| 麻豆成人在线视频| 亚洲婷婷综合色高清在线| 真实乱视频国产免费观看| 波多野结衣中文字幕一区二区三区 | 国产一区免费在线| 日韩在线观看一区二区三区| 国产精品一区二区性色av| 筱崎爱全乳无删减在线观看| 欧美二区乱c黑人| 免费的黄网站在线观看| 原创国产精品91| 欧美日韩免费做爰大片| 亚洲精品美女免费| 欧美一区二区三区黄片| 91精品国产aⅴ一区二区| 在线观看国产黄| 欧洲人成人精品| 激情五月婷婷网| 欧美小视频在线观看| 国产精品500部| 亚洲国产一区二区在线播放| 欧美成人片在线观看| 亚洲柠檬福利资源导航| 伊人在线视频观看| 中文字幕一区日韩精品欧美| 999精品久久久| 国产精品视频第一区| 国产一二三四区在线| 国产日产欧美一区二区视频| 亚洲自拍偷拍图| 国产拍揄自揄精品视频麻豆| 亚洲精品国产一区黑色丝袜| 久久久噜噜噜久噜久久综合| 亚洲av无码一区二区三区观看| 不卡av在线免费观看| 亚洲中文字幕无码av| av欧美精品.com| 漂亮人妻被黑人久久精品| 97久久久精品综合88久久| yy1111111| 久久在线免费观看| 五月天综合视频| 国产精品美女久久久久久久久 | 伊人久久大香线蕉综合四虎小说 | 漫画在线观看av| 青草青草久热精品视频在线网站 | 91制片在线观看| 91精品国产高清自在线| videos性欧美另类高清| 国产精品成人免费电影| 四虎精品永久免费| 99porn视频在线| 日韩在线你懂的| 亚洲精品8mav| 欧美国产先锋| 欧美 日韩 亚洲 一区| 久久尤物视频| 一本色道久久亚洲综合精品蜜桃 | 亚洲av无码一区二区二三区| 欧美高清在线一区二区| 午夜爽爽爽男女免费观看| 亚洲成人动漫在线观看| 无码人妻精品一区二区三区不卡| 欧美日韩一区二区三区在线| a天堂视频在线| 国产丝袜一区视频在线观看| 天堂аⅴ在线地址8| 欧美理论片在线观看| 蜜桃视频m3u8在线观看| 国产精品美女av| 欧美午夜网站| 欧美一级爱爱| 午夜精品网站| 成人在线激情网| 国产精品资源网站| 亚洲成人网在线播放| 亚洲视频一区二区免费在线观看| 国产网址在线观看| 欧美日韩精品高清| 日本激情一区二区三区| 中文综合在线观看| xxxx成人| 国产日产久久高清欧美一区| 成人午夜三级| 在线免费一区| 久久精选视频| 亚洲精品成人无码毛片| 国产三级精品视频| 免费一级特黄特色大片| 欧美日韩在线播| 先锋av资源站| 欧美老女人在线视频| 澳门av一区二区三区| 国产精品乱码视频| 色综合咪咪久久网| 男女av免费观看| 国产精品羞羞答答xxdd| 中文天堂资源在线| 欧美日韩国产综合视频在线观看中文| 国产精品爽爽久久| 亚洲天堂男人天堂女人天堂| 欧美极品少妇videossex| 国产欧美日韩免费看aⅴ视频| 亚洲欧美tv| 拔插拔插海外华人免费| 韩国v欧美v日本v亚洲v| 超碰人人干人人| 欧美午夜久久久| 蜜臀久久久久久999| 日韩在线视频播放| 天天免费亚洲黑人免费| 久久久久久久久久久一区| 欧美欧美全黄| 99久久综合网| 亚洲美女屁股眼交| 中文字幕在线2019| 亚洲性视频网站| 亚洲承认视频| 久久久久久艹| 亚洲欧美春色| 毛片网站免费观看| 午夜久久电影网| 日韩一级免费视频| 欧美极度另类性三渗透| 精品一区二区三区免费看| 正在播放国产精品| 麻豆精品国产91久久久久久| 神马久久久久久久久久久| 在线观看亚洲精品视频| 噜噜噜噜噜在线视频| 欧美中文在线观看国产| 亚洲v天堂v手机在线| 日本一区二区黄色| 26uuu色噜噜精品一区二区| 国产精品黄色大片| 亚洲欧美制服第一页| 在线观看福利电影| 青青成人在线| 免费一级欧美片在线观看| 手机看片福利视频| 欧美三级韩国三级日本三斤| 成年人视频网站在线| 国产在线视频欧美| 一个色综合网| 蜜臀视频在线观看| 精品国产乱码久久久久久天美 | 久久精品在线视频| 国产精品777777在线播放| 4444亚洲人成无码网在线观看 | 亚洲欧美va天堂人熟伦| 欧美日韩精品一区视频| av免费网站在线观看| 51精品国产人成在线观看| 国产在线欧美| 欧美大片免费播放器| 色就色 综合激情| 亚乱亚乱亚洲乱妇| 97视频中文字幕| 亚洲影院免费| 操她视频在线观看| 欧美成人精精品一区二区频| 欧洲一区精品| 亚洲午夜久久久影院伊人| 国产一区二区视频在线播放| 国产无遮挡免费视频| 夜夜嗨av色综合久久久综合网| 日韩免费大片| 热99这里只有精品| 国产精品久久毛片a| 亚洲黄色一级大片| 日本精品在线视频| 婷婷综合在线| 国产偷人妻精品一区| 欧美久久久久久蜜桃| 国产在线精彩视频| 国产精品av免费| 99综合电影在线视频| 在线观看黄色国产| 97视频在线观看网址| 日韩精品免费| 黄色网址在线视频| 欧美肥胖老妇做爰| 亚洲一区站长工具| 欧美激情亚洲天堂| 中文字幕av一区二区三区高|