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

是時候閉環Java應用了

開發 開發工具
今天的文章只關注閉環Java應用帶來的好處。首先介紹下應該如何部署應用,然后介紹下什么是閉環Java應用,它的好處和如何搭建。

[[177168]]

你曾經因為部署/上線而痛苦嗎?你曾經因為要去運維那改配置而煩惱嗎?在我接觸過的一些部署/上線方式中,曾碰到過以下一些問題:

1、程序代碼和依賴都是人工上傳到服務器,不是通過工具進行部署和發布;

2、目錄結構沒有規范,jar啟動時通過-classpath任意指定;

3、fat jar,把程序代碼、配置文件和依賴jar都打包到一個jar中,改配置文件太費勁;

4、不管是非web應用還是web應用都部署到web容器環境,如Tomcat;

5、web應用還需要先在服務器上安裝好環境(如裝Tomcat)才能部署,想升級版本或者換個容器太難了;

6、線上參數修改還需要找運維,痛苦。

還有如沒有自動部署平臺,回滾到上一個版本那可真是天方夜談;增量包而非全量包,無法自由在在的回滾;前端代碼直接覆蓋而非版本化,難快速回滾,出問題要清理CDN,痛苦;ngx_lua項目時不按照項目的方式部署,在服務器上隨意修改代碼,導致某些服務器忘記修改或者版本不一致,排查問題太痛苦。

還有很多部署中不好的方式,但是本文只關注閉環Java應用帶來的好處。首先介紹下應該如何部署應用,然后介紹下什么是閉環Java應用,它的好處和如何搭建。

應該如何部署應用

應該如何部署應用

項目

項目中應該包括了所有要執行的代碼、啟停腳本,比如非web應用

部署應用項目

web應用

部署應用項目web應用

打包應用后,會按照相應的目錄結構構建。如果項目使用maven,可以使用maven-assembly-plugin進行按照相應的目錄結構構件。

即項目、打包的應用要按照統一的風格來實施。

自動部署系統

自動部署系統負責打包應用(比如執行mvn相應的命令即可)、抽包(從指定目錄抽取要部署的代碼,如target/nonweb-example-package目錄)、部署代碼(發布代碼,將代碼同步到宿主機器)、啟停應用(配置指定的啟停腳本并調用)。

自動部署除了這些功能外,應該還有如發布歷史管理(回滾)、分組管理(如不同機房不同的配置文件)、配置管理(如要修改啟動/停止腳本、修改配置文件[不同機房不同的配置]、參數管理[如jvm參數等])等。

宿主機器

即代碼部署到的機器,它應該只安裝最小化環境,如只需要裝JDK即可,像Tomcat是不需要安裝的,由應用決定使用哪個容器。

通過增加自動部署系統可以更好的進行項目的統一發布、管理和回滾。

閉環Java應用

閉環Java應用指Java代碼、容器、配置文件、啟停腳本等都在同一處維護,修改配置文件、修改環境參數、更改容器類型等都不需要到宿主機器上進行更改。宿主機器只提供基本運行環境,如僅部署JDK環境即可,不需要部署如Tomcat容器,需要什么容器,都是在Java應用中指定。

這樣的好處是配置文件修改、JVM參數修改、容器的選擇都可以在Java應用中配置,形成閉環。

閉環Java應用的目的主要是讓Java應用能自啟動,這樣程序的控制權就在我們手里,而不是運維手里。而我們更懂我們的程序。

隨著微服務概念的流行,spring boot也受到大家的熱捧。spring boot能幫助我們快速構建基于spring的應用;其能方便創建自啟動應用、可以嵌入各種容器(如Tomcat、Jetty)、提供了一些starter pom用于簡化配置文件、自動化配置(只需要引入相關的pom,就自動獲得了某些功能)等。

在介紹spring boot之前,我們看下在以前是怎么構建閉環Java應用。

從零構建非web應用

項目結構

從零構建非web應用 項目結構

本示例演示了構建一個非web應用RPC服務生產者(如Dubbo服務),還可以構建如Worker類型的應用,他們本身不需要web容器,作為普通的java應用啟動即可。

maven依賴(pom.xml)

需要自己添加如spring-core、spring-context等相關依賴,此處就不展示了。

打包配置(pom.xml)

nonweb-example\pom.xml

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-assembly-plugin</artifactId> 
  4.     <version>2.6</version> 
  5.     <configuration> 
  6.         <descriptor>src/assembly/assembly.xml</descriptor> 
  7.         <finalName>${project.build.finalName}</finalName> 
  8.     </configuration> 
  9.     <executions> 
  10.         <execution> 
  11.             <phase>package</phase> 
  12.             <goals> 
  13.                 <goal>directory</goal> 
  14.             </goals> 
  15.         </execution> 
  16.     </executions> 
  17. </plugin> 

