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

SpringCloud網(wǎng)關(guān)Zuul底層實(shí)現(xiàn)原理詳解

開發(fā) 前端
Zuul實(shí)現(xiàn)是基于Servlet這種阻塞是IO這種機(jī)制是通過創(chuàng)建更多的線程來彌補(bǔ)其不足;而Cloud Gateway則是基于反應(yīng)式非阻塞式的,使用少量的線程來做更多的事。

Zuul現(xiàn)在應(yīng)用的已經(jīng)非常少了,至少都在使用Spring Cloud Gateway。Zuul實(shí)現(xiàn)是基于Servlet這種阻塞是IO這種機(jī)制是通過創(chuàng)建更多的線程來彌補(bǔ)其不足;而Cloud Gateway則是基于反應(yīng)式非阻塞式的,使用少量的線程來做更多的事。以下是官方對阻塞與非阻塞的對比圖:

圖片圖片

1 收集路由

public class ZuulServerAutoConfiguration {
   @Autowired
   protected ZuulProperties zuulProperties;
   @Autowired
   protected ServerProperties server;
   // 主
   @Bean
   @Primary
   public CompositeRouteLocator primaryRouteLocator(
       Collection<RouteLocator> routeLocators) {
     return new CompositeRouteLocator(routeLocators);
   }
 
   @Bean
   @ConditionalOnMissingBean(SimpleRouteLocator.class)
   public SimpleRouteLocator simpleRouteLocator() {
     return new SimpleRouteLocator(this.server.getServlet().getContextPath(), this.zuulProperties);
   }
 }

SimpleRouteLocator

public class SimpleRouteLocator implements RouteLocator, Ordered {
   private ZuulProperties properties;
   private String dispatcherServletPath = "/";
   private String zuulServletPath;
   private AtomicReference<Map<String, ZuulRoute>> routes = new AtomicReference<>();
   // servletPath = server.servlet.contextPath 配置屬性值
   public SimpleRouteLocator(String servletPath, ZuulProperties properties) {
     this.properties = properties;
     if (StringUtils.hasText(servletPath)) {
       this.dispatcherServletPath = servletPath;
     }
     // 默認(rèn)為:/zuul
     this.zuulServletPath = properties.getServletPath();
   }
 
   // 該方法會在CompositeRouteLocator中調(diào)用,而本例的作用就是將ZuulRoute轉(zhuǎn)換為Route對象
   @Override
   public List<Route> getRoutes() {
     List<Route> values = new ArrayList<>();
     for (Entry<String, ZuulRoute> entry : getRoutesMap().entrySet()) {
       ZuulRoute route = entry.getValue();
       String path = route.getPath();
       try {
         // 將配置文件中配置的ZuulRoute路由轉(zhuǎn)換為Route對象
         values.add(getRoute(route, path));
       }
     }
     return values;
   }
   protected Map<String, ZuulRoute> getRoutesMap() {
     if (this.routes.get() == null) {
       this.routes.set(locateRoutes());
     }
     return this.routes.get();
   }
   protected Map<String, ZuulRoute> locateRoutes() {
     LinkedHashMap<String, ZuulRoute> routesMap = new LinkedHashMap<>();
     // properties.getRouets獲取配置文件中配置的所有路由
     for (ZuulRoute route : this.properties.getRoutes().values()) {
       routesMap.put(route.getPath(), route);
     }
     return routesMap;
   }
   protected Route getRoute(ZuulRoute route, String path) {
     String targetPath = path;
     // 獲取配置文件的zuul.prefix屬性值
     String prefix = this.properties.getPrefix();
     if (prefix.endsWith("/")) {
       // 刪除 '/' 結(jié)尾的字符
       prefix = prefix.substring(0, prefix.length() - 1);
     }
     // 判斷配置的路由path屬性值的開始字符串是不是以 '/prefix/'開頭,如:/api/
     // 如果配置的path:/api/api-1/**則匹配第一個(gè)條件,再判斷zuul.strip-prefix屬性值是否為true
     if (path.startsWith(prefix + "/") && this.properties.isStripPrefix()) {
       // 成立則會截取字符串刪除'/prefix/'開頭的字符,則最終targetPath = /api-1/**
       targetPath = path.substring(prefix.length());
     }
     // 如果配置為true
     if (route.isStripPrefix()) {
       // 知道path中第一個(gè)'*'
       int index = route.getPath().indexOf("*") - 1;
       // 如果存在
       if (index > 0) {
         // 截取第一個(gè)'*'之前的字符串
         // 如上:最終routePrefix = /api-1
         String routePrefix = route.getPath().substring(0, index);
         // 結(jié)合上面:targetPath = /**
         targetPath = targetPath.replaceFirst(routePrefix, "");
         // 結(jié)合上面:prefix = /api + /api-1 = /api/api-1
         prefix = prefix + routePrefix;
       }
     }
     // 上面的路徑處理就是將配置的zuul.prefix + zuul.routes.xx.path
     Boolean retryable = this.properties.getRetryable();
     if (route.getRetryable() != null) {
       retryable = route.getRetryable();
     }
     // 構(gòu)建Route對象
     return new Route(route.getId(), targetPath, route.getLocation(), prefix,
         retryable,
         route.isCustomSensitiveHeaders() ? route.getSensitiveHeaders() : null,
         route.isStripPrefix());
   }
 }

