日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

TomcatNginx源码笔记分析

發布時間:2024/4/19 Nginx 131 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TomcatNginx源码笔记分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tomcat

1.訪問執行流程

2.tomcat的執行流程

Tomcat的兩個重要身份
1)http服務器
2)Tomcat是?個Servlet容器

3.tomcat的容器執行流程

當?戶請求某個URL資源時

1)HTTP服務器會把請求信息使?ServletRequest對象封裝起來

2)進?步去調?Servlet容器中某個具體的Servlet

3)在 2)中,Servlet容器拿到請求后,根據URL和Servlet的映射關系,找到相應的Servlet

4)如果Servlet還沒有被加載,就?反射機制創建這個Servlet,并調?Servlet的init?法來完成初始化

5)接著調?這個具體Servlet的service?法來處理請求,請求處理結果使?ServletResponse對象封裝

6)把ServletResponse對象返回給HTTP服務器,HTTP服務器會把響應發送給客戶端

4.tomcat的結構圖

5.tomcat兩大功能

1.連接器(Coyote)connector

1.運行流程

負責對外交流: 處理Socket連接,負責?絡字節流與Request和Response對象的轉化

(1)Coyote 封裝了底層的?絡通信(Socket 請求及響應處理)

(2)Coyote 使Catalina 容器(容器組件)與具體的請求協議及IO操作?式完全解耦

(3)Coyote 將Socket 輸?轉換封裝為 Request 對象,進?步封裝后交由Catalina 容器進?處理,處

理請求完成后, Catalina 通過Coyote 提供的Response 對象將結果寫?輸出流

(4)Coyote 負責的是具體協議(應?層)和IO(傳輸層)相關內容

2.組件

EndPoint EndPoint 是 Coyote 通信端點,即通信監聽的接?,是具體Socket接收和發送處理器,是對傳輸層的抽象,因此EndPoint?來實現TCP/IP協議的

Processor Processor?來實現HTTP協議,Processor接收來?EndPoint的Socket,讀取字節流解析成Tomcat Request和Response對象,并通過Adapter將其提交到容器處理,Processor是對應?層協議的抽象

ProtocolHandler Coyote 協議接?, 通過Endpoint 和 Processor , 實現針對具體協議的處理能?

Adapter CoyoteAdapter負責將Tomcat Request轉成ServletRequest,再調?容器

2.容器組件container

負責內部處理:加載和管理Servlet,以及具體處理Request請求;

6.server.xml

1.每?個Service實例下可以有多個Connector實例和?個Container實例

<?xml version="1.0" encoding="UTF-8"?> <!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements. See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License. You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may notdefine subcomponents such as "Valves" at this level.Documentation at /docs/config/server.html--><!--Server 根元素,創建?個Server實例,?標簽有 Listener、GlobalNamingResources、 Service --> <!--port:關閉服務器的監聽端?shutdown:關閉服務器的指令字符串 --> <Server port="8005" shutdown="SHUTDOWN"><!-- 以?志形式輸出服務器 、操作系統、JVM的版本信息 --><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- Security listener. Documentation at /docs/config/listeners.html<Listener className="org.apache.catalina.security.SecurityListener" />--><!--APR library loader. Documentation at /docs/apr.html --><!-- 加載(服務器啟動) 和 銷毀 (服務器停?) APR。 如果找不到APR庫, 則會輸出?志, 并 不影響 Tomcat啟動 --><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><!-- Prevent memory leaks due to use of particular java/javax APIs--><!-- 避免JRE內存泄漏問題 --><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><!-- 加載(服務器啟動) 和 銷毀(服務器停?) 全局命名服務 --><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><!-- 在Context停?時重建 Executor 池中的線程, 以避免ThreadLocal 相關的內存泄漏 --><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><!-- Global JNDI resourcesDocumentation at /docs/jndi-resources-howto.html--><!--定義服務器的全局JNDI資源 --><GlobalNamingResources><!-- Editable user database that can also be used byUserDatabaseRealm to authenticate users--><Resource name="UserDatabase" auth="Container"type="org.apache.catalina.UserDatabase"description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" /></GlobalNamingResources><!-- A "Service" is a collection of one or more "Connectors" that sharea single "Container" Note: A "Service" is not itself a "Container",so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html--><!--該標簽?于創建 Service 實例,默認使? org.apache.catalina.core.StandardService。默認情況下,Tomcat 僅指定了Service 的名稱, 值為 "Catalina"。Service ?標簽為 : Listener、Executor、Connector、Engine,其中:Listener ?于為Service添加?命周期監聽器,Executor ?于配置Service 共享線程池,Connector ?于配置Service 包含的鏈接器,Engine ?于配置Service中鏈接器對應的Servlet 容器引擎 --><Service name="Catalina"><!--The connectors can use a shared executor, you can define one or more named thread pools--><!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="150" minSpareThreads="4"/>--><!-- 默認情況下,Service 并未添加共享線程池配置。 如果我們想添加?個線程池, 可以在<Service> 下添加如下配置:name:線程池名稱,?于 Connector中指定namePrefix:所創建的每個線程的名稱前綴,?個單獨的線程名稱為 namePrefix+threadNumbermaxThreads:池中最?線程數minSpareThreads:活躍線程數,也就是核?池線程數,這些線程不會被銷毀,會?直存在maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒maxQueueSize:在被執?前最?線程排隊數?,默認為Int的最?值,也就是?義的?限。除?特 殊情況,這個值 不需要更改,否則會有請求不會被處理的情況發?prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。默認值為false,即不啟動threadPriority:線程池中線程優先級,默認值為5,值從1到10className:線程池實現類,未指定情況下,默認實現類為 org.apache.catalina.core.StandardThreadExecutor。如果想使??定義線程池?先需要實現org.apache.catalina.Executor接? --><Executor name="commonThreadPool"namePrefix="thread-exec-"maxThreads="200"minSpareThreads="100"maxIdleTime="60000"maxQueueSize="Integer.MAX_VALUE"prestartminSpareThreads="false"threadPriority="5"className="org.apache.catalina.core.StandardThreadExecutor"/><!-- port:端?號,Connector ?于創建服務端Socket 并進?監聽, 以等待客戶端請求鏈接。如果該屬性設置 為0, Tomcat將會隨機選擇?個可?的端?號給當前Connector 使? protocol:當前Connector ?持的訪問協議。 默認為 HTTP/1.1 , 并采??動切換機制選擇?個基于 JAVA NIO 的鏈接器或者基于本地APR的鏈接器(根據本地是否含有Tomcat的本地庫判定) connectionTimeOut: Connector 接收鏈接后的等待超時時間, 單位為 毫秒。 -1 表示不超時。 redirectPort:當前Connector 不?持SSL請求, 接收到了?個請求, 并且也符合security-constraint 約束, 需要SSL傳輸,Catalina?動將請求重定向到指定的端?。 executor:指定共享線程池的名稱, 也可以通過maxThreads、minSpareThreads 等屬性配置內部線程池。URIEncoding:?于指定編碼URI的字符編碼, Tomcat8.x版本默認的編碼為 UTF-8 , Tomcat7.x版本默認為ISO- 8859-1 --> <!--org.apache.coyote.http11.Http11NioProtocol , ?阻塞式 Java NIO 鏈接器--><!-- A "Connector" represents an endpoint by which requests are receivedand responses are returned. Documentation at :Java HTTP Connector: /docs/config/http.htmlJava AJP Connector: /docs/config/ajp.htmlAPR (HTTP/AJP) Connector: /docs/apr.htmlDefine a non-SSL/TLS HTTP/1.1 Connector on port 8080--><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><!-- A "Connector" using the shared thread pool--><!--<Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />--><!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443This connector uses the NIO implementation. The defaultSSLImplementation will depend on the presence of the APR/nativelibrary and the useOpenSSL attribute of theAprLifecycleListener.Either JSSE or OpenSSL style configuration may be used regardless ofthe SSLImplementation selected. JSSE style configuration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/localhost-rsa.jks"type="RSA" /></SSLHostConfig></Connector>--><!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2This connector uses the APR/native implementation which always usesOpenSSL for TLS.Either JSSE or OpenSSL style configuration may be used. OpenSSL styleconfiguration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"maxThreads="150" SSLEnabled="true" ><UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /><SSLHostConfig><Certificate certificateKeyFile="conf/localhost-rsa-key.pem"certificateFile="conf/localhost-rsa-cert.pem"certificateChainFile="conf/localhost-rsa-chain.pem"type="RSA" /></SSLHostConfig></Connector>--><!-- Define an AJP 1.3 Connector on port 8009 --><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><!-- An Engine represents the entry point (within Catalina) that processesevery request. The Engine implementation for Tomcat stand aloneanalyzes the HTTP headers included with the request, and passes themon to the appropriate Host (virtual host).Documentation at /docs/config/engine.html --><!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">--><!--name: ?于指定Engine 的名稱, 默認為CatalinadefaultHost:默認使?的虛擬主機名稱, 當客戶端請求指向的主機?效時, 將交由默認的虛擬主機處理, 默認為localhost--><Engine name="Catalina" defaultHost="localhost"><!--For clustering, please take a look at documentation at:/docs/cluster-howto.html (simple how to)/docs/config/cluster.html (reference documentation) --><!--<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>--><!-- Use the LockOutRealm to prevent attempts to guess user passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase". Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm. --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><!--Host 標簽?于配置?個虛擬主機 --><Host name="www.2.com" appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!--docBase:Web應??錄或者War包的部署路徑。可以是絕對路徑,也可以是相對于 Host appBase的相對路徑。path:Web應?的Context 路徑。如果我們Host名為localhost, 則該web應?訪問的根路徑為: http://localhost:8080/web_demo。--><Context docBase="/Users/yingdian/web_demo" path="/web3"></Context><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host><Host name="www.1.com" appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!--docBase:Web應??錄或者War包的部署路徑。可以是絕對路徑,也可以是相對于 Host appBase的相對路徑。path:Web應?的Context 路徑。如果我們Host名為localhost, 則該web應?訪問的根路徑為: http://localhost:8080/web_demo。--><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host></Engine></Service> </Server>