使用maven-assembly-plugin進行打包;打包配置如下:

  1. <id>package</id> 
  2. <formats> 
  3.     <format>dir</format> 
  4. </formats> 
  5. <includeBaseDirectory>false</includeBaseDirectory> 
  6. <fileSets> 
  7.     <!-- 可執行文件 --> 
  8.     <fileSet> 
  9.         <directory>src/bin</directory> 
  10.         <outputDirectory>bin</outputDirectory> 
  11.         <includes> 
  12.             <include>*.bat</include> 
  13.         </includes> 
  14.         <lineEnding>dos</lineEnding> 
  15.     </fileSet> 
  16.     <fileSet> 
  17.         <directory>src/bin</directory> 
  18.         <outputDirectory>bin</outputDirectory> 
  19.         <includes> 
  20.             <include>*.sh</include> 
  21.         </includes> 
  22.         <lineEnding>unix</lineEnding> 
  23.         <fileMode>0755</fileMode> 
  24.     </fileSet> 
  25.     <!-- classes --> 
  26.     <fileSet> 
  27.         <directory>${project.build.directory}/classes</directory> 
  28.         <outputDirectory>classes</outputDirectory> 
  29.     </fileSet> 
  30. </fileSets> 
  31. <!-- 依賴jar包 --> 
  32. <dependencySets> 
  33.     <dependencySet> 
  34.         <outputDirectory>lib</outputDirectory> 
  35.         <excludes> 
  36.             <exclude>com.jd:nonweb-example</exclude> 
  37.         </excludes> 
  38.     </dependencySet> 
  39. </dependencySets> 

主要有三組配置:

  • formats:打包格式,此處使用的是dir,還可以是zip、rar等;
  • fileSet:拷貝文件,本示例主要有bin文件、classes文件需要拷貝;
  • dependencySets:依賴jar,拷貝到lib目錄;

執行mvn package后形成了將得到如下結構:

執行mvn package后形成的結構

將該目錄通過自動部署抽包并部署到宿主機器即可。然后自動部署系統執行bin下的啟停腳本執行即可。