CompositeRouteLocator

public class CompositeRouteLocator implements RefreshableRouteLocator {
   private final Collection<? extends RouteLocator> routeLocators;
   private ArrayList<RouteLocator> rl;
   // 收集所有RouteLocator,如上面的SimpleRouteLocator
   public CompositeRouteLocator(Collection<? extends RouteLocator> routeLocators) {
     rl = new ArrayList<>(routeLocators);
     AnnotationAwareOrderComparator.sort(rl);
     this.routeLocators = rl;
   }
   public List<Route> getRoutes() {
     List<Route> route = new ArrayList<>();
     for (RouteLocator locator : routeLocators) {
       route.addAll(locator.getRoutes());
     }
     return route;
   }
 }

這里的RouteLocator有何用,下面會見到。

2 注冊HandlerMapping

Zuul會注冊自身特定的ZuulHandlerMapping對象。

public class ZuulServerAutoConfiguration {
   // Controller接口;一個(gè)controller接口可以通過實(shí)現(xiàn)Controller或AbstractController接口來實(shí)現(xiàn)
   @Bean
   public ZuulController zuulController() {
     return new ZuulController();
   }
 
   @Bean
   public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes,
       ZuulController zuulController) {
     // HandlerMapping中注入了RouteLocator,也就是上面的CompositeRouteLocator對象
     ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController);
     mapping.setErrorController(this.errorController);
     mapping.setCorsConfigurations(getCorsConfigurations());
     return mapping;
   }
 }

zuulController

public class ZuulController extends ServletWrappingController {
 
   public ZuulController() {
     // 調(diào)用父類的方法設(shè)置父類的成員變量servletClass 該Class是個(gè)Servlet
     // 在下面會看到如何使用ZuulServlet對象
     setServletClass(ZuulServlet.class);
     setServletName("zuul");
     // 支持任意的請求方法
     setSupportedMethods((String[]) null); // Allow all
   }
 
   // 該方法是Controller接口的核心方法
   @Override
   public ModelAndView handleRequest(HttpServletRequest request,
       HttpServletResponse response) throws Exception {
     try {
       return super.handleRequestInternal(request, response);
     }
   }
 }

ZuulHandlerMapping

HandlerMapping作用就是從通過請求的URI查找到合適的處理句柄,找到就之間返回,接下來就是由HandlerAdapter進(jìn)行實(shí)際的處理了

