การเขียนโปรแกรมที่ตอบสนองได้รับความนิยมในหมู่ชุมชนนักพัฒนาและลูกค้าในช่วงไม่กี่ปีที่ผ่านมาเนื่องจากความสามารถในการสร้างแอปพลิเคชันในลักษณะที่ประกาศมากกว่าบังคับให้พวกเขาสร้างแอพพลิเคชั่นที่มีความละเอียดอ่อนและยืดหยุ่นมากขึ้น ความจริงที่ว่า Spring 5 ได้รวมระบบปฏิกิริยาไว้ในกรอบหลักของมันได้แสดงให้เห็นถึงการเปลี่ยนกระบวนทัศน์ไปสู่การเขียนโปรแกรมที่ประกาศ
การเขียนโปรแกรมที่ตอบสนองจะจัดการข้อมูลแบบอะซิงโครนัสระหว่างผู้ผลิตข้อมูลและผู้บริโภคซึ่งจำเป็นต้องตอบสนองต่อข้อมูลอย่างราบรื่น ดังนั้นการเขียนโปรแกรมที่ตอบสนองจึงเป็นแอพพลิเคชั่นที่ราบรื่นซึ่งเป็นแบบอะซิงโครนัสและขับเคลื่อนด้วยเหตุการณ์ซึ่งต้องใช้เธรดจำนวนน้อยเพื่อปรับขนาด
การเขียนโปรแกรมที่ตอบสนองนั้นยากที่จะสร้างสถาปัตยกรรมที่ใช้เธรดเนื่องจากความซับซ้อนสูงที่เกี่ยวข้องกับการขยายตัวของแอปพลิเคชันตามสถานะที่ไม่แน่นอนที่ใช้ร่วมกันเธรดและล็อค
ในบริบทของการเขียนโปรแกรมที่ตอบสนอง“ เมื่อมีข้อมูลในสตรีมทุกอย่างเป็นสตรีมและทำงานอย่างราบรื่น”
นามธรรมระดับสูงและการเขียนโปรแกรมที่ตอบสนองนำไปสู่การอ่านรหัสที่ดีขึ้นดังนั้นนักพัฒนาสามารถมุ่งเน้นไปที่การพึ่งพาซึ่งกันและกันของเหตุการณ์ที่กำหนดตรรกะทางธุรกิจ
ในสภาพแวดล้อมที่เกิดขึ้นพร้อมกันสูงรูปแบบการตอบสนองนั้นเหมาะสำหรับการประมวลผลข้อความซึ่งเป็นกรณีการใช้งานขององค์กรทั่วไป
เนื่องจากลักษณะของการดำเนินการ backpressure วิธีการตอบสนองจึงเหมาะที่สุดในการควบคุมการรับส่งข้อมูลระหว่างผู้ผลิตและผู้บริโภคซึ่งจะช่วยหลีกเลี่ยงการอ่อนเพลียของหน่วยความจำ
สำหรับหนึ่งหรือหลายเธรดงานการผูก IO สามารถดำเนินการแบบอะซิงโครนัสและไม่ปิดกั้นโดยไม่ต้องปิดกั้นเธรดปัจจุบัน
การแจ้งเตือนของระบบย่อยการเชื่อมต่อหลายระบบอาจถูกเรียกใช้ในการโต้ตอบสูงและแอปพลิเคชันแบบเรียลไทม์หรือการดำเนินการ/เหตุการณ์ใด ๆ ซึ่งในกรณีที่การเขียนโปรแกรมตอบสนองสามารถจัดการได้อย่างมีประสิทธิภาพมากขึ้น
"Response Flow" กำหนดข้อกำหนด API ที่มีชุดอินเทอร์เฟซน้อยที่สุดที่เปิดเผยวิธีการสำหรับการกำหนดการดำเนินการและเอนทิตีของสตรีมข้อมูลที่ไม่ปิดกั้น backpressure
ด้วยการแนะนำแรงดันย้อนกลับโฟลว์การตอบสนองช่วยให้ผู้ใช้สามารถควบคุมอัตราแลกเปลี่ยนข้อมูลจากผู้เผยแพร่
การตอบสนองสตรีมมิ่ง api java.util.concurrent.flow ได้กลายเป็นส่วนหนึ่งของ Java 9 อย่างเป็นทางการ
สตรีมตอบสนองส่วนใหญ่จะใช้เป็นเลเยอร์การทำงานร่วมกัน
ทั้งโมดูล Spring-Web-reactive และ Spring MVC รองรับการเขียนโปรแกรม @Controller เดียวกัน แต่ Spring-Web-reactive ดำเนินการทั้งในเครื่องยนต์ที่มีปฏิกิริยาและไม่ปิดกั้น
ติดตามเอกสารนี้ดู:
http://docs.spring.io/spring-framework/docs/5.0.0.build-snapshot/spring-framework-reference/html/web-reactive.html
โมดูลสปริง-ไวบปฏิกิริยาและสปริง MVC แบ่งปันอัลกอริทึมทั่วไปจำนวนมาก แต่โมดูลสปริง-ไวบปฏิกิริยาได้นิยามสัญญา MVC ฤดูใบไม้ผลิจำนวนมากเช่น Handlermapping และ HandlerAdapter
นอกเหนือจาก RestTemplate ที่มีอยู่แล้วเว็บไซต์ที่ตอบสนองใหม่ยังได้รับการแนะนำในฤดูใบไม้ผลิ 5
ไคลเอนต์ HTTP ที่สนับสนุนการเขียนโปรแกรมที่ตอบสนอง (เช่นเครื่องปฏิกรณ์, Netty, undertow) ได้นำชุดของไคลเอนต์ที่ตอบสนองต่อการตอบสนองและไคลเอนต์ httpresponse abstractions ที่เปิดเผยการร้องขอและการตอบสนอง
Framework Spring 5 แนะนำเครื่องปฏิกรณ์เป็นการดำเนินการตามข้อกำหนดของสสตรีมปฏิกิริยา
เครื่องปฏิกรณ์เป็นไลบรารีปฏิกิริยารุ่นต่อไปสำหรับการสร้างแอปพลิเคชันที่ไม่ปิดกั้นบน JVM
เครื่องปฏิกรณ์ขยายสัญญาผู้เผยแพร่สตรีมปฏิกิริยาพื้นฐานและกำหนดประเภทฟลักซ์และโมโน API เพื่อให้การดำเนินการประกาศสำหรับลำดับข้อมูลของ 0..N และ 0..1 ตามลำดับ
Spring Web Reactive ใช้ Servlet 3.1 เพื่อให้ I/O ที่ไม่ปิดกั้นและทำงานบนคอนเทนเนอร์ Servlet 3.1
Spring WebFlux เสนอแบบจำลองการเขียนโปรแกรมสองแบบให้เลือก
Spring 5 รวมถึง Spring Web Reactive (ภายใต้โมดูล Spring-Web-Reactive) และ Spring Web MVC (ภายใต้โมดูล Spring-WebMVC)
แม้ว่าสปริงเว็บปฏิกิริยาและโมดูลสปริงเว็บ MVC จะแชร์อัลกอริทึมจำนวนมากเนื่องจากสปริงเว็บปฏิกิริยาสามารถทำงานบนสตรีมปฏิกิริยาที่ไม่ปิดกั้นที่ตอบสนองได้
การดำเนินการของสปริง MVC ต้องใช้คอนเทนเนอร์ Servlet ในขณะที่ Spring Web Reactive ยังสามารถทำงานบนรันไทม์ที่ไม่ได้รับบริการเช่นบน Netty และ Undertow
หากคุณต้องการใช้เว็บสแต็กที่ไม่ปิดกั้นกับเฟรมเวิร์กเว็บที่มีน้ำหนักเบาและใช้งานได้และใช้กับ Java 8 Lambda หรือ Kotlin คุณควรพิจารณาเปลี่ยนจากแอปพลิเคชัน Spring MVC เป็น Spring Web Reactive
นี่คือ pom.xml เวอร์ชัน 2.0.0 M5 ที่อาศัย WebFiux
<carent> <scriall> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Parent </artifactid> <version> 2.0.0.M5 </SentIC <ArtIfactId> Spring-Boot-Starter-Webflux </artifactId> </dermentrency> </pendencies>
วิธีการดั้งเดิมกับวิธีการตอบสนอง
ในวิธีการดั้งเดิมการดำเนินการจะถูกบล็อกและจะรอจนกว่าการดำเนินการบริการของคุณจะเสร็จสมบูรณ์ ในรหัสต่อไปนี้หลังจากคำสั่งการพิมพ์ครั้งแรกการดำเนินการโปรแกรมจะถูกบล็อกและรอให้การดำเนินการบริการเสร็จสมบูรณ์ หลังจากการดำเนินการบริการเสร็จสิ้นการดำเนินการโปรแกรมจะกลับมาทำงานต่อและคำสั่งการพิมพ์ครั้งที่สองจะถูกดำเนินการ
@getMapping ("/ดั้งเดิม") รายการสาธารณะ <Product> getAllProducts () {system.out.println ("เริ่มต้นแบบดั้งเดิม"); รายการ <ductions> products = producerservice.getProducts ("ดั้งเดิม"); System.out.println ("วิธีดั้งเดิมเสร็จสมบูรณ์"); ส่งคืนสินค้า;}ในวิธีการตอบสนองการดำเนินการโปรแกรมจะดำเนินต่อไปโดยไม่ต้องรอให้เสร็จสิ้นการดำเนินการบริการ ในรหัสต่อไปนี้หลังจากคำสั่งการพิมพ์ครั้งแรกคำสั่งการพิมพ์ครั้งที่สองจะถูกดำเนินการในลักษณะที่ไม่ปิดกั้นโดยไม่ต้องรอการดำเนินการบริการให้เสร็จสมบูรณ์ สตรีมฟลักซ์จะถูกเติมด้วยความพร้อมใช้งานของข้อมูลผลิตภัณฑ์
@getMapping (value = "/reactive", .text_event_stream_value) ฟลักซ์สาธารณะ <ผลิตภัณฑ์> getall () {system.out.println ("วิธีปฏิกิริยาโดยใช้ฟลักซ์เริ่มต้น"); Flux <ductions> fluxproducts = prodservice.getProductSstream ("Flux"); System.out.println ("วิธีปฏิกิริยาโดยใช้ฟลักซ์เสร็จสิ้น"); ส่งคืน fluxproducts;}นอกเหนือจาก RestTemplate ที่มีอยู่แล้ว Spring 5 ยังแนะนำ WebClient Reactive
clienthttprequest และ clienthttpresponse abstractions เปิดเผยการร้องขอและการตอบสนองโดยใช้ฟลักซ์ <Tatabuffer> และให้การสนับสนุน backpressure เต็มรูปแบบทั้งในด้านการอ่านและการเขียน
ตัวเข้ารหัสและตัวถอดรหัส abstractions จาก Spring Core ยังใช้ทางด้านไคลเอนต์เพื่อทำให้เป็นอนุกรมหรือส่ง flus endian ไปยังวัตถุประเภท
นี่คือตัวอย่างของ webclient ปฏิกิริยาที่เรียกเทอร์มินัลและรับและประมวลผลวัตถุฟลักซ์สตรีมปฏิกิริยา
@getMapping ("/accounts/{id}/การแจ้งเตือน") ฟลักซ์สาธารณะ <Alert> getAccountalerts (@PathVariable Long ID) {WebClient WebClient = WebClient ใหม่ (ใหม่ ReactorClientHttpConnector ()); ส่งคืน this.repository.getAccount (id) .flatmap (บัญชี -> webclient.perform (รับ ("/การแจ้งเตือน/{key}", get.getKey ())). Extract (bodystream (alert.class)));ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น