ชาวเน็ตหลายคนจะถามฉันเป็นครั้งคราววิธีทดสอบโครงการสปริงบูตวิธีการปรับใช้และมีโซลูชันการปรับใช้ที่ดีในการผลิตหรือไม่? บทความนี้จะแนะนำวิธีการพัฒนา Spring Boot ดีบั๊กบรรจุและในที่สุดก็นำไปผลิตและเปิดตัว
ขั้นตอนการพัฒนา
การทดสอบหน่วย
สิ่งที่สำคัญที่สุดในระหว่างขั้นตอนการพัฒนาคือการทดสอบหน่วย การสนับสนุนการทดสอบหน่วยของ Springboot นั้นสมบูรณ์แบบ
1. เพิ่มแพ็คเกจการทดสอบสปริง-สตาร์เทสต์อ้างอิงไปยังแพ็คเกจ POM
<Effercy> <mergiED> org.springframework.boot </groupId> <ratifactid> การทดสอบสปริง-สตาร์สตาร์เทสต์ </artifactid>
2. การพัฒนาและการทดสอบ
ตัวอย่าง HelloWorld ที่ง่ายที่สุดเป็นตัวอย่างคุณต้องเพิ่ม: @runwith (SpringRunner.class) และ @SpringBoottest Annotations ไปยังหัวคลาสของคลาสทดสอบ เพียงเพิ่ม @Test ที่ด้านบนของวิธีการทดสอบและในที่สุดคลิกขวาที่วิธีการเรียกใช้
@runwith (SpringRunner.class) @springboottestpublic Class ApplicationTests {@Test สาธารณะโมฆะ Hello () {System.out.println ("Hello World"); -ในการใช้งานจริงคุณสามารถฉีดรหัสเลเยอร์ DAO หรือรหัสเลเยอร์บริการตามการใช้งานปกติของโครงการสำหรับการทดสอบและการตรวจสอบ การทดสอบ Spring-Boot-Starter ให้การใช้งานพื้นฐานมากมายและสิ่งที่หายากยิ่งกว่านั้นคือการเพิ่มการสนับสนุนสำหรับการทดสอบเลเยอร์คอนโทรลเลอร์
// ตรวจสอบอย่างง่าย ๆ ว่าชุดผลลัพธ์นั้นถูกต้อง assert.assertequals (3, usermapper.getall (). size ()); // ตรวจสอบชุดผลลัพธ์, assert.asserttrue ("ข้อผิดพลาด, ค่าส่งคืนที่ถูกต้องคือ 200", สถานะ == 200); assert.assertFalse ("ข้อผิดพลาดค่าส่งคืนที่ถูกต้องคือ 200", สถานะ! = 200);MockMVC ได้รับการแนะนำเพื่อสนับสนุนการทดสอบเลเยอร์คอนโทรลเลอร์ ตัวอย่างง่ายๆมีดังนี้:
ชั้นเรียนสาธารณะ hellocontrolerTests {ส่วนตัว mockmvc mvc; // เริ่มต้นการดำเนินการ @Before public void setup () โยนข้อยกเว้น {mvc = mockmvcbuilders.standalonesetup (HelloController ใหม่ ()). build (); } // ตรวจสอบว่าคอนโทรลเลอร์ตอบสนองตามปกติหรือไม่และพิมพ์ผลการส่งคืน @Test โมฆะสาธารณะ Gethello () พ่นข้อยกเว้น {mvc.perform (mockmvcrequestbuilders.get ("/hello") ยอมรับ (mediaType.application_json)) .anddo (mockmvcresulthandlers.print ()) .andreturn (); } // ตรวจสอบว่าคอนโทรลเลอร์ตอบสนองตามปกติหรือไม่และกำหนดว่าผลลัพธ์การส่งคืนนั้นถูกต้อง @Test สาธารณะ public testhello () โยนข้อยกเว้น {mvc.perform (mockmvcrequestbuilders.get ("/hello") ยอมรับ (mediaType.application_json)) .andexpect (content (). สตริง (equalto ("hello"). ยอมรับ (mediaType.Application_json)) .andexpect (สถานะ (). isok ())การทดสอบหน่วยเป็นอุปสรรคแรกในการตรวจสอบรหัสของคุณ คุณควรพัฒนานิสัยการทดสอบหน่วยทุกครั้งที่คุณเขียนส่วนหนึ่งของรหัส อย่ารอจนกว่าพวกเขาทั้งหมดจะรวมกันก่อนการทดสอบ หลังจากการรวมกันมันเป็นเรื่องง่ายที่จะพลาดข้อบกพร่องที่ด้านล่างของรหัสเพราะคุณให้ความสนใจกับเอฟเฟกต์การทำงานโดยรวมมากขึ้น
การทดสอบการรวม
หลังจากการพัฒนาโดยรวมเสร็จสิ้นการทดสอบการรวมจะถูกป้อน ทางเข้าสตาร์ทอัพของโครงการสปริงบูตอยู่ในคลาสแอปพลิเคชัน คุณสามารถเริ่มโครงการได้โดยเรียกใช้วิธีการเรียกใช้โดยตรง อย่างไรก็ตามในระหว่างกระบวนการแก้ไขข้อบกพร่องเราต้องทำการดีบักรหัสอย่างต่อเนื่อง หากคุณต้องการรีสตาร์ทบริการด้วยตนเองทุกครั้งที่มีการแก้ไขรหัสมันจะลำบากมาก Spring Boot ให้การสนับสนุนการปรับใช้ที่ร้อนแรงอย่างมากซึ่งสะดวกมากสำหรับการดีบักและใช้ในโครงการเว็บ
POM จำเป็นต้องเพิ่มการกำหนดค่าต่อไปนี้:
<การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Devtools </artifactid> <plorital> True </onftiveal> </การพึ่งพา> </การพึ่งพา <ARTIFACTID> Spring-Boot-Maven-Plugin </artIfactId> <การกำหนดค่า> <Fork> True </fork> </การกำหนดค่า> </plugin>
หลังจากเพิ่มการกำหนดค่าข้างต้นโครงการสนับสนุนการปรับใช้ HOT ซึ่งสะดวกมากสำหรับการทดสอบการรวม
กำลังผลิตและออนไลน์
ที่จริงแล้วฉันคิดว่าขั้นตอนนี้ควรจะค่อนข้างง่ายและโดยทั่วไปแบ่งออกเป็นสองประเภท: หนึ่งคือการจัดทำมันลงในแพ็คเกจ Jar และดำเนินการโดยตรงและอีกประเภทหนึ่งคือการบรรจุลงในแพ็คเกจสงครามและวางไว้ใต้เซิร์ฟเวอร์ Tomcat
ทำให้เป็นแพ็คเกจขวด
หากคุณใช้ Maven เพื่อจัดการโครงการของคุณให้ดำเนินการคำสั่งต่อไปนี้
โครงการซีดีและไดเรกทอรี (ระดับเดียวกับ pom.xml) MVN Clean Package ## หรือดำเนินการคำสั่งต่อไปนี้ ## เพื่อยกเว้นรหัสทดสอบและแพ็คเกจ MVN Clean Package -dmaven.test.skip = True
หลังจากบรรจุภัณฑ์เสร็จสิ้นแพ็คเกจ JAR จะถูกสร้างขึ้นในไดเรกทอรีเป้าหมาย ชื่อมักจะเป็นชื่อโครงการ + หมายเลขเวอร์ชัน jar
เริ่มต้นคำสั่งแพ็คเกจ JAR
Java -JAR เป้าหมาย/Spring-Boot-Scheduler-1.0.0.jar
ด้วยวิธีนี้ตราบใดที่คอนโซลถูกปิดบริการจะไม่สามารถเข้าถึงได้ มาเริ่มต้นต่อไปนี้ด้วยการรันในพื้นหลัง:
nohup java -jar เป้าหมาย/Spring-Boot-Scheduler-1.0.0.jar &
คุณยังสามารถเลือกอ่านไฟล์การกำหนดค่าที่แตกต่างกันเมื่อเริ่มต้น
java -jar app.jar --spring.profiles.active = dev
คุณยังสามารถตั้งค่าพารามิเตอร์ JVM ได้เมื่อเริ่มต้น
java -xms10m -xmx80m -jar app.jar & gradle
หากคุณกำลังใช้ Gradle ให้ใช้คำสั่งต่อไปนี้เพื่อแพ็คเกจ
gradle buildjava -jar build/libs/mymodule-0.0.1-snapshot.jar
ทำให้เป็นถุงสงคราม
ประเภทแรกสามารถใช้ในการส่งออกแพ็คเกจสงครามผ่านเครื่องมือพัฒนาคราสและประเภทอื่นคือการใช้คำสั่งเพื่อให้เสร็จสมบูรณ์ ที่นี่เราแนะนำส่วนหลังเป็นหลัก
1. โครงการ Maven ปรับเปลี่ยนแพ็คเกจ POM
จะ
<Cackaging> jar </packaging>
เปลี่ยน
<Cackaging> สงคราม </packaging>
2. ไม่รวม Tomcat เมื่อบรรจุภัณฑ์
<การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </artifactid> </derpendency> <การพึ่งพา <cope> ให้ </cope> </dependency>
ที่นี่ตั้งค่าคุณสมบัติขอบเขตให้จัดหาเพื่อให้แพ็คเกจ JAR จะไม่รวมอยู่ในสงครามครั้งสุดท้ายเนื่องจากเซิร์ฟเวอร์เช่น Tomcat หรือ Jetty จะให้คลาส API ที่เกี่ยวข้องที่รันไทม์
3. ลงทะเบียนคลาสเริ่มต้น
สร้าง servletinitializer.java, สืบทอด SpringbootservletInitializer, Override Configure () และลงทะเบียนแอปพลิเคชันคลาสเริ่มต้น เมื่อเซิร์ฟเวอร์เว็บแอปพลิเคชันภายนอกสร้างบริบทของเว็บแอปพลิเคชันคลาสเริ่มต้นจะถูกเพิ่ม
ระดับสาธารณะ servletInitializer ขยาย SpringbootservletInitializer {@Override Protected SpringApplicationBuilder Configure (แอปพลิเคชัน SpringApplicationBuilder) {return application.Sources (Application.class); -การดำเนินการขั้นสุดท้าย
MVN Clean Package -dmaven.test.skip = true
ชื่อโครงการ + เวอร์ชันหมายเลขสงครามจะถูกสร้างขึ้นในไดเรกทอรีเป้าหมายและคัดลอกไปยังเซิร์ฟเวอร์ Tomcat เพื่อเริ่มต้น
ผู้สำเร็จการศึกษา
หากคุณใช้ Gradle ขั้นตอนพื้นฐานจะเหมือนกัน เพิ่มการสนับสนุนสงครามใน build.gradle และไม่รวม Spring-Boot-Starter-Tomcat:
... ใช้ปลั๊กอิน: 'สงคราม' ... การพึ่งพา {คอมไพล์ ("org.springframework.boot: Spring-Boot-Starter-Web: 1.4.2.release") {ยกเว้น mymodule: "Spring-Boot-Starter-Tomcat"ใช้คำสั่ง build อีกครั้ง
Gradle Build
สงครามจะถูกสร้างขึ้นในไดเรกทอรี Build/LIBS
การดำเนินงานและการบำรุงรักษา
ดูค่าของพารามิเตอร์ JVM
คุณสามารถทำตามคำสั่ง jinfo ที่มาพร้อมกับ Java:
jinfo -flags pid
มาดูกันว่า GC ใช้อะไรหลังจากเริ่มขวดมีหน่วยความจำเท่าใดในแบตช์ในรุ่นใหม่และผู้สูงอายุ ตัวอย่างมีดังนี้:
-xx: cicompilerCount = 3 -xx: initialHeapSize = 234881024 -xx: MaxHeapSize = 3743416320 -XX: MaxNewSize = 1247805440 -XX: MINHEAPDELTABYTES = 524288 -XX: 7811 -xx: oldsize = 156762112 -xx:+usecompressedclasspointers -xx:+usecompressedoops -xx:+usefastunorderedtimestamps -xx:+useperallelgc -xx: maximum: maximum: maximum: maximum: maximum JVM -XX: MaxNewSize: ขนาดที่จัดสรรสูงสุดสำหรับหน่วยความจำรุ่นใหม่ในพื้นที่ JVM Heap ... -xx:+USEPRALLEGC: Garbage Collection ใช้ตัวสะสมแบบขนาน
วิธีรีสตาร์ท
เรียบง่ายและหยาบ
ฆ่ากระบวนการโดยตรงและเริ่มต้นแพ็คเกจ JAR อีกครั้ง
ps -ef | grep java ## รับ pidkill สำหรับโปรแกรม java -9 pid ## รีสตาร์ท java อีกครั้ง -jar xxxx.jar
แน่นอนว่าวิธีนี้เป็นแบบดั้งเดิมและรุนแรงมากขึ้นดังนั้นขอแนะนำให้คุณใช้วิธีการต่อไปนี้ในการจัดการ
การดำเนินการสคริปต์
หากคุณใช้ Maven คุณต้องรวมการกำหนดค่าต่อไปนี้
<Plugin> <roupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Maven-Plugin </artifactid> <การกำหนดค่า> <Cenecutable> True </executable>
หากคุณใช้ Gradle คุณต้องรวมการกำหนดค่าต่อไปนี้
Springboot {execute = true}วิธีการเริ่มต้น:
1. คุณสามารถเริ่มต้นโดยตรงใน./yourapp.jar
2. ลงทะเบียนเป็นบริการ
นอกจากนี้คุณยังสามารถสร้างลิงค์ซอฟต์เพื่อชี้ไปที่แพ็คเกจ JAR ของคุณและเพิ่มลงใน init.d จากนั้นเริ่มต้นด้วยคำสั่ง
init.d ตัวอย่าง:
ln -s /var/yourapp/yourapp.jar /etc/init.d/yourappchmod +x /etc/init.d/yourapp
วิธีนี้คุณสามารถใช้คำสั่งหยุดหรือรีสตาร์ทเพื่อจัดการแอปพลิเคชันของคุณ
/etc/init.d/yourapp Start | หยุด | รีสตาร์ท
หรือ
บริการของคุณเริ่มต้น | หยุด | รีสตาร์ท
ณ จุดนี้มีการแนะนำการทดสอบการประสานงานร่วมและบรรจุภัณฑ์ของโครงการ Springboot คุณสามารถหาเวลาในการศึกษาการดำเนินงานอัตโนมัติและการบำรุงรักษา Springboot และการรวมกันของ Springboot และ Docker
รหัสตัวอย่าง - GitHub
ตัวอย่างคลาวด์รหัสโค้ด
สรุป
ข้างต้นเป็นวิธีการทดสอบบรรจุภัณฑ์การทดสอบสปริงและการปรับใช้ที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!