public class ZuulHandlerMapping extends AbstractUrlHandlerMapping {
   private volatile boolean dirty = true;
   private final ZuulController zuul;
   public ZuulHandlerMapping(RouteLocator routeLocator, ZuulController zuul) {
     this.routeLocator = routeLocator;
     this.zuul = zuul;
     // 優(yōu)先級就很高了,值越小優(yōu)先級越高
     setOrder(-200);
   }
   protected Object lookupHandler(String urlPath, HttpServletRequest request)
       throws Exception {
     if (this.errorController != null && urlPath.equals(this.errorController.getErrorPath())) {
       return null;
     }
     if (isIgnoredPath(urlPath, this.routeLocator.getIgnoredPaths())) {
       return null;
     }
     RequestContext ctx = RequestContext.getCurrentContext();
     if (ctx.containsKey("forward.to")) {
       return null;
     }
     if (this.dirty) {
       synchronized (this) {
         if (this.dirty) {
           // 首次時(shí)dirty為true,這時(shí)候就會注冊處理句柄了
           registerHandlers();
           this.dirty = false;
         }
       }
     }
     // 調(diào)用父類的方法查找合適的請求處理器,從父類handlerMap屬性(Map)集合中查找
     return super.lookupHandler(urlPath, request);
   }
   private void registerHandlers() {
     // 這里就調(diào)用了上面CompositeRouteLocator#getRoutes,這樣就得到了所有的路由信息
     Collection<Route> routes = this.routeLocator.getRoutes();
     if (routes.isEmpty()) {
       this.logger.warn("No routes found from RouteLocator");
     } else {
       for (Route route : routes) {
         // 注意:所有的請求路徑都對應(yīng)同一個(gè)Handler也就是上面的ZuulController對象
         // 到這就知道了所有的路由請求都會被ZuulController處理
         // 調(diào)用父類方法,將路由信息添加到父類handlerMap屬性中(Map)集合
         registerHandler(route.getFullPath(), this.zuul);
       }
     }
   }
 }

3 路由調(diào)用

一個(gè)請求過來時(shí),通過上面的ZuulHandlerMapping對象找到了合適的處理句柄也就是ZuulController,接下來就是由合適的HandlerAdapter進(jìn)行真正的調(diào)用了。

現(xiàn)在確定了handler對象是ZuulController,接下來就是查看那個(gè)HandlerAdatper能夠進(jìn)行處理了。

ZuulController實(shí)現(xiàn)了Controller接口,能夠處理該類型的是:SimpleControllerHandlerAdaper。

public class SimpleControllerHandlerAdapter implements HandlerAdapter {
   public boolean supports(Object handler) {
     return (handler instanceof Controller);
   }
 
   @Override
   @Nullable
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
       throws Exception {
     // 調(diào)用ZuulController#handleRequest方法
     return ((Controller) handler).handleRequest(request, response);
   }
 }

回到ZuulController

public class ZuulController extends ServletWrappingController {
 
   public ZuulController() {
     // 記住這里我們給父類屬性servletClass 設(shè)置為ZuulServlet
     setServletClass(ZuulServlet.class);
     setServletName("zuul");
     // 支持任意方法
     setSupportedMethods((String[]) null); // Allow all
   }
 
   @Override
   public ModelAndView handleRequest(HttpServletRequest request,
       HttpServletResponse response) throws Exception {
     try {
       // 調(diào)用父類方法
       return super.handleRequestInternal(request, response);
     } finally {
       // @see com.netflix.zuul.context.ContextLifecycleFilter.doFilter
       RequestContext.getCurrentContext().unset();
     }
   }
 
 }
 public class ServletWrappingController extends AbstractController
     implements BeanNameAware, InitializingBean, DisposableBean {
   private Class<? extends Servlet> servletClass;
   public void setServletClass(Class<? extends Servlet> servletClass) {
     this.servletClass = servletClass;
   }
   protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
       throws Exception {
     // 調(diào)用ZuulServlet#service方法(具體的處理還是通過ZuulServlet處理)
     this.servletInstance.service(request, response);
     return null;
   }
   // 該Bean在初始化解決會通過serveltClass實(shí)例化ZuulServlet對象。
   public void afterPropertiesSet() throws Exception {
     if (this.servletClass == null) {
       throw new IllegalArgumentException("'servletClass' is required");
     }
     if (this.servletName == null) {
       this.servletName = this.beanName;
     }
     // 實(shí)例化
     this.servletInstance = ReflectionUtils.accessibleConstructor(this.servletClass).newInstance();
     // servlet初始化
     this.servletInstance.init(new DelegatingServletConfig());
   }
 }