2.自定義tomcat

2.1 執行流程圖


2.2 執行流程

以ServerSocket為核心,導向

ServerSocket serverSocket = new ServerSocket(port);//8080 Socket socket = serverSocket.accept(); socket.close();

1.加載配置文件

讀取web.xml文件

key 為 /lagou (url-pattern路徑)

value是 實例化后的servlet(LagouServlet)實例 存儲到Map集合中

<?xml version="1.0" encoding="UTF-8" ?> <web-app><servlet><servlet-name>lagou</servlet-name><servlet-class>server.LagouServlet</servlet-class></servlet><servlet-mapping><servlet-name>lagou</servlet-name><url-pattern>/lagou</url-pattern></servlet-mapping> </web-app> private void loadServlet() {InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("web.xml");SAXReader saxReader = new SAXReader();try {Document document = saxReader.read(resourceAsStream);Element rootElement = document.getRootElement();//獲取節點是servlet的標簽List<Element> selectNodes = rootElement.selectNodes("//servlet");for (int i = 0; i < selectNodes.size(); i++) {Element element = selectNodes.get(i);// <servlet-name>lagou</servlet-name>Element servletnameElement = (Element) element.selectSingleNode("servlet-name");String servletName = servletnameElement.getStringValue();// <servlet-class>server.LagouServlet</servlet-class>Element servletclassElement = (Element) element.selectSingleNode("servlet-class");String servletClass = servletclassElement.getStringValue();// 根據servlet-name的值找到url-patternElement servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");// /lagouString urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();servletMap.put(urlPattern, (HttpServlet) Class.forName(servletClass).newInstance());}} catch (DocumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}

2. 定義線程池

(RequestProcessor)

// 定義一個線程池int corePoolSize = 10;int maximumPoolSize =50;long keepAliveTime = 100L;TimeUnit unit = TimeUnit.SECONDS;BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);ThreadFactory threadFactory = Executors.defaultThreadFactory();RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);

3. 請求進,調用線程池的線程

*/ while(true) {Socket socket = serverSocket.accept();RequestProcessor requestProcessor = new RequestProcessor(socket,servletMap);//requestProcessor.start();threadPoolExecutor.execute(requestProcessor);} //========================================@Overridepublic void run() {try{InputStream inputStream = socket.getInputStream();// 封裝Request對象和Response對象Request request = new Request(inputStream);Response response = new Response(socket.getOutputStream());// 靜態資源處理if(servletMap.get(request.getUrl()) == null) {response.outputHtml(request.getUrl());}else{// 動態資源servlet請求HttpServlet httpServlet = servletMap.get(request.getUrl());httpServlet.service(request,response);}socket.close();}catch (Exception e) {e.printStackTrace();}}

1.Request請求

將請求頭封裝 獲取Get請求方式以及路徑

// 構造器,輸入流傳入public Request(InputStream inputStream) throws IOException {this.inputStream = inputStream;// 從輸入流中獲取請求信息int count = 0;while (count == 0) {count = inputStream.available();}byte[] bytes = new byte[count];inputStream.read(bytes);/** /GET /lagou HTTP/1.1 Host: localhost:8080 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9**/String inputStr = new String(bytes);// 獲取第一行請求頭信息String firstLineStr = inputStr.split("\\n")[0]; // GET / HTTP/1.1String[] strings = firstLineStr.split(" ");this.method = strings[0];this.url = strings[1];System.out.println("=====>>method:" + method);System.out.println("=====>>url:" + url);}

2.Response請求

獲取到絕對路徑,判斷File.isFile()然后輸出靜態文件

public class Response {private OutputStream outputStream;public Response() {}public Response(OutputStream outputStream) {this.outputStream = outputStream;}// 使用輸出流輸出指定字符串public void output(String content) throws IOException {outputStream.write(content.getBytes());}/**** @param path url,隨后要根據url來獲取到靜態資源的絕對路徑,進一步根據絕對路徑讀取該靜態資源文件,最終通過* 輸出流輸出* /-----> classes*/public void outputHtml(String path) throws IOException {// 獲取靜態資源文件的絕對路徑String absoluteResourcePath = StaticResourceUtil.getAbsolutePath(path);// 輸入靜態資源文件File file = new File(absoluteResourcePath);if(file.exists() && file.isFile()) {// 讀取靜態資源文件,輸出靜態資源StaticResourceUtil.outputStaticResource(new FileInputStream(file),outputStream);}else{// 輸出404output(HttpProtocolUtil.getHttpHeader404());}}}

4.調用LagouServlet

package server;import java.io.IOException;public class LagouServlet extends HttpServlet {@Overridepublic void doGet(Request request, Response response) {// try { // Thread.sleep(100000); // } catch (InterruptedException e) { // e.printStackTrace(); // }String content = "<h1>LagouServlet get</h1>";try {response.output((HttpProtocolUtil.getHttpHeader200(content.getBytes().length) + content));} catch (IOException e) {e.printStackTrace();}}@Overridepublic void doPost(Request request, Response response) {String content = "<h1>LagouServlet post</h1>";try {response.output((HttpProtocolUtil.getHttpHeader200(content.getBytes().length) + content));} catch (IOException e) {e.printStackTrace();}}@Overridepublic void init() throws Exception {}@Overridepublic void destory() throws Exception {} }

####工具類

package server;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;public class StaticResourceUtil {/*** 獲取靜態資源文件的絕對路徑* @param path* @return*/public static String getAbsolutePath(String path) {String absolutePath = StaticResourceUtil.class.getResource("/").getPath();return absolutePath.replaceAll("\\\\","/") + path;}/*** 讀取靜態資源文件輸入流,通過輸出流輸出*/public static void outputStaticResource(InputStream inputStream, OutputStream outputStream) throws IOException {int count = 0;while(count == 0) {count = inputStream.available();}int resourceSize = count;// 輸出http請求頭,然后再輸出具體內容outputStream.write(HttpProtocolUtil.getHttpHeader200(resourceSize).getBytes());// 讀取內容輸出long written = 0 ;// 已經讀取的內容長度int byteSize = 1024; // 計劃每次緩沖的長度byte[] bytes = new byte[byteSize];while(written < resourceSize) {if(written + byteSize > resourceSize) { // 說明剩余未讀取大小不足一個1024長度,那就按真實長度處理byteSize = (int) (resourceSize - written); // 剩余的文件內容長度bytes = new byte[byteSize];}inputStream.read(bytes);outputStream.write(bytes);outputStream.flush();written+=byteSize;}} } package server;/*** http協議工具類,主要是提供響應頭信息,這里我們只提供200和404的情況*/ public class HttpProtocolUtil {/*** 為響應碼200提供請求頭信息* @return*/public static String getHttpHeader200(long contentLength) {return "HTTP/1.1 200 OK \n" +"Content-Type: text/html \n" +"Content-Length: " + contentLength + " \n" +"\r\n";}/*** 為響應碼404提供請求頭信息(此處也包含了數據內容)* @return*/public static String getHttpHeader404() {String str404 = "<h1>404 not found</h1>";return "HTTP/1.1 404 NOT Found \n" +"Content-Type: text/html \n" +"Content-Length: " + str404.getBytes().length + " \n" +"\r\n" + str404;} }

================

迭代升級

1.口述流程

項目啟動bootstrap.start()

  • 加載server.xml,讀取端口port 8080以及HostNameappBase的絕對路徑
  • 遍歷文件夾,讀取項目的web.xml文件,獲取setvlet的class的類路徑,以及url-pattern,實例化存儲到對象中
  • 請求進來時,截取Url判斷相應的servlet,執行相應的請求
  • 2.讀取server.xml,web.xml

    /*** 加載解析web.xml,初始化Servlet*/private void loadConfig() {InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("server.xml");SAXReader saxReader = new SAXReader();try {Document document = saxReader.read(resourceAsStream);Element rootElement = document.getRootElement();List<Element> selectNodes = rootElement.selectNodes("//Host");for (int i = 0; i < selectNodes.size(); i++) {Host host = new Host();Element element = selectNodes.get(i);String hostName = element.attributeValue("name");String appBase = element.attributeValue("appBase");// 掃描appBase下的文件夾,每一個文件夾認為是一個項目(Context)File appBaseFolder = new File(appBase);File[] files = appBaseFolder.listFiles();for(File file: files) {if(file.isDirectory()) {Context context = new Context();String contextPath = file.getName();context.setPath(contextPath);// 構建Wrappers,一個Wrapper對應一個ServletFile webFile = new File(file,"web.xml");List<Wrapper> list = loadWebXml(webFile.getAbsolutePath());context.setWrappers(list);host.getContexts().add(context);}}host.setName(hostName);mapper.getHosts().add(host);}} catch (DocumentException | FileNotFoundException e) {e.printStackTrace();}}/*** 解析web.xml,構建Wrappers*/public List<Wrapper> loadWebXml(String webXmlPath) throws FileNotFoundException {List<Wrapper> list = new ArrayList<>();InputStream resourceAsStream = new FileInputStream(webXmlPath);SAXReader saxReader = new SAXReader();try {Document document = saxReader.read(resourceAsStream);Element rootElement = document.getRootElement();MyClassLoader myClassLoader = new MyClassLoader();List<Element> selectNodes = rootElement.selectNodes("//servlet");for (int i = 0; i < selectNodes.size(); i++) {Element element = selectNodes.get(i);// <servlet-name>lagou</servlet-name>Element servletnameElement = (Element) element.selectSingleNode("servlet-name");String servletName = servletnameElement.getStringValue();// <servlet-class>server.LagouServlet</servlet-class>Element servletclassElement = (Element) element.selectSingleNode("servlet-class");String servletClass = servletclassElement.getStringValue();// 根據servlet-name的值找到url-patternElement servletMapping = (Element) rootElement.selectSingleNode("/web-app/servlet-mapping[servlet-name='" + servletName + "']");// /lagouString urlPattern = servletMapping.selectSingleNode("url-pattern").getStringValue();Class<?> aClass = myClassLoader.findClass(webXmlPath.replace("web.xml", "") + "/",servletClass);HttpServlet servlet = (HttpServlet) aClass.newInstance();Wrapper wrapper = new Wrapper();wrapper.setUrlPattern(urlPattern);wrapper.setServlet(servlet);list.add(wrapper);}}catch (Exception e) {e.printStackTrace();}return list;}

    3.類的實例化加載,動態加載.class

    Class<?> aClass = myClassLoader.findClass(webXmlPath.replace("web.xml", "") + "/",servletClass);HttpServlet servlet = (HttpServlet) aClass.newInstance(); //======================================================= public class MyClassLoader extends ClassLoader {/** * name class 類的絕對路徑*/ @Override protected Class<?> findClass(String basePath,String name) {String myPath = "file://" + basePath + name.replaceAll("\\.","/") + ".class";System.out.println(myPath);byte[] cLassBytes = null;Path path = null;try {path = Paths.get(new URI(myPath));cLassBytes = Files.readAllBytes(path);} catch (IOException | URISyntaxException e) {e.printStackTrace();}Class clazz = defineClass(name, cLassBytes, 0, cLassBytes.length);return clazz;} }

    4.判斷URL的路徑

    Servlet servlet = resolveServlet(request.getUrl()); //=========================/*** 從mapper中取出需要的servlet* @return*/private Servlet resolveServlet(String url) {String[] split = url.split("/");String contextFlag = split[1];String servletFlag = url.substring(("/" + contextFlag).length());// 此處認為只有這一個hostList<Context> contexts = mapper.getHosts().get(0).getContexts();for(Context context: contexts) {if(contextFlag.equalsIgnoreCase(context.getPath())) {List<Wrapper> wrappers = context.getWrappers();for(Wrapper wrapper:wrappers) {if(wrapper.getUrlPattern().equalsIgnoreCase(servletFlag)) {return wrapper.getServlet();}}}}return null;}

    5.封裝的類

    5.1Host類

    public class Host {private String name;private List<Context> contexts = new ArrayList<>();public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Context> getContexts() {return contexts;}public void setContexts(List<Context> contexts) {this.contexts = contexts;} }

    5.2Mapper類

    public class Mapper {private List<Host> hosts = new ArrayList<>();public List<Host> getHosts() {return hosts;}public void setHosts(List<Host> hosts) {this.hosts = hosts;} }

    5.3wapper類

    public class Wrapper {private String urlPattern;private Servlet servlet;public String getUrlPattern() {return urlPattern;}public void setUrlPattern(String urlPattern) {this.urlPattern = urlPattern;}public Servlet getServlet() {return servlet;}public void setServlet(Servlet servlet) {this.servlet = servlet;} }

    3.jvm的類加載機制

    3.1加載類

  • 引導啟動類加載器(BootstrapClassLoader) c++編寫,加載java核?庫 java.*,?如rt.jar中的類,構造ExtClassLoader和AppClassLoader

  • 擴展類加載器(ExtClassLoader) java編寫,加載擴展庫 JAVA_HOME/lib/ext?錄下的jar中的類,如classpath中的jre ,javax.*或者java.ext.dir指定位置中的類

  • 系統類加載器 (SystemClassLoader/AppClassLoader)默認的類加載器,搜索環境變量 classpath 中指明的路徑

  • 3.2 雙親委派機制

    3.2.1 什么是雙親委派

    當某個類加載器需要加載某個.class?件時,它?先把這個任務委托給他的上級類加載器,遞歸這個操

    作,如果上級的類加載器沒有加載,??才會去加載這個類。

    3.2.2 作用

  • 防?重復加載同?個.class。通過委托去向上?問?問,加載過了,就不?再加載?遍。保證數據安全。
  • 2.保證核?.class不能被篡改。通過委托?式,不會去篡改核?.class,即使篡改也不會去加載,即使

    加載也不會是同?個.class對象了。不同的加載器加載同?個.class也不是同?個.class對象。這樣

    保證了class執?安全(如果?類加載器先加載,那么我們可以寫?些與java.lang包中基礎類同名

    的類, 然后再定義?個?類加載器,這樣整個應?使?的基礎類就都變成我們??定義的類了。

    Object類 -----> ?定義類加載器(會出現問題的,那么真正的Object類就可能被篡改了)

    3.2.3 Tomcat 的類加載機制

    tomcat 8.5 默認改變了嚴格的雙親委派機制

  • ?先從 Bootstrap Classloader加載指定的類

    如果未加載到,則從 /WEB-INF/classes加載

    如果未加載到,則從 /WEB-INF/lib/*.jar 加載

  • 如果未加載到,則依次從 System、Common、Shared 加載(在這最后?步,遵從雙親委派

  • 機制)

    Common 通?類加載器加載Tomcat使?以及應?通?的?些類,位于CATALINA_HOME/lib下,?如servlet-api.jar

    Catalina ClassLoader ?于加載服務器內部可?類,這些類應?程序不能訪問

    Shared ClassLoader ?于加載應?程序共享類,這些類服務器不會依賴

    Webapp ClassLoader,每個應?程序都會有?個獨???的Webapp ClassLoader,他?來加載本應?程序 /WEB-INF/classes 和 /WEB-INF/lib 下的類。

    4.tomcat對Https支持

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" schema="https" secure="true" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="/Users/yingdian/workspace/servers/apache-tomcat-8.5.50/conf/lagou.keystore" certificateKeystorePassword="lagou123" type="RSA"/></SSLHostConfig> </Connector>

    5.tocmat的優化策略

    5.1Tomcat?身配置的優化

    (?如是否使?了共享線程池?IO模型?)

    5.1.1調整tomcat線程池

    <Executor name="commonThreadPool"namePrefix="thread-exec-"maxThreads="200"minSpareThreads="100"maxIdleTime="60000"maxQueueSize="Integer.MAX_VALUE"prestartminSpareThreads="false"threadPriority="5"className="org.apache.catalina.core.StandardThreadExecutor"/><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"executor="commonThreadPool"/>

    5.1.2禁? A JP 連接器

    禁用下面這段 <!-- Define an AJP 1.3 Connector on port 8009 --><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    5.1.3調整 IO 模式

    Tomcat8之前的版本默認使?BIO(阻塞式IO),對于每?個請求都要創建?個線程來處理,不適

    合?并發;Tomcat8以后的版本默認使?NIO模式(?阻塞式IO)

    protocol就是Io模型

    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"executor="commonThreadPool"/>

    5.1.4動靜分離

    可以使?Nginx+Tomcat相結合的部署?案,Nginx負責靜態資源訪問,Tomcat負責Jsp等動態資源訪問處理(因為Tomcat不擅?處理靜態資源)。

    5.2 jvm優化

    jvm內存模型

    5.2.1設置虛擬機參數

    JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

    5.2.2垃圾回收策略

    JDK1.7之后使用G1收集器

    JAVA_OPTS="-XX:+UseConcMarkSweepGC"

    垃圾回收性能指標

    吞吐量:?作時間(排除GC時間)占總時間的百分?, ?作時間并不僅是程序運?的時間,還包

    含內存分配時間。

    暫停時間:由垃圾回收導致的應?程序停?響應次數/時間。

    垃圾收集器

  • 串?收集器(Serial Collector)
  • 單線程執?所有的垃圾回收?作, 適?于單核CPU服務器

    ?作進程(單線程)垃圾回收線程進?垃圾收集**|—**?作進程繼續

  • 并?收集器(Parallel Collector)

    ?作進程 (多線程)垃圾回收線程進?垃圾收集**|—**?作進程繼續

    ?稱為吞吐量收集器(關注吞吐量), 以并?的?式執?年輕代的垃圾回收, 該?式可以顯著降

    低垃圾回收的開銷(指多條垃圾收集線程并??作,但此時?戶線程仍然處于等待狀態)。適?于多

    處理器或多線程硬件上運?的數據量較?的應?

  • 并發收集器(Concurrent Collector)

    以并發的?式執??部分垃圾回收?作,以縮短垃圾回收的暫停時間。適?于那些響應時間優先于

    吞吐量的應?, 因為該收集器雖然最?化了暫停時間(指?戶線程與垃圾收集線程同時執?,但不?

    定是并?的,可能會交替進?), 但是會降低應?程序的性能

  • CMS收集器(Concurrent Mark Sweep Collector)

    并發標記清除收集器, 適?于那些更愿意縮短垃圾回收暫停時間并且負擔的起與垃圾回收共享處

    理器資源的應?

  • G1收集器(Garbage-First Garbage Collector)

    適?于?容量內存的多核服務器, 可以在滿?垃圾回收暫停時間?標的同時, 以最?可能性實現

    ?吞吐量(JDK1.7之后)

  • 6.nginx

    6.1特點

  • 跨平臺:Nginx可以在?多數類unix操作系統上編譯運?,?且也有windows版本

  • Nginx的上??常容易,配置也?較簡單

  • ?并發,性能好

  • 穩定性也特別好,宕機概率很低

  • 6.3 nginx.conf

    #===================start=全局快 #user nobody; #運行用戶 #worker進程數量 通常設置和Cpu數量相等 worker_processes 1;#全局錯誤日志以及Pid文件位置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid; #===================end=全局快 #events塊主要影響nginx服務器與?戶的?絡連接,?如worker_connections 1024,標識每個workderprocess?持的最?連接數為1024 events {worker_connections 1024; }#負載均衡策略 upstream lagouServer{ #每個請求按照ip的hash結果分配,每?個客戶端的請求會固定分配到同?個?標服務器處理,可以解決session問題ip_hash;#weight代表權重,默認每?個負載的服務器都為1,權重越?那么被分配的請求越多(?于服務器性能不均衡的場景)server 62.234.115.217:8080 weight=1;server 62.234.115.217:8082 weight=2; }#http塊http塊是配置最頻繁的部分,虛擬主機的配置,監聽端?的配置,請求轉發、反向代理、負載均衡等http {#引入mime類型的文件include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#連接超時時間#keepalive_timeout 0;keepalive_timeout 65;#開啟gzip壓縮#gzip on;server {#建通端口listen 80;#使用localhost訪問server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;#默認請求location / {root html; #默認的網站根目錄位置index index.html index.htm;#索引頁,歡迎頁}#反向代理,請求轉發到其他服務器,根據前綴location /abc {proxy_pass http://127.0.0.1:8080;}location /def {proxy_pass http://127.0.0.1:8080;}#使用負載浚航location /def {proxy_pass http://myServer/;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#錯誤提示頁面error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}#動靜態分離 靜態資源處理,直接去nginx服務器目錄中加載location /static/ {root staticData}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}

    6.4命令

    ./nginx -s reload 來說明nginx信號處理這部分

    1)master進程對配置?件進?語法檢查

    2)嘗試配置(?如修改了監聽端?,那就嘗試分配新的監聽端?)

    3)嘗試成功則使?新的配置,新建worker進程

    4)新建成功,給舊的worker進程發送關閉消息

    5)舊的worker進程收到信號會繼續服務,直到把當前進程接收到的請求處理完畢后關閉

    所以reload之后worker進程pid是發?了變化的

    6.5nginx底層刨析

    Nginx啟動后,以daemon多進程?式在后臺運?,包括?個Master進程和多個Worker進程,Master進程是領導,是??,Worker進程是?活的?弟。

    master進程

    ? 主要是管理worker進程,?如:

    ? 接收外界信號向各worker進程發送信號(./nginx -s reload)

    ? 監控worker進程的運?狀態,當worker進程異常退出后Master進程會?動重新啟動新的worker進程等

    worker進程

    ? worker進程具體處理?絡請求。多個worker進程之間是對等的,他們同等競爭來?客戶端的請

    ? 求,各進程互相之間是獨?的。?個請求,只可能在?個worker進程中處理,?個worker進程,

    ? 不可能處理其它進程的請求。worker進程的個數是可以設置的,?般設置與機器cpu核數?致。

    拓展

    1.AJP和HTTP連接器區別

    tomcat的server.xml中的AJP和HTTP連接器區別

    HTTP協議:連接器監聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。  
    AJP協議:連接器監聽8009端口,負責和其他的HTTP服務器建立連接。在把Tomcat與其他HTTP服務器集成時,就需要用到這個連接器。

    AJP(Apache JServ Protocol)是定向包協議。因為性能原因,使用二進制格式來傳輸可讀性文本。WEB服務器通過TCP連接和SERVLET容器連接。

    WEB服務器一般維持和Web容器的多個TCP Connecions,即TCP連接池,多個request/respons循環重用同一個Connection。

    但是當Connection被分配(Assigned)到某個請求時,該請求完成之前,其他請求不得使用該連接。

    單詞

    Protocol 協議 ==>ProtocolHandler

    Rejected 拒絕

    Block 塊,阻塞
    Policy 政策,方針
    trigger觸發

    protocols 協議

    extension 延伸

    Executor 執行者

    available 可用
    digest 消化,摘要

    internal 內部

    standard 標準

    Upgrade升級,往上

    artifact 成品

    總結

    以上是生活随笔為你收集整理的TomcatNginx源码笔记分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    欧美激情综合网 | 亚洲精品久久久久久中文传媒 | 国产精品成人久久久久 | 国产福利91精品一区 | 中文字幕网址 | av高清一区二区三区 | 91大神免费视频 | 99视频在线免费观看 | 在线免费亚洲 | 亚洲国产精品久久久久久 | 美女av在线免费 | 久久国产免费 | 国产精品字幕 | 欧美在线视频一区二区三区 | 久久久久久久久久久免费 | 国产特黄色片 | 午夜影院一区 | 91视频免费看片 | 国产第一二区 | 亚洲另类视频 | 99自拍视频在线观看 | 免费观看一级 | 日韩免费b| 91九色蝌蚪视频 | 99久热在线精品视频 | 免费福利视频导航 | 日本黄色免费在线观看 | 四月婷婷在线观看 | 精品视频www| 亚洲天天干 | 狠狠色丁香婷综合久久 | 五月婷婷另类国产 | 韩日av一区二区 | 国产在线观看国语版免费 | 久久成电影 | 人人爽人人爽人人片 | 国产拍揄自揄精品视频麻豆 | 91成人在线观看高潮 | 人人爱爱人人 | 欧美精品国产综合久久 | 日本三级全黄少妇三2023 | 欧美精品做受xxx性少妇 | 国产高清av | 人人爱人人射 | 婷婷久月 | 亚洲永久精品一区 | 国产手机在线观看视频 | 欧美日韩中文在线观看 | 夜夜躁日日躁 | 成人免费视频网址 | 在线电影 一区 | 日日夜日日干 | 成人在线观看av | 亚洲 欧美 日韩 综合 | 中文字幕在线看视频国产中文版 | 激情图片qvod | 97热久久免费频精品99 | 97精品国产97久久久久久 | 黄污网站在线 | 欧美性高跟鞋xxxxhd | 在线黄色国产 | 色婷婷综合在线 | 狠狠网站 | 免费大片黄在线 | 色99在线 | 婷婷香蕉 | 97精品超碰一区二区三区 | 精品免费视频. | 午夜在线观看 | 久久免费视频1 | 黄色成品视频 | 日韩成人黄色av | 亚洲日本一区二区在线 | 狠狠网 | 超碰成人网 | 国产成人av | 97精品国产aⅴ| 人人狠狠综合久久亚洲 | 91视频啊啊啊 | 毛片一二区 | 在线韩国电影免费观影完整版 | 综合视频在线 | 久日精品 | 国产精品门事件 | 99久久久国产免费 | 亚洲 中文 在线 精品 | 激情网色 | 久在线观看| 国产在线一线 | 国产精品永久免费 | 日韩精品一区二区三区中文字幕 | 一区二区三区免费网站 | 国产一区精品在线 | 久久久久久久国产精品影院 | 日本动漫做毛片一区二区 | a黄色片在线观看 | 四虎5151久久欧美毛片 | 中文在线a∨在线 | 欧美成人精品欧美一级乱黄 | 国产在线更新 | 久久久久久久久影院 | 免费在线色 | 草免费视频 | 天堂va在线观看 | 91插插视频| 国产亚洲精品免费 | 97超碰人人 | 成人av网站在线观看 | 国产精品丝袜久久久久久久不卡 | 午夜av一区 | 免费在线激情电影 | 日本久草电影 | 91麻豆精品国产91久久久更新时间 | 九九九热精品 | 亚洲伊人色 | 丁香婷婷激情五月 | 99国产一区二区三精品乱码 | 伊人电影在线观看 | 97超碰人人澡 | 成人av网站在线 | 99精品在线直播 | 高清在线一区 | 草免费视频 | 成年人在线观看 | 2019中文在线观看 | 五月激情亚洲 | 五月婷久久 | 免费在线观看av网址 | 91热这里只有精品 | 国产正在播放 | 日韩av手机在线看 | 日韩字幕在线观看 | 免费毛片一区二区三区久久久 | 91在线国产观看 | 中文字幕精品在线 | 日韩网站中文字幕 | 激情久久伊人 | 国产高清亚洲 | 国产啊v在线观看 | 亚洲精品中文字幕在线 | 色五婷婷 | 免费福利小视频 | 天天干天天操天天做 | 最新成人在线 | 韩日av一区二区 | 国产一区二区在线观看免费 | 激情五月婷婷综合网 | 91视频久久久久久 | 国产精品无av码在线观看 | 91av在线国产 | 日日摸日日爽 | 国产成人在线免费观看 | 亚洲香蕉在线观看 | 超碰在线观看97 | 久久99精品久久久久久久久久久久 | 亚洲精品99久久久久中文字幕 | 最近在线中文字幕 | 久久久亚洲麻豆日韩精品一区三区 | 超碰人人91| 国产精品免费看久久久8精臀av | 亚洲激情综合 | 激情久久久久久久久久久久久久久久 | 国内久久久 | 久久不射电影网 | 深夜视频久久 | 五月天婷亚洲天综合网精品偷 | 久久久精品国产一区二区三区 | 在线观看视频你懂得 | 日产中文字幕 | 成人在线电影观看 | 国产精品岛国久久久久久久久红粉 | 中文字幕免费 | 国产精品免费观看国产网曝瓜 | 丁香 久久 综合 | 中文字幕电影在线 | 国产99久久久精品视频 | 久艹视频在线免费观看 | 国产玖玖视频 | 亚洲国产精品久久 | 91自拍视频在线观看 | 免费av高清 | 狠狠的干狠狠的操 | 黄色网在线免费观看 | 五月婷婷av在线 | 国产精品综合在线 | 亚洲一级特黄 | 免费福利在线观看 | 激情开心色| 亚洲 中文字幕av | 欧美精品在线观看 | 免费观看性生交大片3 | 国产高清第一页 | 久草精品视频 | 色噜噜狠狠色综合中国 | 黄色大全在线观看 | 国产精品视频一二三 | 久久精品国产免费看久久精品 | 1000部18岁以下禁看视频 | 日本一区二区三区免费观看 | 久久99热精品这里久久精品 | 色婷婷国产精品 | 日韩成人xxxx | 亚洲情影院 | 日韩视频一区二区三区 | a午夜电影 | 一区二区三区在线视频观看58 | 97超碰中文 | 国产亚洲精品成人av久久ww | 久久久国产电影 | 99久久久久 | 在线视频久久 | 一区二区三区在线观看免费视频 | 久久福利剧场 | 国产自产高清不卡 | 在线日韩亚洲 | 久久视影| 深夜免费福利 | 亚洲欧美日韩在线看 | 99热最新在线 | 日本少妇久久久 | av电影免费在线看 | 国产一级电影免费观看 | 在线免费成人 | 九九热中文字幕 | 亚洲三级网站 | 黄色一区二区在线观看 | 99九九99九九九视频精品 | 久久视频免费在线观看 | 亚洲毛片久久 | 国产免费高清视频 | 国产精品一区二区三区久久 | 欧美尹人| 国产又粗又猛又色又黄视频 | 亚洲午夜久久久影院 | 91视频在线免费看 | 91免费网站在线观看 | 日韩精品综合在线 | 久久国产电影 | 日韩69视频 | 欧美一级片| 深夜精品福利 | 久久y | 亚洲高清91 | 亚州精品天堂中文字幕 | 亚洲天天综合网 | 国产视频精品久久 | 四虎免费av | 黄色福利网 | 国产精品乱码久久久 | 韩国av免费在线 | 亚洲免费一级电影 | 在线免费高清 | 美女性爽视频国产免费app | 久久久久久久久久久高潮一区二区 | 日韩欧美久久 | 三级视频日韩 | 亚洲美女在线一区 | 91亚洲精 | 国产日本在线播放 | 天天干,天天射,天天操,天天摸 | 91丨九色丨蝌蚪丨老版 | 久草在线免费看视频 | 亚洲最新合集 | 日韩av电影手机在线观看 | 999久久| 久久99视频| 又色又爽又激情的59视频 | 久久精品中文字幕一区二区三区 | 亚洲精品高清在线观看 | 成年人视频在线免费 | 国产一二三区av | 最新av电影网址 | 免费瑟瑟网站 | 色综久久 | 国产第一页在线播放 | 中文在线字幕免费观看 | 精品福利网| 欧美日韩国产页 | 91黄色免费网站 | 久草视频2 | 男女靠逼app | 91传媒免费观看 | 99精品国产在热久久下载 | 欧美午夜精品久久久久 | 97精品国产97久久久久久 | 夜色成人av| 日韩精品一区二区三区电影 | 蜜臀av.com | 国产精品免费一区二区三区 | 中文字幕av一区二区三区四区 | 韩国一区二区av | 日本精品视频在线观看 | 夜夜夜夜爽 | 国产精品资源网 | 亚洲最新视频在线 | 久草在线免费色站 | 色偷偷88888欧美精品久久 | 黄色a三级 | 国产亚洲一区二区在线观看 | 在线观看av国产 | 精品在线播放视频 | 久久久久久国产精品久久 | 日韩精品免费一区二区在线观看 | 欧美成人区 | 国产中文字幕视频在线观看 | 岛国精品一区二区 | 一级电影免费在线观看 | 国产乱码精品一区二区三区介绍 | av在线日韩| 992tv在线观看网站 | 99精品热视频只有精品10 | 成人高清在线 | 日韩免费二区 | 人人射人人射 | 午夜久久久久久久久 | 欧美极品一区二区三区 | 国产自产在线视频 | 国产精品久久9 | 久热超碰 | 伊人婷婷综合 | 九九久久久久久久久激情 | 丁香综合激情 | 欧美一二三视频 | 91传媒在线 | 国产精品不卡在线播放 | 国产一区二区在线免费观看 | 97视频资源| 激情综合网天天干 | 深爱激情站 | 免费男女羞羞的视频网站中文字幕 | 日日爱999 | 99在线精品免费视频九九视 | 五月婷综合网 | 国产麻豆成人传媒免费观看 | 午夜精品一区二区三区免费视频 | 久久久综合香蕉尹人综合网 | 中文字幕频道 | 久久国产精品成人免费浪潮 | 极品久久久久久久 | 成人羞羞视频在线观看免费 | 色 中文字幕 | 一级片视频在线 | 麻豆久久精品 | 天天色图 | 国产啊v在线观看 | 久久男人免费视频 | 午夜精品电影 | 久久一区二区三区四区 | 91原创在线观看 | 婷婷色网视频在线播放 | 国产在线精品播放 | 黄色成人av | 国产精品久久久久永久免费观看 | 日韩有码网站 | 久草在线视频免赞 | 免费久草视频 | 久久精品黄色 | 免费观看av | 色5月婷婷 | 亚洲高清视频在线观看免费 | 91麻豆精品国产91久久久使用方法 | 免费色视频网址 | 麻豆91在线播放 | 香蕉视频在线播放 | 午夜精品电影一区二区在线 | 成人在线黄色电影 | 五月婷久久 | 色网站免费在线看 | 天天干天天操天天干 | 午夜电影 电影 | 成人午夜精品久久久久久久3d | 久久人人爽人人片av | 亚洲天堂色婷婷 | 999在线观看视频 | 91精品国产电影 | 激情电影影院 | 97色婷婷人人爽人人 | 黄色a视频| 亚洲女同videos | 国产精品岛国久久久久久久久红粉 | 免费观看黄 | 成人九九视频 | 99久久精品国产一区二区三区 | 深爱激情久久 | 麻豆91网站| 日日干天天射 | 欧美一性一交一乱 | 五月婷在线观看 | av福利在线免费观看 | 亚洲精品456在线播放乱码 | 欧亚日韩精品一区二区在线 | v片在线播放| 黄色网中文字幕 | 精品一区二区在线免费观看 | 免费aa大片| av免费网站观看 | 国产精品久久久久久一二三四五 | 日韩免费视频在线观看 | 欧美aa在线| 久久久久久麻豆 | 超碰电影在线观看 | av一区二区三区在线播放 | 久久艹艹 | 色爱区综合激月婷婷 | 日韩一区正在播放 | 成人在线播放网站 | 亚洲激情久久 | 国产精品普通话 | 国产精品久久99 | 91精品入口 | 久久综合狠狠综合久久狠狠色综合 | 日韩欧美精品在线观看视频 | 国产精品 999 | 成人黄色毛片视频 | 日日干狠狠操 | 欧美a在线看 | 91视频传媒 | 亚洲黄色av | 人人澡人 | 高清av网| 在线成人免费 | 国产一卡二卡在线 | 国产美女网站在线观看 | 欧美精品久久久久久久久久白贞 | 91免费在线视频 | 日本大尺码专区mv | 亚洲免费在线 | jizzjizzjizz亚洲 | 色综合久久88色综合天天6 | 日韩精品欧美精品 | 日韩网站在线免费观看 | 99麻豆久久久国产精品免费 | 天天摸日日摸人人看 | 久久涩视频 | 热99久久精品 | 综合五月婷婷 | 中文字幕av免费在线观看 | 国产成人亚洲在线观看 | 97人人网 | 午夜精品久久久久久久99婷婷 | 丁香激情视频 | 国产91免费看 | 国模吧一区 | 视频直播国产精品 | av黄色在线播放 | 亚洲五月六月 | 毛片网站观看 | 成人久久国产 | 2021国产精品视频 | 免费看污污视频的网站 | 国产精品久久久久婷婷二区次 | 在线观看成人 | 欧美日韩中文国产一区发布 | 黄色av一级片 | 日韩久久午夜一级啪啪 | 在线观看久草 | 免费在线成人av | 精品美女久久 | 久久国产视屏 | 国产黄在线 | 狠狠色丁香婷婷综合久小说久 | 国产三级视频 | 亚洲综合婷婷 | 国产偷在线 | 国产精品久久久久久99 | 超碰97在线资源 | www.色国产| 久久综合婷婷国产二区高清 | 日日日日干 | 日韩精品一区二区三区中文字幕 | 成人午夜电影免费在线观看 | 国产一级片免费观看 | 婷婷丁香花 | 色网站国产精品 | 日韩精品欧美精品 | 欧美日韩视频免费 | av日韩中文| 久久精品免视看 | 五月婷婷丁香六月 | 亚洲一级理论片 | 天堂久色| 国产a级片免费观看 | 国产精品第一 | 午夜久久福利 | 99久久精品国产一区二区三区 | 麻豆91精品 | 国产99久久99热这里精品5 | 午夜av不卡 | 久久国产精品久久w女人spa | 日韩网站在线看片你懂的 | av动态图片 | av手机版| 成人av一区二区在线观看 | 福利视频一区二区 | 久久免费播放视频 | 伊人婷婷在线 | 亚洲成熟女人毛片在线 | 亚洲一区av| 在线天堂中文在线资源网 | 国产精品免费观看视频 | 久久免费的精品国产v∧ | 国产午夜精品av一区二区 | 国产精品久久久久国产精品日日 | 天天操偷偷干 | 日韩91av| 中文字幕电影高清在线观看 | 九九热久久久 | 国产一级视频在线免费观看 | 99热手机在线观看 | 久久综合之合合综合久久 | 亚洲成人网在线 | 在线中文字幕网站 | 黄污网| 国产精品手机看片 | 欧美在线观看视频一区二区 | 久久精品站| 日日夜夜草 | 国产精品18久久久久久久久 | 丁香5月婷婷| 国产一级免费观看 | 在线观看欧美成人 | 天天操天天摸天天射 | 91高清在线 | 波多野结衣视频一区 | 成年人网站免费在线观看 | 欧美精品国产综合久久 | 久草电影在线观看 | 免费在线观看av网站 | 国产区精品在线观看 | 久久久久久久久爱 | 国产视频精品免费播放 | 成人一区二区三区在线观看 | www五月| 国产一级视频在线免费观看 | av网站免费在线 | 99久久久成人国产精品 | 日韩中文字幕在线 | 四虎欧美| 精品福利片| 久久久久久久久久免费视频 | 婷婷丁香av| 久草在在线视频 | 日韩黄色在线观看 | 欧美精品二 | 久久se视频 | 热re99久久精品国产66热 | 综合天堂av久久久久久久 | 久久成人精品电影 | 日韩精品一区二区三区在线视频 | 嫩草av影院 | 色五月色开心色婷婷色丁香 | 91福利国产在线观看 | 日本精品一区二区三区在线观看 | 日韩动态视频 | 国产69熟 | 91精品国产一区二区在线观看 | 免费一级片在线观看 | 国产精品久久久久久久久久新婚 | 最新91在线视频 | 精品国产色| 久久国内精品99久久6app | 日韩av免费在线电影 | 黄色免费在线看 | 欧美天天综合 | 97超碰免费 | 超碰.com| 懂色av一区二区在线播放 | 久久国产精品影视 | 一级黄色片在线免费看 | 精品国产片 | 久久久久久免费视频 | 精品中文字幕在线播放 | 中文理论片| 一区二区伦理 | 国产亚洲精品久久久久久电影 | 亚洲精品在线免费看 | 又黄又爽又刺激的视频 | 亚洲v精品 | 日韩三级视频在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 69精品视频 | 国内精品久久久久久久影视简单 | 国产一卡二卡在线 | 国产不卡在线观看视频 | 黄色av免费电影 | 日韩啪啪小视频 | 99精品免费久久久久久久久 | 久久久久久久久久久久久久电影 | 亚州av免费 | 91人人爽久久涩噜噜噜 | 欧美性极品xxxx做受 | 就要干b| 国产精品久久99 | 天天做天天爱天天爽综合网 | av黄色在线观看 | 色福利网站| 成年人视频免费在线 | 91在线影视 | 欧美日比视频 | 不卡精品 | 黄色片毛片 | 中文字幕91视频 | 人人模人人爽 | 日韩精品久久久久久中文字幕8 | www.久久久精品 | 亚洲欧美国内爽妇网 | av黄色在线| 国产精品成人一区二区三区吃奶 | 国产精品久久久久久久久久新婚 | 亚洲欧美日本一区二区三区 | 99re6热在线精品视频 | 美女视频a美女大全免费下载蜜臀 | 午夜av电影院 | 色橹橹欧美在线观看视频高清 | 成人中文字幕av | 成人黄色一级视频 | 日日夜夜网 | 狠狠狠色狠狠色综合 | 亚洲一区二区视频 | 永久免费观看视频 | 国产剧情一区二区在线观看 | 黄色a在线 | 极品嫩模被强到高潮呻吟91 | 欧美999| 中文资源在线官网 | 深夜精品福利 | 欧美日韩久久不卡 | www.福利视频 | 日本黄网站 | 综合色在线观看 | 人人人爽 | 四虎永久精品在线 | 欧美另类v | 在线亚洲午夜片av大片 | 夜夜操夜夜干 | 天天操夜夜操天天射 | 国产又粗又猛又爽又黄的视频先 | 一区二区三区在线观看免费视频 | 日韩精品一区二区三区在线视频 | 1000部18岁以下禁看视频 | 久久久免费高清视频 | 日韩高清久久 | 久久毛片视频 | www.五月婷 | 日韩视频欧美视频 | 激情导航 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 狠狠色噜噜狠狠狠狠 | av在线影片 | 亚洲狠狠丁香婷婷综合久久久 | 特级毛片在线免费观看 | 国产破处视频在线播放 | 视频在线99re | 日韩黄色免费 | 国内揄拍国产精品 | 91精品免费在线视频 | 又大又硬又黄又爽视频在线观看 | 婷婷在线不卡 | 国产精品视频永久免费播放 | 在线成人小视频 | 97在线成人 | 亚州av网站 | 99久久日韩精品免费热麻豆美女 | 久久久久女人精品毛片九一 | 久久er99热精品一区二区三区 | 日韩欧美中文 | 在线视频观看国产 | 精品久久综合 | 中文字幕中文字幕中文字幕 | 在线欧美最极品的av | 99视频国产精品免费观看 | 99热精品国产 | 九九在线播放 | 操操操av | 久久精品一二三区 | 日韩理论| 九九热视频在线 | 国产午夜精品免费一区二区三区视频 | 国产黄色视 | 精品福利av | 亚洲综合视频在线播放 | 在线观看成人网 | 国产成人精品一区二三区 | 天天插天天狠天天透 | 免费在线观看成人av | 干av在线| 欧美日韩高清免费 | 91网站免费观看 | 日韩精品最新在线观看 | 久久理论电影网 | 日日爱网站 | 色婷婷激情电影 | 婷婷丁香av| 国产精品第一 | 久久系列| 成+人+色综合 | 久久a v视频 | 美女国内精品自产拍在线播放 | 99久久99久久精品 | 成 人 黄 色 片 在线播放 | 久久精品91视频 | 日本性久久 | 一区二区三区在线免费观看 | 人人爽久久涩噜噜噜网站 | 99久久日韩精品免费热麻豆美女 | 精品美女在线观看 | 欧美一级视频免费看 | www.天堂av | 日韩免费一区 | 亚洲国产成人在线播放 | 91成年人网站 | 国产精品欧美久久久久三级 | 亚洲无在线 | 亚洲精品视频在线观看免费视频 | 99精品欧美一区二区蜜桃免费 | 久久国产成人午夜av影院宅 | 日韩三级中文字幕 | 69国产精品视频 | 日韩中文字幕a | 免费看黄在线 | 九九视频网 | 在线视频黄 | 久久在现 | 亚洲涩综合 | 狠狠精品 | 欧美一级片在线观看视频 | 精品国产一区二区三区久久久蜜臀 | www.777奇米 | 欧美日韩国产综合一区二区 | 亚洲三级网 | 五月导航| 国产高清专区 | 亚洲成人黄 | 午夜少妇av| 久久精品亚洲一区二区三区观看模式 | 日韩av一区二区在线 | 日韩欧美在线免费观看 | 婷婷激情在线 | a午夜电影| 欧美色综合天天久久综合精品 | 欧美日韩有码 | 亚洲视频456| 天天色棕合合合合合合 | 天天拍天天操 | 日韩国产欧美在线视频 | 综合色狠狠 | 亚洲黄色免费 | 久久99精品久久只有精品 | 狠狠狠狠狠狠狠干 | 在线观看91视频 | 色的网站在线观看 | 国产伦理一区二区三区 | 国色天香第二季 | 国产精品v欧美精品v日韩 | 最新av在线网址 | av在线电影免费观看 | 欧美色图亚洲图片 | 日本99精品 | 国产精品视频 | 成人免费视频网站 | 天天操婷婷 | 91麻豆视频 | 天天操天天干天天操天天干 | 色视频网址 | 亚洲精品黄网站 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品欧美久久久久三级 | www.狠狠插.com | 超碰电影在线观看 | 国产伦精品一区二区三区… | 国产综合视频在线观看 | 国产精品99在线观看 | 精品人人人人 | 一二三久久久 | 亚洲尺码电影av久久 | 国产精品一区二区三区电影 | 日本中文字幕免费观看 | 国产一区视频在线播放 | 99国内精品 | 色97在线 | 精品免费久久久久 | 国产精品一区二区久久国产 | 在线观看av小说 | 欧美综合干 | 日日夜夜免费精品视频 | 欧美性做爰猛烈叫床潮 | 成全免费观看视频 | 午夜精品福利一区二区 | 91女子私密保健养生少妇 | 高清国产午夜精品久久久久久 | 久久视频这里有久久精品视频11 | 99精品国产一区二区三区不卡 | 亚州黄色一级 | 韩日av一区二区 | 日韩av网页 | 天天躁日日躁狠狠躁av中文 | 夜夜骑首页 | 久久久精品国产免费观看同学 | 欧美三级免费 | 人人狠狠综合久久亚洲婷 | 中文字幕在线免费97 | 九草在线视频 | 激情视频免费在线观看 | 99视频黄| 国产成人一区二区三区电影 | 看毛片网站 | 97在线视频免费 | 亚洲欧美视频在线播放 | 骄小bbw搡bbbb揉bbbb | 亚洲一区美女视频在线观看免费 | 日日碰狠狠躁久久躁综合网 | 亚洲欧洲精品在线 | 玖玖国产精品视频 | 久久黄色小说视频 | 久久婷亚洲五月一区天天躁 | 天天在线操 | 99在线视频网站 | 美女视频黄是免费的 | 亚洲 欧美 国产 va在线影院 | 激情综合色综合久久 | 国产免费黄色 | 天天激情天天干 | 中文字幕在线免费97 | 高清免费在线视频 | 亚洲午夜精品久久久久久久久 | 91视频91色| 久久99精品久久久久久 | 1024手机在线看| 国产一区二区精品久久91 | 欧美精品成人在线 | 久久人人97超碰精品888 | 日p视频在线观看 | 国产一级二级在线播放 | 久久国产精品免费观看 | 91在线视频精品 | 国产日韩欧美在线观看视频 | 欧美日韩啪啪 | 亚洲一级黄色 | 欧美日韩不卡一区 | 日韩黄色免费电影 | 国产成人久久精品一区二区三区 | 婷婷综合激情 | www激情久久 | 伊人婷婷综合 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久综合加勒比 | 国产精品福利一区 | 亚洲精品国偷自产在线91正片 | 成人av日韩| 97精品电影院 | 中文字幕在线播放一区二区 | 中文字幕在线免费看线人 | 在线播放亚洲 | 午夜精品中文字幕 | 在线观看黄网站 | 97色免费视频 | 国产精品人成电影在线观看 | 麻豆免费在线视频 | 欧美日韩精品在线观看 | 人人玩人人添人人澡超碰 | 999久久a精品合区久久久 | 天天综合日 | 国产黄色看片 | a视频在线观看免费 | 久久精品99北条麻妃 | 午夜精品一区二区三区在线视频 | 五月婷婷综合激情网 | 8090yy亚洲精品久久 | 欧美精品v国产精品v日韩精品 | 五月导航 | 亚洲黄色片 | 成人羞羞免费 | 视频成人 | 国产麻豆精品一区 | 久久五月婷婷综合 | 日韩精品无码一区二区三区 | 亚洲国产精品人久久电影 | 久久国产精品99久久人人澡 | 精品久久国产一区 | 亚洲午夜精品久久久久久久久 | 综合色中文 | 日韩久久久久久久久久 | 四虎视频| 亚洲自拍自偷 | 成人影音av | 美女免费视频一区二区 | 999久久久久久久久6666 | 天堂av色婷婷一区二区三区 | 九九导航 | 国产精品xxxx18a99 | 国产一区欧美二区 | 天天爱天天色 | 色视频 在线 | 久久www免费人成看片高清 | 天天天天天天操 | 麻豆视频免费在线播放 | 欧美精品国产精品 | 免费观看一级视频 | 欧美成人精品欧美一级乱 | 国产高清免费观看 | 亚洲涩涩涩涩涩涩 | 91av片| www.夜夜夜 | 一区二区欧美日韩 | 婷婷在线播放 | 91看片成人 | 天天操天天摸天天干 | 91精品爽啪蜜夜国产在线播放 | 超碰97人人在线 | 蜜臀aⅴ国产精品久久久国产 | 四虎影视欧美 | 欧美va天堂在线电影 | 中文字幕在线观看第三页 | 国产免费嫩草影院 | 久久久免费高清视频 | 成人国产亚洲 | 久久电影色 | 91禁在线观看 | 国产精品久久久久久久妇 | 美女网站在线观看 | 黄色片网站av | 久草免费电影 | 亚洲欧美成人在线 | 人人澡人人舔 | 一性一交视频 | 成人国产网站 | 欧美视频国产视频 | 超碰97中文 | 91精品国产高清自在线观看 | 免费国产视频 | 国产免费观看久久黄 | 欧美激情视频一区二区三区 | 日韩欧美国产免费播放 | 久久免费高清视频 | 亚洲国产成人精品久久 | 午夜精品中文字幕 | 久久久人人爽 | 欧美日韩综合在线观看 | 麻豆国产视频 | 99欧美 | 婷婷六月激情 | a特级毛片 | 97在线播放视频 | 婷婷丁香五 | 2021国产精品视频 | 久章草在线 | 国产韩国日本高清视频 | 日韩精品一区二区三区中文字幕 | www.午夜视频 | 国产美女视频一区 | 国产一区二区三区 在线 | 菠萝菠萝在线精品视频 | 久久久久国产精品厨房 | 亚洲精品日韩av | 国内精品亚洲 | 亚洲精品免费在线观看视频 | 欧美日韩一区二区三区在线观看视频 | 五月婷婷在线播放 | 国产一二三四在线视频 | 日本久久久久久久久久久 | 久久热亚洲 | 欧美人牲| 最近2019好看的中文字幕免费 | 99tvdz@gmail.com| 亚洲精品视频在线观看免费视频 | 91久久久国产精品 | 福利一区二区在线 | 99精品久久久久久久久久综合 | 超碰97成人 | 开心激情五月网 | 亚洲2019精品| 91中文字幕 | av动态图片 | 国产91在线免费视频 | 成人在线视频在线观看 | 97精品国产一二三产区 | 亚洲深夜影院 | 国产丝袜网站 | 月下香电影 | 久久免费高清 | 亚洲伊人天堂 | 久久久久影视 | 欧美亚洲精品在线观看 | 97免费在线观看 | 久久久国产精品成人免费 | 亚洲,国产成人av | 国产精品99视频 | 8x成人免费视频 | 97超级碰 | 激情伊人五月天 | av福利在线导航 | 伊人激情网 | 久久久精品欧美 | 欧美一级电影片 | 国产黄色免费 | 欧美日韩一区二区三区不卡 | 麻豆视频www| 欧美另类69|