啟動類

  1. public class Bootstrap { 
  2.   public static void main(String[] args) throws Exception { 
  3.       ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-config.xml"); 
  4.       ctx.registerShutdownHook(); 
  5.       Thread.currentThread().join(); 
  6.   } 

本示例沒有使用Java Config方式構建,直接加載spring配置文件啟動Java應用。

啟動腳本

  1. #!/bin/sh 
  2. echo ------------------------------------------- 
  3. echo start server 
  4. echo ------------------------------------------- 
  5. # 設置項目代碼路徑 
  6. export CODE_HOME="/export/App/nonweb-example-startup-package" 
  7. #日志路徑 
  8. export LOG_PATH="/export/Logs/nonweb.example.jd.local" 
  9. mkdir -p $LOG_PATH 
  10. # 設置依賴路徑 
  11. export CLASSPATH="$CODE_HOME/classes:$CODE_HOME/lib/*" 
  12. # java可執行文件位置 
  13. export _EXECJAVA="$JAVA_HOME/bin/java" 
  14. # JVM啟動參數 
  15. export JAVA_OPTS="-server -Xms128m -Xmx256m -Xss256k -XX:MaxDirectMemorySize=128m" 
  16. # 啟動類 
  17. export MAIN_CLASS=com.jd.nonweb.example.startup.Bootstrap 
  18.  
  19. $_EXECJAVA $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS & 
  20. tail -f $LOG_PATH/stdout.log 

配置項目代碼路徑、日志路徑、依賴路徑、java執行文件路徑、JVM啟動參數、啟動類。

停止腳本

  1. #日志路徑 
  2. export LOG_PATH="/export/Logs/nonweb.example.jd.local" 
  3. mkdir -p $LOG_PATH 
  4. # 啟動類 
  5. export MAIN_CLASS=com.jd.nonweb.example.startup.Bootstrap 
  6.  
  7. echo ------------------------------------------- 
  8. echo stop server 
  9.  
  10. #所有相關進程 
  11. PIDs=`jps -l | grep $MAIN_CLASS | awk '{print $1}'` 
  12. #停止進程 
  13. if [ -n "$PIDs" ]; then 
  14.   for PID in $PIDs; do 
  15.       kill $PID 
  16.       echo "kill $PID" 
  17.   done 
  18. fi 
  19.  
  20. #等待50秒 
  21. for i in 1 10; do 
  22.   PIDs=`jps -l | grep $MAIN_CLASS | awk '{print $1}'` 
  23.   if [ ! -n "$PIDs" ]; then 
  24.     echo "stop server success" 
  25.     echo ------------------------------------------- 
  26.     break 
  27.   fi 
  28.   echo "sleep 5s" 
  29.   sleep 5 
  30. done 
  31.  
  32. #如果等待50秒還沒有停止完,直接殺掉 
  33. PIDs=`jps -l | grep $MAIN_CLASS | awk '{print $1}'` 
  34. if [ -n "$PIDs" ]; then 
  35.   for PID in $PIDs; do 
  36.       kill -9 $PID 
  37.       echo "kill -9 $PID" 
  38.   done 
  39. fi 
  40. tail -fn200 $LOG_PATH/stdout.log 

到此一個閉環非web應用就構建完了,啟停腳本、啟動類、項目代碼都是統一在一處維護,并使用maven-assembly-plugin將這些打包在一起,通過自動部署發布并執行,達到了閉環的目的。

從零構建web應用

項目結構

從零構建web應用 項目結構

maven依賴(pom.xml)

需要自己添加如spring-core、spring-context、spring-web、spring-webmvc、velocity等相關依賴,此處就不展示了。

打包配置(pom.xml)

web-example\pom.xml

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-assembly-plugin</artifactId> 
  4.     <version>2.6</version> 
  5.     <configuration> 
  6.         <descriptor>src/assembly/assembly.xml</descriptor> 
  7.         <finalName>${project.build.finalName}</finalName> 
  8.     </configuration> 
  9.     <executions> 
  10.         <execution> 
  11.             <phase>package</phase> 
  12.             <goals> 
  13.                 <goal>directory</goal> 
  14.             </goals> 
  15.         </execution> 
  16.     </executions> 
  17. </plugin> 

使用maven-assembly-plugin進行打包;打包配置如下:

  1. <id>package</id> 
  2. <formats> 
  3.     <format>dir</format> 
  4. </formats> 
  5. <includeBaseDirectory>false</includeBaseDirectory> 
  6. <fileSets> 
  7.     <fileSet> 
  8.         <directory>src/bin</directory> 
  9.         <outputDirectory>bin</outputDirectory> 
  10.         <includes> 
  11.             <include>*.sh</include> 
  12.         </includes> 
  13.         <lineEnding>unix</lineEnding> 
  14.         <fileMode>0755</fileMode> 
  15.     </fileSet> 
  16.     <!-- WEB-INF --> 
  17.     <fileSet> 
  18.         <directory>src/main/webapp</directory> 
  19.         <outputDirectory></outputDirectory> 
  20.     </fileSet> 
  21.     <!-- classes --> 
  22.     <fileSet> 
  23.         <directory>${project.build.directory}/classes</directory> 
  24.         <outputDirectory>WEB-INF/classes</outputDirectory> 
  25.     </fileSet> 
  26.  
  27. </fileSets> 
  28. <!-- 依賴jar包 --> 
  29. <dependencySets> 
  30.     <dependencySet> 
  31.         <outputDirectory>WEB-INF/lib</outputDirectory> 
  32.         <excludes> 
  33.             <exclude>com.jd:web-example</exclude> 
  34.         </excludes> 
  35.     </dependencySet> 
  36. </dependencySets> 

 

 

 

主要有三組配置:

  • formats:打包格式,此處使用的是dir,還可以是zip、rar等;
  • fileSet:拷貝文件,本示例主要有bin文件、classes文件、webapp文件需要拷貝;
  • dependencySets:依賴jar,拷貝到WEB-INF\lib目錄;

執行mvn package后形成了將得到如下結構:

執行mvn package后形成的結構

打包的目錄結構和普通web結構完全一樣;將該目錄通過自動部署抽包并發布到宿主機器即可。然后自動部署系統執行bin下的啟停腳本執行即可。

啟動類

  1. public class TomcatBootstrap { 
  2.   private static final Logger LOG = LoggerFactory.getLogger(TomcatBootstrap.class); 
  3.   public static void main(String[] args) throws Exception{ 
  4.     //提升性能(https://wiki.apache.org/tomcat/HowTo/FasterStartUp) 
  5.     System.setProperty("tomcat.util.scan.StandardJarScanFilter.jarsToSkip", "*.jar"); 
  6.     //System.setProperty("securerandom.source","file:/dev/./urandom"); 
  7.     int port =Integer.parseInt(System.getProperty("server.port", "8080")); 
  8.     String contextPath = System.getProperty("server.contextPath", ""); 
  9.     String docBase = System.getProperty("server.docBase", getDefaultDocBase()); 
  10.     LOG.info("server port : {}, context path : {},doc base : {}",port, contextPath, docBase); 
  11.     Tomcat tomcat = createTomcat(port,contextPath, docBase); 
  12.     tomcat.start(); 
  13.      Runtime.getRuntime().addShutdownHook(new Thread() { 
  14.         @Override 
  15.         public void run(){ 
  16.             try { 
  17.                 tomcat.stop(); 
  18.             } catch (LifecycleException e) { 
  19.                 LOG.error("stoptomcat error.", e); 
  20.             } 
  21.         } 
  22.     }); 
  23.     tomcat.getServer().await(); 
  24.   } 
  25.  
  26.   private static String getDefaultDocBase() { 
  27.    File classpathDir = new File(Thread.currentThread().getContextClassLoader().getResource(".").getFile()); 
  28.    File projectDir =classpathDir.getParentFile().getParentFile(); 
  29.    return new File(projectDir,"src/main/webapp").getPath(); 
  30.   } 
  31.  private static Tomcat createTomcat(int port,String contextPath, String docBase) throws Exception{ 
  32.     String tmpdir = System.getProperty("java.io.tmpdir"); 
  33.     Tomcat tomcat = new Tomcat(); 
  34.     tomcat.setBaseDir(tmpdir); 
  35.     tomcat.getHost().setAppBase(tmpdir); 
  36.     tomcat.getHost().setAutoDeploy(false); 
  37.     tomcat.getHost().setDeployOnStartup(false); 
  38.     tomcat.getEngine().setBackgroundProcessorDelay(-1); 
  39.     tomcat.setConnector(newNioConnector()); 
  40.     tomcat.getConnector().setPort(port); 
  41.     tomcat.getService().addConnector(tomcat.getConnector());  
  42.     Context context =tomcat.addWebapp(contextPath, docBase); 
  43.     StandardServer server =(StandardServer) tomcat.getServer(); 
  44.     //APR library loader. Documentation at /docs/apr.html 
  45.     server.addLifecycleListener(new AprLifecycleListener()); 
  46.     //Prevent memory leaks due to use of particularjava/javax APIs 
  47.     server.addLifecycleListener(new JreMemoryLeakPreventionListener()); 
  48.     return tomcat; 
  49.   } 
  50.  
  51.   //在這里調整參數優化 
  52.   private static Connector newNioConnector() { 
  53.     Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
  54.     Http11NioProtocol protocol =(Http11NioProtocol) connector.getProtocolHandler(); 
  55.     return connector; 
  56.   } 
  57.  

通過嵌入Tomcat容器啟動,這種方式的確定是需要先寫Tomcat的啟動代碼,優點也很明顯:以后Tomcat的控制權在我們手中,可以隨時進行切換或者優化,不需要改線上的配置文件。

啟動腳本

  1. #!/bin/sh 
  2. echo ------------------------------------------- 
  3. echo start server 
  4. echo ------------------------------------------- 
  5. # 設置項目代碼路徑 
  6. export CODE_HOME="/export/App/web-example-web-package" 
  7. #日志路徑 
  8. export LOG_PATH="/export/Logs/web.example.jd.local" 
  9. mkdir -p $LOG_PATH 
  10. # 設置依賴路徑 
  11. export CLASSPATH="$CODE_HOME/WEB-INF/classes:$CODE_HOME/WEB-INF/lib/*" 
  12. # java可執行文件位置 
  13. export _EXECJAVA="$JAVA_HOME/bin/java" 
  14. # JVM啟動參數 
  15. export JAVA_OPTS="-server -Xms128m -Xmx256m -Xss256k-XX:MaxDirectMemorySize=128m" 
  16. # 服務端端口、上下文、項目根配置 
  17. export SERVER_INFO="-Dserver.port=8090 -Dserver.contextPath=-Dserver.docBase=$CODE_HOME" 
  18. # 啟動類 
  19. export MAIN_CLASS=com.jd.web.example.startup.TomcatBootstrap 
  20.  
  21. $_EXECJAVA $JAVA_OPTS -classpath $CLASSPATH $SERVER_INFO $MAIN_CLASS & 
  22. tail -f $LOG_PATH/stdout.log 

配置項目代碼路徑、日志路徑、依賴路徑、java執行文件路徑、JVM啟動參數、啟動類;相當于非web應用,多了web服務器端口、上下文、項目根路徑配置。

停止腳本

和非web的類似就不再重復了。

到此一個閉環web應用就構建完了,啟停腳本、啟動類、項目代碼都是統一在一處維護,并使用maven-assembly-plugin將這些打包在一起,通過自動部署發布并執行。達到了閉環的目的。

Spring Boot構建非web/web應用

項目結構

Spring Boot構建非web/web應用  項目結構

maven依賴(pom.xml)

spring-boot-example/pom.xml繼承spring-boot-starter-parent

  1. <parent> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-parent</artifactId> 
  4.     <version>1.4.1.BUILD-SNAPSHOT</version> 
  5. </parent> 

spring-boot-starter-parent中是一些通用配置,如JDK編碼、依賴管理(它又繼承了spring-boot-dependencies,這里邊定義了所有依賴);

依賴

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>org.springframework.boot</groupId> 
  7.     <artifactId>spring-boot-starter-web</artifactId> 
  8. </dependency> 
  9. <dependency> 
  10.     <groupId>org.springframework.boot</groupId> 
  11.     <artifactId>spring-boot-starter-velocity</artifactId> 
  12. </dependency> 
  13. <dependency> 
  14.     <groupId>org.springframework.boot</groupId> 
  15.     <artifactId>spring-boot-starter-log4j2</artifactId> 
  16. </dependency> 

spring-boot-starter是最小化的spring boot環境(spring-core、spring-context等);spring-boot-starter-web是spring mvc環境,并使用Tomcat作為web容器;spring-boot-starter-velocity將自動將模板引擎配置為velocity。此處可以看到starter的好處了,需要什么功能只需要引入一個starter,相關的依賴自動添加,而且會自動配置使用該特性。

打包配置(pom.xml)

spring-boot-example-web\pom.xml添加如下maven插件:

  1. <plugin> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-maven-plugin</artifactId> 
  4. </plugin> 

執行mvn package時將得到如下fat jar:

執行mvn package時將得到如下fat jar

啟動類

  1. package com.jd.springboot.example.web.startup; 
  2. import org.springframework.boot.SpringApplication; 
  3. import org.springframework.boot.autoconfigure.SpringBootApplication; 
  4. import org.springframework.context.annotation.ImportResource; 
  5. @SpringBootApplication(scanBasePackages = "com.jd.springboot.example"
  6. @ImportResource("classpath:spring-config.xml") 
  7. public class Bootstrap { 
  8.   public static void main(String[] args) { 
  9.       SpringApplication.run(Bootstrap.class, args); 
  10.   } 

@SpringBootApplication指定了要掃描的包、可以使用@ImportResource引入xml配置文件。然后可以直接作為普通java應用啟動即可,此時自動使用tomcat作為web容器啟動。

運行 jar -jar spring-boot-example-1.0-SNAPSHOT.jar即可啟動(META-INF\MANIFEST.MF指定了Main-Class)。

個人不太喜歡fat jar的方式。可以使用maven-assembly-plugin配合來打包Java應用。項目結構如下所示:

使用maven-assembly-plugin配合來打包Java應用

項目結構和之前的區別是多了assembly和bin。

打包配置(pom.xml)

spring-boot-example-web\pom.xml將如下maven插件

  1. <plugin> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-maven-plugin</artifactId> 
  4. </plugin> 

更改為assembly插件

  1. <plugin> 
  2.     <groupId>org.apache.maven.plugins</groupId> 
  3.     <artifactId>maven-assembly-plugin</artifactId> 
  4.     <version>2.6</version> 
  5.     <configuration> 
  6.         <descriptor>src/assembly/assembly.xml</descriptor> 
  7.         <finalName>${project.build.finalName}</finalName> 
  8.     </configuration> 
  9.     <executions> 
  10.         <execution> 
  11.             <phase>package</phase> 
  12.             <goals> 
  13.                 <goal>directory</goal> 
  14.             </goals> 
  15.         </execution> 
  16.     </executions> 
  17. </plugin> 

assembly.xml和“從零構建非web應用”的類似,就不貼配置了。

執行mvn package時將得到如下打包:

執行mvn package時得到的打包

啟停腳本也是類似的,在此也不貼配置了。到此基于spring boot的非fat jar方式的自啟動Java應用就構建好了。

總結

從零構建非web應用/web應用需要我們查找相關依賴并配置,還需要進行一些配置(Spring配置、容器配置),如果構建一個新的項目還是相對較慢的,但是在公司內大家應該都有自己的“starter pom”,因此實際構建也不會很慢。而如果沒有一些項目的積累,使用spring boot可以非常容易而且快速的就能搭建出想要的項目。使用spring boot后:容易添加依賴、啟動類不用自己創建、享受到自動配置的好處等;而自帶的spring-boot-maven-plugin會生成fat jar,不過可以配合maven-assembly-plugin來實現之前的方式的。

另外因筆者所在公司使用Docker容器,一個宿主機器只部署一個JVM示例,示例中的啟停腳本不用考慮單機多JVM實例問題。

創建閉環Java應用,可以更容易的進行如JVM參數調優、修改容器配置文件、非web應用不需要部署到Tomcat容器中;這是筆者想進行閉環Java應用的主要目的。

【本文是51CTO專欄作者張開濤的原創文章,作者微信公眾號:開濤的博客( kaitao-1234567)】

責任編輯:趙寧寧 來源: 開濤的博客
相關推薦

2022-10-08 06:49:32

LinuxWindows操作系統

2024-12-06 09:47:13

2021-02-23 10:42:45

AI

2023-05-08 08:03:10

2023-10-19 15:25:40

2023-10-26 21:41:45

云計算企業云基礎

2017-02-17 07:46:29

2024-01-02 07:34:38

CentOSLinuxRedhat

2018-08-21 05:12:10

2024-06-05 09:22:43

2017-01-15 18:32:39

Openresty架構性能

2022-01-13 09:58:26

Linux端口命令

2022-02-08 11:31:23

Linux端口命令

2024-05-30 07:37:30

2019-04-08 18:15:38

加密Tutanota應用

2021-07-25 21:36:24

Windows操作系統功能

2025-02-27 14:10:00

模型AI訓練

2020-12-18 06:09:07

Java淺拷貝深拷貝

2016-05-18 14:00:24

2022-09-21 10:54:49

無線Wi-Fi 6
點贊
收藏

51CTO技術棧公眾號

欧美日韩和欧美的一区二区| 91麻豆免费观看| 欧美高清性猛交| 菠萝菠萝蜜网站| 久久夜夜久久| 午夜精品福利在线| 亚洲午夜精品一区二区| 亚洲免费一级片| 琪琪一区二区三区| 久久久久女教师免费一区| 成人免费网站黄| 精品视频在线播放一区二区三区| 天天亚洲美女在线视频| 一区二区不卡视频| 亚洲三区在线播放| 国产成人午夜99999| 日韩av成人在线| 久久精品视频日本| 99久精品视频在线观看视频| 精品视频久久久久久久| 91视频免费入口| 成人1区2区| 欧美色视频日本版| 欧美国产日韩激情| 爆操欧美美女| 中文在线一区二区| 久久日韩精品| 黄色一级大片在线免费看国产一| 美女精品自拍一二三四| 日本成人黄色片| 99久在线精品99re8热| 国产精品v一区二区三区| 中文字幕亚洲色图| 久久婷婷五月综合| 香蕉一区二区| 日韩精品欧美国产精品忘忧草| 日韩不卡的av| 深夜福利一区二区三区| 5月丁香婷婷综合| 天天色综合社区| 欧美日一区二区三区| 疯狂做受xxxx欧美肥白少妇| 人妻无码久久一区二区三区免费 | 久久久久久毛片| 国产福利不卡| 性生活视频软件| 国产成人啪免费观看软件| 国产美女久久精品| 一卡二卡在线观看| 美女网站色91| 国产日韩精品在线| 国产精品羞羞答答在线| 国产一区二区网址| 成人欧美一区二区三区在线湿哒哒| 波多野结衣在线电影| 日本中文字幕一区二区视频 | 久久久国产在线视频| 在线观看日本黄色| 国产精品久久久久无码av| 日韩中文字幕在线播放| 欧美做爰爽爽爽爽爽爽| 欧美高清不卡| 欧美精品九九久久| 天天综合天天干| 男女男精品网站| 91在线观看免费| 亚洲第一视频在线| 91亚洲永久精品| 欧美乱偷一区二区三区在线| 91在线播放网站| 亚洲人成影院在线观看| 欧美这里只有精品| 黄在线观看免费网站ktv| 日韩欧美国产高清91| 日本www.色| 精品视频在线观看网站| 精品国产免费人成在线观看| 国产精品无码一区二区三区免费 | 亚洲视频 欧美视频| 日本不卡高清视频| 91丨九色丨国产| 亚洲人在线观看视频| 国产女人aaa级久久久级| 伊人婷婷久久| 9765激情中文在线| 欧美在线|欧美| 永久av免费在线观看| 日本中文字幕在线一区| 中文字幕日韩精品在线观看| 欧美精品色哟哟| 欧美在线综合| 91在线免费看网站| 亚洲 小说区 图片区 都市| 日本一区二区三区视频视频| 欧美xxxx吸乳| 韩国精品主播一区二区在线观看| 欧美日韩色综合| 国产精品一区二区人妻喷水| 欧美精选一区二区三区| 欧美日韩国产999| 亚洲精品一区二区二区| 盗摄精品av一区二区三区| 欧洲高清一区二区| 欧美xxx黑人xxx水蜜桃| 欧美在线不卡视频| 成人手机在线免费视频| 99久久婷婷| 日本精品久久久| 亚洲av无码乱码在线观看性色| 91丨九色丨蝌蚪丨老版| 日本精品福利视频| 成人精品动漫| 精品亚洲永久免费精品| 免费在线视频一区二区| 久久国产精品99精品国产| 国产一区二区三区无遮挡| 欧美日韩在线资源| 色偷偷成人一区二区三区91| 少妇熟女视频一区二区三区| 久久中文字幕av一区二区不卡| 欧美有码在线观看视频| www.xxx国产| 亚洲视频资源在线| 一级在线免费视频| 欧美男同视频网| 欧美专区国产专区| 日韩在线视频免费| 亚洲在线一区二区三区| 色男人天堂av| 香蕉视频国产精品| 91精品视频在线| 91在线播放网站| 欧美午夜精品免费| 欧美人与性囗牲恔配| 亚洲欧美日韩精品一区二区 | 国产精品自拍网| 邻居大乳一区二区三区| 欧美日韩免费在线| 波多野结衣影院| 99精品国产福利在线观看免费| 99久久国产免费免费| 四虎影院观看视频在线观看| 日韩午夜激情免费电影| 放荡的美妇在线播放| 狠狠色丁香久久婷婷综合丁香| 亚洲高清资源综合久久精品| 91超碰碰碰碰久久久久久综合| 亚洲视频在线免费观看| 国产精品自拍第一页| 国产偷国产偷亚洲高清人白洁| 日本黄色三级大片| 成人三级视频| 成人激情视频免费在线| 超碰电影在线播放| 日韩无一区二区| 久久久久久久久久久久久久免费看 | 亚洲专区在线视频| 国产亚av手机在线观看| 精品精品欲导航| 日韩激情在线播放| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲在线黄色| 日本电影一区二区三区| 成人在线网站| 久久夜色精品国产欧美乱| 国产www视频| 亚洲国产成人tv| 亚洲第一页av| 美女脱光内衣内裤视频久久网站 | 亚洲久色影视| 欧美日韩国产三区| 日韩伦理一区二区| 欧美精品激情视频| 理论在线观看| 日韩一区二区在线免费观看| 福利一区二区三区四区| 国产亚洲精品bt天堂精选| 三级一区二区三区| 日韩亚洲国产精品| 五月天久久综合网| 日韩区一区二| 国产成人综合av| 日本色护士高潮视频在线观看| 亚洲精品国偷自产在线99热| 艳妇乳肉豪妇荡乳av无码福利| 日韩美女视频一区二区| 中文在线观看免费视频| 水野朝阳av一区二区三区| 婷婷视频在线播放| 婷婷成人影院| 91亚洲精品一区二区| 午夜影视一区二区三区| 久久国产精品偷| 黄色影院在线播放| 欧美xxxxxxxxx| 亚洲男人天堂网址| 一区二区高清视频在线观看| 国产精品美女高潮无套| 国产99久久久国产精品潘金| 九热视频在线观看| 激情综合久久| 中文字幕一区二区三区四区五区| 亚洲另类av| 福利视频一区二区三区| 成人亚洲综合| 欧美综合一区第一页| dy888亚洲精品一区二区三区| 亚洲欧洲国产精品| 神马久久久久久久久久| 在线电影院国产精品| 日韩欧美在线观看免费| 亚洲国产精品久久艾草纯爱 | 婷婷开心久久网| 91人妻一区二区三区蜜臀| 国产午夜三级一区二区三| 在线免费观看污视频| 国产精品一二三| 香蕉视频999| 日韩成人一级片| 精品无码一区二区三区在线| 欧美三级午夜理伦三级中文幕| 亚洲欧美日韩另类精品一区二区三区| 亚洲传媒在线| 国产亚洲第一区| 51社区在线成人免费视频| 国产自产女人91一区在线观看| 日本精品在线中文字幕| 欧美在线观看一区二区三区| japanese色国产在线看视频| 成人97在线观看视频| 日韩理伦片在线| 最近中文字幕mv在线一区二区三区四区 | 自拍偷拍亚洲色图欧美| 成人影院在线| 午夜欧美一区二区三区免费观看| 国产精品欧美三级在线观看| 欧美精品在线一区| 一本色道久久综合狠狠躁的番外| 国产视色精品亚洲一区二区| 国产精品毛片久久久| 国产精品国产精品| 97视频一区| 国产亚洲欧美一区二区| 欧美变态网站| 国产伦精品一区| 欧美wwwsss9999| 欧美极品一区二区| 精品国产一区二区三区四区 | 欧美影视一区| 青青草原网站在线观看| 欧美日韩视频一区二区三区| japanese在线播放| 在线不卡亚洲| 黄色网页免费在线观看| 亚洲免费中文| 亚洲一二三区av| 精品亚洲国内自在自线福利| 中文字幕剧情在线观看| 国产成人免费视频| 艳妇乳肉亭妇荡乳av| 久久一日本道色综合| 九九热免费在线| 亚洲男同性视频| 国产精品成人av久久| 日韩欧美精品在线观看| 中文字幕日韩国产| 日韩欧美国产1| 亚州视频一区二区三区| 中文字幕亚洲激情| 色操视频在线| 欧洲美女免费图片一区| 久久91视频| 99在线观看视频网站| 欧美亚视频在线中文字幕免费| 蜜桃狠狠色伊人亚洲综合网站| 欧美精品一区二区三区精品| 好吊色视频988gao在线观看| 一道本一区二区| 夜夜夜夜夜夜操| 波多野结衣中文字幕一区二区三区| 免费在线观看你懂的| 中文字幕一区二区三区av| 久久久久国产精品夜夜夜夜夜| 精品久久久久久亚洲精品| 亚洲 小说区 图片区| 精品欧美一区二区在线观看| 奇米影视888狠狠狠777不卡| 精品国产一区二区三区久久狼5月| 性欧美ⅴideo另类hd| 日韩av免费在线观看| 亚洲精品黑牛一区二区三区| 欧美日韩在线播放一区二区| 综合av在线| 国产真人无码作爱视频免费| 国产sm精品调教视频网站| 波多野结衣一本| 亚洲永久精品大片| 狠狠躁夜夜躁人人爽视频| 精品人在线二区三区| 欧洲不卡av| 国产精品7m视频| 国产精品极品国产中出| 一区精品在线| 老牛影视一区二区三区| 黄色激情在线观看| 亚洲欧美怡红院| 中文在线最新版天堂| 日韩av综合中文字幕| 影音先锋在线播放| 国产精品免费在线免费| 日韩美脚连裤袜丝袜在线| 日韩精品一区二区三区四| 日本不卡123| 黑人巨大精品欧美| 亚洲aaa精品| 国产成人毛毛毛片| 俺也去精品视频在线观看| 中文字幕在线直播| 精品国产免费久久久久久尖叫| 亚洲美女视频| 欧美国产日韩另类| 国产精品女同互慰在线看| 亚洲欧美自拍视频| 亚洲精品成人久久久| 秋霞在线视频| 亚洲r级在线观看| 婷婷综合五月| 天天干天天操天天做| 日本一区二区三区四区在线视频 | 精品一区二区三区香蕉蜜桃| japanese中文字幕| 色哟哟国产精品免费观看| 少妇又色又爽又黄的视频| 欧美激情一区二区三级高清视频| 欧美高清一级片| 成年人视频大全| 丁香婷婷综合色啪| 日本午夜小视频| 日韩精品免费综合视频在线播放| 黄色污网站在线观看| 久久久久久久久久久久久久久久av | 久久日韩粉嫩一区二区三区| 国产视频91在线| 日韩精品一区二区三区第95| 日本乱码一区二区三区不卡| 久久福利电影| 日日夜夜一区二区| 久久久久99精品成人| 欧美日韩精品久久久| 黄色的网站在线观看| 亚洲xxxxx性| 午夜精品国产| 你懂得在线视频| 色偷偷久久一区二区三区| 91caoporn在线| 91久久精品国产91性色| 女同性一区二区三区人了人一| 久久av一区二区三| 精品国产老师黑色丝袜高跟鞋| 日韩专区一区二区| 国产精品日韩专区| 最新国产精品久久久| 无码人妻精品一区二区三| 精品久久久久久久久久国产| 国产黄色片在线播放| 国产一区视频在线播放| 欧美特黄视频| 欧美老熟妇乱大交xxxxx| 欧美日韩精品免费| 草莓视频丝瓜在线观看丝瓜18| 久久精品magnetxturnbtih| 日韩高清在线一区| 亚洲不卡在线播放| 亚洲国产精品成人va在线观看| 日韩欧美另类一区二区| 最新视频 - x88av| 91网站黄www| 国产又粗又猛视频| 午夜精品久久久久久久白皮肤| 九九亚洲精品| 日韩精品在线播放视频| 色综合一区二区三区| 久久久久久国产精品免费无遮挡 | 婷婷av一区二区三区| 国产精品久久久久久久久| 欧美a级片一区| 久久久久无码精品国产sm果冻 | 成人在线短视频| 91九色02白丝porn| 爆操欧美美女| 奇米视频888战线精品播放| 国产乱码精品一品二品| 日本久久综合网| 欧美成人午夜视频| 欧美视频网址| 制服丝袜在线第一页| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲国产一区二区在线播放| av资源在线观看免费高清| 国产精品一区在线观看|