ZuulServlet

public class ZuulServlet extends HttpServlet {
   public void init(ServletConfig config) throws ServletException {
     super.init(config);
     String bufferReqsStr = config.getInitParameter("buffer-requests");
     boolean bufferReqs = bufferReqsStr != null && bufferReqsStr.equals("true") ? true : false;
     zuulRunner = new ZuulRunner(bufferReqs);
   }
   // 任意階段發(fā)生了異常都會執(zhí)行error,post階段
   public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {
     try {
       init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);
       RequestContext context = RequestContext.getCurrentContext();
       context.setZuulEngineRan();
 
       try {
         // pre節(jié)點(diǎn)的ZuulFilter執(zhí)行
         preRoute();
       } catch (ZuulException e) {
         // error階段
         error(e);
         postRoute();
         return;
       }
       try {
         // route階段的路由執(zhí)行
         // 這里其實(shí)就是通過網(wǎng)絡(luò)api調(diào)用目標(biāo)服務(wù)的接口了
         // 我們可以實(shí)現(xiàn)自己的處理api接口的調(diào)用
         // 如果你真的自己實(shí)現(xiàn)了,那么請記得最后執(zhí)行這行代碼
         // context.setRouteHost(null); // prevent SimpleHostRoutingFilter from running
         // 這樣就阻止默認(rèn)的執(zhí)行了
         // SimpleHostRoutingFilter 網(wǎng)絡(luò)請求處理使用的Apache Client
         // 在該節(jié)點(diǎn)得到數(shù)據(jù)后我們可以通過ProxyRequestHelper工具類將結(jié)果(InputStream)保存到
         // RequestContext中,一切順利在post階段就會由SendResponseFilter從RequestContext中獲取InputStream,然后寫到客戶端
         route();
       } catch (ZuulException e) {
         error(e);
         // 發(fā)生了異常也會執(zhí)行
         postRoute();
         return;
       }
       try {
         // post階段
         // 比如:系統(tǒng)提供的SendResponseFilter過濾器就是真正往客戶端開始寫數(shù)據(jù)了。
         postRoute();
       } catch (ZuulException e) {
         error(e);
         return;
       }
 
     } catch (Throwable e) {
       error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
     } finally {
       RequestContext.getCurrentContext().unset();
     }
   }
   void init(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
     // 將request,response都進(jìn)行了Wrapper(HttpServletRequestWrapper, HttpServletResponseWrapper)
     zuulRunner.init(servletRequest, servletResponse);
   }
 }

在上面就看到了各個(gè)階段的Filter的執(zhí)行。這里需要注意一點(diǎn),在每個(gè)階段執(zhí)行的時(shí)候都會通過FilterLoader來獲取對應(yīng)階段的ZuulFilter。

這個(gè)FilterLoader對象并不是一個(gè)被容器管理的對象,下面來看這個(gè)FilterLoader是如何收集所有ZuulFilter。

public class ZuulServerAutoConfiguration {
   @Configuration(proxyBeanMethods = false)
   protected static class ZuulFilterConfiguration {
 
     // 獲取容器中所有的ZuulFilter
     @Autowired
     private Map<String, ZuulFilter> filters;
 
