歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos 內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等; 關(guān)于Spring Native
Spring Native到底是什么個人的理解:Spring Native是Spring提供的、制作native image的技術(shù)方案,涉及到以下關(guān)鍵技術(shù):
本篇概覽作為實戰(zhàn)風(fēng)格的文章,本篇主要內(nèi)容是開發(fā)springboot應(yīng)用再構(gòu)建為native image,然后驗證其功能和效果,本文由以下內(nèi)容構(gòu)成:
環(huán)境信息本次實戰(zhàn)相關(guān)的環(huán)境信息如下:
源碼下載
新建名為spring-native-tutorials的maven父工程
<?xml version="1.0" encoding="UTF-8"?>4.0.0webmvcorg.springframework.bootspring-boot-starter-parent2.5.0-SNAPSHOTcom.bolingcavalryspring-native-tutorials1.0-SNAPSHOTpom1.8dmikusa/graalvm-tiny2020.0.2spring-releaseSpring releasehttps://repo./releasefalsespring-milestoneSpring milestonehttps://repo./milestonefalsespring-snapshotSpring Snapshotshttps://repo./snapshotfalsespring-releaseSpring releasehttps://repo./releasefalsespring-milestoneSpring milestonehttps://repo./milestonefalsespring-snapshotSpring Snapshotshttps://repo./snapshotfalseorg.springframework.experimentalspring-native0.10.0-SNAPSHOTorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportorg.springframework.bootspring-boot-maven-plugin${classifier} ${builder}true${native.build.args}IF_NOT_PRESENTorg.springframework.experimentalspring-aot-maven-plugin0.10.0-SNAPSHOTtest-generatetest-generategenerategenerate
新建springboot類型的maven子工程
<?xml version="1.0" encoding="UTF-8"?>spring-native-tutorialscom.bolingcavalry1.0-SNAPSHOT4.0.0webmvcorg.springframework.experimentalspring-nativeorg.springframework.bootspring-boot-starter-weborg.apache.tomcat.embedtomcat-embed-coreorg.apache.tomcat.embedtomcat-embed-websocketorg.apache.tomcat.experimentaltomcat-embed-programmatic${tomcat.version}org.springframework.bootspring-boot-starter-testtestorg.springframework.experimentalspring-aot-maven-plugintrueorg.springframework.bootspring-boot-maven-plugin
package com.bolingcavalry.webmvc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; @SpringBootApplication @RestController public class WebmvcApplication { public static void main(String[] args) { SpringApplication.run(WebmvcApplication.class, args); } @ResponseStatus(HttpStatus.ACCEPTED) @GetMapping("/status") public String status() { return "status"; } @GetMapping("/") public String hello() { return "1. Hello from Spring MVC and Tomcat, " + LocalDateTime.now(); } }
mvn clean -U -DskipTests spring-boot:build-image
... [INFO] Successfully built image 'docker.io/library/webmvc:1.0-SNAPSHOT' [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for spring-native-tutorials 1.0-SNAPSHOT: [INFO] [INFO] spring-native-tutorials ............................ SUCCESS [ 1.786 s] [INFO] webmvc ............................................. SUCCESS [04:19 min] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 04:25 min [INFO] Finished at: 2021-05-22T16:36:44+08:00 [INFO] ------------------------------------------------------------------------ [WARNING] The requested profile "nexus" could not be activated because it does not exist.
(base) zhaoqindeMBP:~ zhaoqin$ docker history webmvc:1.0-SNAPSHOT IMAGE CREATED CREATED BY SIZE COMMENT b8ff54813ae0 41 years ago 69B41 years ago 452kB41 years ago 2.51MB41 years ago 57.2MB41 years ago 1.4MB41 years ago 268B41 years ago 17.3MB
驗證
docker run --rm -p 8080:8080 webmvc:1.0-SNAPSHOT
(base) zhaoqindeMBP:~ zhaoqin$ docker run --rm -p 8080:8080 webmvc:1.0-SNAPSHOT 2021-05-22 09:34:57.578 INFO 1 --- [ main] o.s.nativex.NativeListener : This application is bootstrapped with code generated with Spring AOT . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.5.0-SNAPSHOT) 2021-05-22 09:34:57.586 INFO 1 --- [ main] c.b.webmvc.WebmvcApplication : Starting WebmvcApplication using Java 1.8.0_292 on 3529ec458896 with PID 1 (/workspace/com.bolingcavalry.webmvc.WebmvcApplication started by cnb in /workspace) 2021-05-22 09:34:57.586 INFO 1 --- [ main] c.b.webmvc.WebmvcApplication : No active profile set, falling back to default profiles: default 2021-05-22 09:34:57.661 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) May 22, 2021 9:34:57 AM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-nio-8080"] May 22, 2021 9:34:57 AM org.apache.catalina.core.StandardService startInternal INFO: Starting service [Tomcat] May 22, 2021 9:34:57 AM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet engine: [Apache Tomcat/9.0.46] May 22, 2021 9:34:57 AM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring embedded WebApplicationContext 2021-05-22 09:34:57.669 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 79 ms May 22, 2021 9:34:57 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-nio-8080"] 2021-05-22 09:34:57.713 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2021-05-22 09:34:57.713 INFO 1 --- [ main] c.b.webmvc.WebmvcApplication : Started WebmvcApplication in 0.178 seconds (JVM running for 0.19) 2021-05-22 09:34:57.713 INFO 1 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT 2021-05-22 09:34:57.714 INFO 1 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 6ce6c66fb4de jovial_hertz 0.11% 30.69MiB / 3.844GiB 0.78% 1.49kB / 158B 4.31MB / 0B 18
(base) zhaoqindeMacBook-Pro:~ zhaoqin$ docker run --rm -P docker.io/bolingcavalry/hellojib:0.0.1-SNAPSHOT . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.6.RELEASE) 2021-05-22 11:13:28.121 INFO 1 --- [ main] c.b.hellojib.HellojibApplication : Starting HellojibApplication on ffb32e5b68b9 with PID 1 (/app/classes started by root in /) 2021-05-22 11:13:28.128 INFO 1 --- [ main] c.b.hellojib.HellojibApplication : No active profile set, falling back to default profiles: default 2021-05-22 11:13:30.000 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2021-05-22 11:13:30.054 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2021-05-22 11:13:30.054 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.21] 2021-05-22 11:13:30.241 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2021-05-22 11:13:30.241 INFO 1 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2036 ms 2021-05-22 11:13:30.715 INFO 1 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2021-05-22 11:13:31.103 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2021-05-22 11:13:31.110 INFO 1 --- [ main] c.b.hellojib.HellojibApplication : Started HellojibApplication in 3.618 seconds (JVM running for 4.297) 2021-05-22 11:13:48.866 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2021-05-22 11:13:48.866 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2021-05-22 11:13:48.880 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 14 ms
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS ffb32e5b68b9 eager_williamson 0.64% 356.3MiB / 3.844GiB 9.05% 3.46kB / 2.29kB 0B / 0B 31 6ce6c66fb4de jovial_hertz 0.11% 30.69MiB / 3.844GiB 0.78% 1.49kB / 158B 4.31MB / 0B 18
下載插件失敗在實際操作過程中,經(jīng)常會遇到maven插件或者docker鏡像下載失敗的情況,除了多試幾次,您還可以考慮將項目放到github上去,借助github action在云端完成鏡像構(gòu)建,具體操作請參考《用GitHub Actions制作Docker鏡像》 不用開發(fā),直接體驗
你不孤單,欣宸原創(chuàng)一路相伴 |
|
來自: 冒險的K > 《應(yīng)用文》