     // 該Bean中有通過注解@PostConstruct標(biāo)注的Bean在初始化階段執(zhí)行的方法。
     @Bean
     public ZuulFilterInitializer zuulFilterInitializer(CounterFactory counterFactory,
         TracerFactory tracerFactory) {
       FilterLoader filterLoader = FilterLoader.getInstance();
       FilterRegistry filterRegistry = FilterRegistry.instance();
       return new ZuulFilterInitializer(this.filters, counterFactory, tracerFactory,
           filterLoader, filterRegistry);
     }
 
   }
 }
 public class ZuulFilterInitializer {
   private final Map<String, ZuulFilter> filters;
   private final FilterLoader filterLoader;
   private final FilterRegistry filterRegistry;
   public ZuulFilterInitializer(Map<String, ZuulFilter> filters,
       CounterFactory counterFactory, TracerFactory tracerFactory,
       FilterLoader filterLoader, FilterRegistry filterRegistry) {
     this.filters = filters;
     this.counterFactory = counterFactory;
     this.tracerFactory = tracerFactory;
     this.filterLoader = filterLoader;
     this.filterRegistry = filterRegistry;
   }
 
   // 該方法作用就是將所有的ZuulFilter添加到FilterRegistry中
   @PostConstruct
   public void contextInitialized() {
     for (Map.Entry<String, ZuulFilter> entry : this.filters.entrySet()) {
       // 將所有的ZuulFilter注冊到FilterRegistry中
       filterRegistry.put(entry.getKey(), entry.getValue());
     }
   }
 }

FilterLoader

public class FilterLoader {
   public Object runFilters(String sType) throws Throwable {
     boolean bResult = false;
     // 獲取對應(yīng)階段的ZuulFilter
     List<ZuulFilter> list = FilterLoader.getInstance().getFiltersByType(sType);
     if (list != null) {
       for (int i = 0; i < list.size(); i++) {
         ZuulFilter zuulFilter = list.get(i);
         Object result = processZuulFilter(zuulFilter);
         if (result != null && result instanceof Boolean) {
           bResult |= ((Boolean) result);
         }
       }
     }
     return bResult;
   }
   public List<ZuulFilter> getFiltersByType(String filterType) {
     List<ZuulFilter> list = hashFiltersByType.get(filterType);
     if (list != null) return list;
 
     list = new ArrayList<ZuulFilter>();
 
     // 從FilterRegistry中獲取所有的ZuulFilter;在上面看到了所有的ZuulFilter都被添加到了FilterRegistry中
     Collection<ZuulFilter> filters = filterRegistry.getAllFilters();
     for (Iterator<ZuulFilter> iterator = filters.iterator(); iterator.hasNext(); ) {
       ZuulFilter filter = iterator.next();
       if (filter.filterType().equals(filterType)) {
         list.add(filter);
       }
     }
     Collections.sort(list); // sort by priority
 
     hashFiltersByType.putIfAbsent(filterType, list);
     return list;
   }
 }

以上就是Zuul網(wǎng)關(guān)的底層實(shí)現(xiàn)原理。

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

2020-11-18 11:26:45

SpringCloudZuulJava

2022-05-13 08:23:07

Zuul微服務(wù)Zuul過濾器

2022-12-19 08:00:00

SpringBootWeb開發(fā)

2023-07-20 10:04:37

底層路由配置

2023-07-11 08:00:00

2024-01-05 09:00:00

SpringMVC軟件

2021-08-29 07:41:48

數(shù)據(jù)HashMap底層

2023-01-04 07:54:03

HashMap底層JDK

2021-04-20 10:15:34

Spring ClouZuul架構(gòu)

2021-08-31 07:36:22

LinkedListAndroid數(shù)據(jù)結(jié)構(gòu)

2022-05-20 12:14:50

ZuulSpringClou

2021-01-08 08:34:09

Synchronize線程開發(fā)技術(shù)

2024-03-07 07:47:04

代碼塊Monitor

2017-10-18 16:00:14

SpringCloudZuul路徑

2021-02-20 08:40:19

HiveExplain底層

2021-02-07 09:36:20

LongAdderJDK8開發(fā)

2017-10-23 10:13:18

IO底層虛擬

2022-12-26 09:27:48

Java底層monitor

2022-05-12 08:21:13

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

2024-08-05 10:03:53

點(diǎn)贊
收藏

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

色一情一乱一乱一91av| 成人成人成人在线视频| 日韩最新av在线| 欧美体内she精高潮| av资源网在线播放| 日本一区二区综合亚洲| 99精品国产高清一区二区| 在线观看免费国产视频| 秋霞欧美视频| 日韩av一区在线观看| 久久国产激情视频| 正在播放日韩精品| 亚洲视频免费在线观看| 久久久神马电影| 国产草草影院ccyycom| 久久国产精品久久久久久电车| 最新69国产成人精品视频免费| 最新版天堂资源在线| 国产日本久久| 欧美性猛交xxxx黑人猛交| 穿情趣内衣被c到高潮视频| 高清国产福利在线观看| av福利精品导航| 亚洲free性xxxx护士hd| 国产精品无码一区| 亚洲中字黄色| 久久久人成影片一区二区三区观看 | 美女视频一区| 黑人极品videos精品欧美裸| 国产一级片91| 黄色小网站在线观看| 国产午夜精品一区二区三区嫩草 | 亚洲成人一级片| 久久精品久久99精品久久| 日韩av手机在线| 圆产精品久久久久久久久久久| 久久久久美女| 深夜福利亚洲导航| 欧美一区二区三区粗大| 国产成人久久| 国产视频久久久久| www.88av| 国语一区二区三区| 欧美xxx久久| 亚洲综合123| 免费日韩成人| 欧美午夜女人视频在线| 少妇性饥渴无码a区免费| 黄色污污视频在线观看| 一区二区三区在线观看国产 | 黄网站在线播放| 中文字幕乱码日本亚洲一区二区 | 欧美日韩国产一区二区| 18禁裸男晨勃露j毛免费观看| 超碰在线无需免费| 亚洲欧美日韩国产一区二区三区| 亚洲自拍三区| 黄网页免费在线观看| 国产精品灌醉下药二区| 一区二区三区精品国产| 国产在线激情视频| 亚洲黄色在线视频| 国产精品一线二线三线| 毛片在线网站| 欧美专区在线观看一区| 激情黄色小视频| 白嫩亚洲一区二区三区| 日韩久久久久久| 欧美日韩一区二区三区四区五区六区| 激情小说一区| 亚洲欧美精品在线| 看黄色录像一级片| 欧美三级第一页| 992tv成人免费视频| 午夜精品免费观看| 蜜臀av一区二区在线观看| 成人性生交大片免费看小说 | 美女又爽又黄免费视频| 日本视频一区二区| 亚洲自拍偷拍区| 人妻少妇一区二区三区| 久久久久久日产精品| 亚洲一区高清| brazzers在线观看| 欧美自拍丝袜亚洲| 国产精品熟女一区二区不卡| 欧美成人午夜77777| 国产午夜一区二区| 免费一级片在线观看| 午夜亚洲性色福利视频| 成人乱色短篇合集| 狠狠综合久久av一区二区| 国产视频在线观看一区二区三区| 日本丰满大乳奶| 日韩伦理在线| 91精品国产全国免费观看| 风间由美一二三区av片| 国产精品国产一区| 91地址最新发布| 国产精品无码在线播放| 26uuu精品一区二区在线观看| 伊人久久青草| 日韩伦理精品| 欧美变态tickling挠脚心| 日本美女bbw| 一区二区三区导航| 亚洲精品日韩av| 免费福利在线视频| 亚洲综合一区二区| 日韩一区二区三区久久| 亚洲三级性片| 高清亚洲成在人网站天堂| 亚洲综合精品在线| 久久久综合视频| 成人在线观看你懂的| 精品视频在线观看免费观看| 亚洲日本中文字幕免费在线不卡| 九九在线观看视频| 国内成+人亚洲+欧美+综合在线 | 男人久久精品| 亚洲高清不卡在线观看| 操人视频免费看| 成人亚洲一区二区| 全亚洲最色的网站在线观看| 亚洲欧美激情另类| 一区二区三区四区不卡视频| 亚洲娇小娇小娇小| 成人精品久久| 国产精品白嫩美女在线观看| 三区在线观看| 婷婷综合久久一区二区三区| 中文字幕人妻熟女在线| 中文字幕免费一区二区| 91精品视频播放| av电影在线观看网址| 欧美中文一区二区三区| 少妇大叫太粗太大爽一区二区| 一区二区亚洲| 国产经品一区二区| 国产亚av手机在线观看| 日韩精品一区二| 麻豆成人在线视频| 大桥未久av一区二区三区中文| 久久国产精品免费观看| 91麻豆精品国产综合久久久| 日韩中文字幕在线播放| 波多野结衣视频在线观看| 久久精品一区蜜桃臀影院| 日本久久精品一区二区| 日韩成人a**站| 国产精品永久免费视频| 免费黄色网址在线观看| 4438x亚洲最大成人网| 老司机成人免费视频| 国产精品一区在线观看乱码| 欧美大黑帍在线播放| 精品女人视频| 欧美一级视频一区二区| 国产鲁鲁视频在线观看免费| 欧美亚洲动漫另类| 5566中文字幕| 国产福利一区在线| 欧美日韩一道本| 精品大片一区二区| 国产主播欧美精品| xxx.xxx欧美| 亚洲开心激情网| 中文字幕在线播放av| 亚洲欧洲成人精品av97| 女同性αv亚洲女同志| 中文久久精品| 亚洲欧美精品在线观看| 欧美黄色一级| 清纯唯美日韩制服另类| 老司机精品视频在线观看6| 日韩欧美一级片| 日韩三级视频在线播放| 国产三级久久久| 亚洲精品久久久久久| 日韩一级不卡| 在线免费观看成人网| 成人性生交大片免费看中文视频| 欧美在线视频a| 免费网站黄在线观看| 精品成人私密视频| 色婷婷久久综合中文久久蜜桃av| 亚洲免费在线播放| 欧美性xxxx图片| 精品一区精品二区高清| 国产美女在线一区| 日韩影院二区| 国产日韩一区欧美| 91精品福利观看| 欧美亚洲一区在线| a级毛片免费观看在线| 亚洲欧美精品一区| 成 人 黄 色 片 在线播放| 在线观看免费视频综合| 久久久久久久久久一区二区三区| 国产情人综合久久777777| 风韵丰满熟妇啪啪区老熟熟女| 日产国产欧美视频一区精品| 久久艹国产精品| 亚洲深深色噜噜狠狠爱网站| 欧美极品色图| 欧美jizz19性欧美| 91亚洲精品丁香在线观看| www.成人在线视频| 欧美影院久久久| 国精一区二区三区| 久久久精品久久久| 成人精品一区二区| 日韩成人免费视频| 亚洲国产精品视频在线| 欧美精品久久一区| 中文字幕 国产| 一本色道久久综合亚洲aⅴ蜜桃| 精品欧美一区二区久久久久| 国产精品伦一区| 亚洲av无码一区二区三区人| 不卡在线观看av| 美女流白浆视频| 国产一区二区三区免费| 污色网站在线观看| 日韩中文字幕区一区有砖一区| 欧美激情 国产精品| 欧美三区不卡| 99精品一级欧美片免费播放| 成人一区而且| 色噜噜狠狠一区二区三区| 蜜桃国内精品久久久久软件9| 国产精品免费观看高清| 911精品国产| 成人综合色站| 精品av导航| 国产一区二区精品免费| 亚洲专区**| 99r国产精品视频| 一区二区三区在线资源| 91视频免费进入| 都市激情久久| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 成人在线短视频| 国产呦萝稀缺另类资源| 男女视频在线观看网站| 极品少妇一区二区三区精品视频| 网站一区二区三区| 久久99在线观看| 亚洲高清av一区二区三区| 精品一区二区三区视频在线观看 | 国产欧美一区二区精品忘忧草 | 国产99亚洲| 视频一区二区三区在线观看| 欧美呦呦网站| 91免费视频黄| 欧美精品一线| 青青草国产免费| 亚洲影视综合| www.涩涩涩| 激情国产一区二区| 韩国三级视频在线观看| 99久久国产综合精品女不卡| www.自拍偷拍| 国产精品成人免费| 久久久久黄色片| 一本大道综合伊人精品热热| 在线观看亚洲国产| 欧美成人免费网站| 免费福利在线观看| 久久天天躁狠狠躁老女人| 成人免费高清观看| 国产成人精品a视频一区www| 色综合久久久| 国产在线播放一区二区| 免费视频国产一区| 久久久成人精品一区二区三区| 亚洲一级高清| 艹b视频在线观看| 岛国精品一区二区| 性欧美精品男男| 亚洲欧洲精品成人久久奇米网 | 欧美中文字幕一区二区三区| 国产精品久久影视| 亚洲精品二三区| 免费在线观看黄色| 538国产精品视频一区二区| 国产第一亚洲| 精品免费国产| 99re66热这里只有精品8| 亚洲 自拍 另类小说综合图区| 日韩精品一二三四| 亚洲av成人片无码| 国产精品夫妻自拍| 日韩黄色在线播放| 日韩一区国产二区欧美三区| 韩国中文字幕2020精品| 欧美另类高清videos| 视频一区在线免费看| 国产欧美亚洲日本| 888久久久| 欧美亚洲日本在线观看| 成人av影院在线| 日本午夜在线观看| 在线观看成人免费视频| 日韩一级在线播放| 欧美xxxx18性欧美| 国产资源一区| 欧美日韩亚洲一区二区三区四区| 亚洲色图欧美| 九九热免费在线观看| 国产欧美视频一区二区| 国产成人一区二区三区影院在线| 欧美另类变人与禽xxxxx| 青青草视频在线免费观看| 欧美激情第6页| 麻豆精品一区| 欧美 日韩 国产 在线观看| 久久综合婷婷| 亚洲午夜福利在线观看| 亚洲国产sm捆绑调教视频| av高清一区二区| 久久综合88中文色鬼| 欧美高清xxx| 神马影院我不卡| 日韩精品免费专区| avtt香蕉久久| 欧美日韩亚洲一区二| 日韩有码第一页| 欧美黑人巨大精品一区二区| 国产日韩中文在线中文字幕| 尤物一区二区三区| 久久99精品国产.久久久久久| 69视频在线观看免费| 日本高清成人免费播放| 国产视频第一页在线观看| 日本欧美一二三区| 亚洲涩涩av| 超碰在线97免费| 国产日韩欧美不卡| 中文字幕二区三区| 色七七影院综合| 亚洲久草在线| 欧美a级免费视频| 国产盗摄视频一区二区三区| 激情小说中文字幕| 精品区一区二区| 国产美女精品写真福利视频| 狠狠色综合网站久久久久久久| 亚洲久久视频| 国产ts在线播放| 欧美亚洲一区二区三区四区| 不卡在线视频| 91在线精品视频| 欧美日韩免费| 在线观看国产三级| 91福利国产精品| 亚洲天天影视| 91av免费看| av成人激情| 亚洲欧洲久久久| 欧美精品日韩一本| 色呦呦在线免费观看| 国产亚洲第一区| 视频一区国产视频| 成人黄色短视频| 日韩一区二区三区电影| 大黄网站在线观看| 日本视频一区在线观看| 久久国产成人午夜av影院| 加勒比av在线播放| 日韩高清中文字幕| 激情欧美一区二区三区黑长吊| 一道本在线观看视频| av综合在线播放| 波多野结衣电车| 久久99久久99精品中文字幕| 色婷婷av一区二区三区丝袜美腿| 中文字幕在线观看第三页| 亚洲色图欧美激情| 亚洲日本香蕉视频| 成人中文字幕在线观看| 国产欧美综合一区二区三区| 欧美性猛交xxxx乱大交少妇| 精品久久国产老人久久综合| 黑人巨大精品| 欧美美女黄色网| 久久久久久亚洲综合| 亚洲国产福利视频| 国产激情视频一区| 国产精品第十页| 免费一级特黄3大片视频| 精品捆绑美女sm三区 | 另类图片国产| 老湿机69福利| 亚洲新声在线观看| 国产伦精品一区二区三区免费优势 | 蜜桃av一区二区| 五月天综合在线| 久久精品成人欧美大片古装| 亚洲精品国产动漫|