โครงสร้างของ RESTful Service พร้อม Java Spring สำหรับผู้เริ่มต้น


12

ฉันค่อนข้างใหม่ในแง่ของทักษะการพัฒนาเว็บ Java ฉันมีโครงการที่ฉันคิดว่าจะทำให้ผู้สมัครที่ดีสำหรับบริการ RESTful จากสิ่งที่ฉันเข้าใจเกี่ยวกับ API น้อย ฉันพยายามที่จะดูรายละเอียดว่ามันควรจะมีโครงสร้างอย่างไร แต่ไม่ได้ไปที่ใดก็ได้ในแง่ของการค้นหาของ google และอ่านเนื้อหาที่ฉันมีอยู่แล้ว ฉันหวังว่าโพสต์นี้จะให้การตรวจสอบและ / หรือการเปลี่ยนเส้นทางในแง่ของความรู้และสมมติฐานของฉันในหัวข้อนี้

ข้อสันนิษฐานปัจจุบันของฉันคือการให้บริการที่สงบของฉันจะมีโครงสร้างดังต่อไปนี้:

  • ข้อมูลฐานข้อมูล (SQL)
  • ORM (ฉันใช้ ORM ที่ค่อนข้างไม่เป็นที่นิยมเรียกว่า CPO แต่สิ่งนี้จะถูกแทนที่ด้วย Hibernate กับคนส่วนใหญ่)
  • คลาสผู้จัดการ Java ด้วยวิธีการที่พูดคุยกับ ORM เพื่อรับข้อมูล
  • คลาสตัวควบคุม Java / คลาสที่จัดการการแมปคำขอและใช้@ResponseBodyเพื่อกำหนด / จัดการ URL และการกระทำของวิธีการจัดการข้อมูลผ่านทางคำกริยา HTTP ( http://mysite.com/computers/dellอาจมีการGETร้องขอด้วยคำว่า "dell" ใน URL เป็นพารามิเตอร์ที่จะส่งคืนอาร์เรย์ของข้อมูล JSON เกี่ยวกับคอมพิวเตอร์เดลล์)
  • บริการนี้ควรทำด้วย Spring Boot หรือสามารถยืนอยู่คนเดียวและเป็นอิสระจากแอปพลิเคชันอื่น

ตอนนี้สมมติว่าข้างต้นถูกต้องแล้วฉันจะมี (ในระดับพื้นฐานมาก) บริการ RESTful ที่แอปพลิเคชันใด ๆ ที่สามารถใช้เพื่อบริโภคและใช้ข้อมูล

ถ้าอย่างนั้นฉันก็มีเว็บแอปพลิเคชันของฉัน สมมติว่าฉันทำเว็บแอปเกี่ยวกับข้อมูลฮาร์ดแวร์คอมพิวเตอร์และฉันใช้ Spring เพื่อสร้างเว็บแอปนี้ นี่คือสมมติฐานของฉัน:

  • ฉันมีมุมมองมากมายในฐานะ JSP โดยที่ JSP มี HTML, CSS และ JavaScript รวมอยู่ด้วย JavaScript จะจัดการการเรียก AJAX ไปยังตัวควบคุมแอปพลิเคชันนี้ได้ตามต้องการ (ด้านล่าง)
  • แอปพลิเคชันเว็บนี้จะมีตัวควบคุมของตัวเองเพื่อจัดการคำขอ URL และการกำหนดเส้นทางของแอปและตัวควบคุมจะใช้พูดModelAndViewวัตถุหรือสิ่งต่าง ๆ ตามบรรทัดเหล่านั้นเพื่อ "พูดคุย" ตัวควบคุมบริการ RESTful รับข้อมูลใด ๆ ส่งข้อมูลนั้นกลับไปที่มุมมอง (Javascript, JSP, ฯลฯ ... ) เพื่อแสดง

ฉันมาถูกทางแล้วใช่ไหม ฉันเข้าใจว่ายังมีแง่มุมการรับรองความถูกต้องสำหรับบริการ RESTful แต่ฉันยังไม่ได้มีแนวคิด (และโครงการของฉันจะถูกใช้ในเครือข่ายส่วนตัวเพื่อความปลอดภัยไม่ได้มีความสำคัญในจุดนี้)

ข้อมูลเชิงลึกวิจารณ์วิจารณ์ความรู้ข้อเสนอแนะหรือคำชี้แจงใด ๆ ที่ชื่นชมอย่างมาก

คำตอบ:


19

นี่เป็นหนึ่งในตัวอย่างโครงสร้างที่ฉันชอบสำหรับแอพที่เหลือในฤดูใบไม้ผลิของคุณ

1. การแยกชั้นแต่ละชั้นเป็นโมดูล / โครงการ

  • REST API
    • บรรจุเป็นสงคราม (อาจเป็นjarหากคุณใช้spring bootกับเซิร์ฟเวอร์ที่ฝังตัว Spring boot doc อธิบายอย่างชัดเจนถึงวิธีการปรับใช้jar uber ที่เรียกว่าเป็นเรื่องง่ายมาก)
    • มีตัวควบคุมส่วนที่เหลือที่จัดการคำขอ / ตอบกลับ
    • ขึ้นอยู่กับโมดูลบริการด้านล่าง
  • บริการ
    • บรรจุเป็นขวด
    • เหตุผลเชิงตรรกะทางธุรกิจเลเยอร์นี้ไม่ทราบวิธีการสื่อสารกับแหล่งข้อมูล
    • มันจะถูกautowiredในตัวควบคุมส่วนที่เหลือ
    • ขึ้นอยู่กับโมดูลDAO / พื้นที่เก็บข้อมูลด้านล่าง
  • DAO / พื้นที่เก็บข้อมูล
    • บรรจุเป็นขวด
    • พูดคุยกับแหล่งข้อมูลโดยตรงมีการดำเนินงานที่รู้จักกันทั่วไปว่าเป็น CRUD มันอาจจะง่าย jdbc, JPA หรือแม้กระทั่งการเข้าถึงไฟล์
    • ขึ้นอยู่กับโมดูลโดเมนด้านล่าง
  • โดเมน
    • บรรจุเป็น ขวด
    • มันมีโมเดลโดเมนของคุณซึ่งโดยปกติจะเป็นคลาส POJO หากคุณใช้ ORM พวกเขาเป็นเอนทิตี ORM
    • มันอาจมี DTO (Data Transfer Object) ซึ่งยังอยู่ภายใต้การโต้วาที ใช้หรือไม่เป็นสายของคุณ
  • คุณสามารถเพิ่มโมดูลเพิ่มเติมเช่นยูทิลิตี้การรวมบุคคลที่สาม ฯลฯ แต่ขอแนะนำให้มี

2. เครื่องมือสร้าง / พึ่งพา (จำเป็นมากสำหรับ IMHO)

มีมากมายของพวกเขาค้นหา google จะแสดงให้คุณ โดยส่วนตัวฉันชอบMavenกับ Spring มันใช้งานได้กับโครงสร้างโครงการข้างต้น
นอกจากนี้โปรดทราบว่าหากคุณใช้ maven จะมีโมดูลหลักที่รวมโมดูลทั้งหมดที่กล่าวถึงในส่วนที่ 1 โมดูลจุด bullet ทั้งหมดยังสอดคล้องกับโมดูล maven ด้วย

3. ความคิดเกี่ยวกับโครงการเฉพาะของคุณ

เนื่องจากคุณใช้ REST ฉันขอแนะนำว่าอย่าใช้ JSP เป็นมุมมองของคุณ คุณสามารถใช้ธรรมดา HTML5 + Javascript หรือกรอบงานยอดนิยมบางอย่างเช่น AngularJS เป็นมุมมองของคุณ
หากคุณยืนยันในการใช้ JSP คุณจะต้องแนะนำwarอื่น(เว็บแอป) ที่มีตัวควบคุมและ JSP ตัวควบคุมจะได้รับข้อมูล (โดยปกติรูปแบบ Json / xml) แล้วแยกวิเคราะห์รุ่นของคุณ (POJO) เพื่อให้ JSP ของคุณสามารถรับได้จากตัวควบคุมของคุณและทำการแสดงผล โพสต์ข้อมูลจาก JSP เป็นสิ่งที่ตรงกันข้ามฉันข้ามที่นี่

มันไม่มีคำแนะนำที่สมบูรณ์เนื่องจากหัวข้อนี้ค่อนข้างใหญ่และขึ้นอยู่กับความต้องการเฉพาะของคุณ แต่คำศัพท์ที่รวมไว้ในที่นี้ก็เพียงพอสำหรับคุณในการทำวิจัยเพิ่มเติม (Google เป็น) หวังว่านี่จะให้แนวคิดบางอย่างเกี่ยวกับวิธีการเข้าถึง


1
โดเมนมักเป็นเลเยอร์ที่มีตรรกะทางธุรกิจ โดเมนมักจะอ้างถึงเป็นเลเยอร์ที่มีบริการ วัตถุโดเมนไม่ได้เป็น POJO ธรรมดาวัตถุโดเมนควรมีตรรกะทางธุรกิจเช่นการตรวจสอบข้อโต้แย้งและ อาจเป็นการดีกว่าถ้าจะเปลี่ยนชื่อเลเยอร์เป็นอย่างอื่น เลเยอร์พื้นที่เก็บข้อมูลมักใช้ในการถ่ายโอนข้อมูลจากหลายแหล่งไปยังวัตถุโดเมนของคุณ
Andy

โมดูลบริการและพื้นที่เก็บข้อมูลจะเป็นโครงการของสปริงด้วยหรือไม่
Glenn Van Schil

1
@GlennVanSchil ไม่ไม่จำเป็นต้องเป็นโครงการสปริง b / c เมื่อสร้างโครงการทั้งหมดแล้ว repo / service layer จะรวมอยู่ใน classpath @Autowireจะทำงานเป็นผล
Minjun Yu

@ MinjunYu ขอบคุณสำหรับคำตอบที่ชัดเจน! แต่ repo / service ของคุณต้องการสปริงเนื่องจากการพึ่งพา Maven สำหรับหมายเหตุประกอบ Service, Repository หรือ Component
Glenn Van Schil

1
@GlennVanSchil หากคุณใส่การพึ่งพา maven ฤดูใบไม้ผลิทั้งหมดใน pom.xml ของโมดูลหลักแล้วไม่จำเป็นต้องเพิ่มการพึ่งพาที่เกี่ยวข้องกับฤดูใบไม้ผลิใด ๆ ในโมดูลย่อย (โมดูล repo / บริการ) นี่เป็นเพียงวิธีหนึ่งในการจัดวางโครงการหลายโมดูลในฤดูใบไม้ผลิ มีวัตถุประสงค์เพื่อจัดระเบียบรหัสของคุณ หากโครงการของคุณไม่ใหญ่มากและจะไม่เปลี่ยนแปลงในอนาคตอันใกล้คุณสามารถรวมโดเมนบริการซื้อคืนบริการในโมดูลเดียวกันที่เรียกว่า "แกน" มันดูสะอาดกว่า
Minjun Yu

2

ในขณะที่เห็นด้วยกับคำตอบส่วนใหญ่จาก @ Minjun.Y ฉันคิดว่าฉันจะใช้แนวทางที่แตกต่างกันเล็กน้อยในเลเยอร์ REST และเว็บเพจ จากการอ่านคำถามของคุณฉันคิดว่าคุณต้องการเปิดเผยทั้งเว็บอินเตอร์เฟสและส่วนต่อประสาน REST กับโลกภายนอก มีน้อยที่จะได้รับจากการอ่าน POJO จากฐานข้อมูลเปลี่ยนข้อมูลเป็น JSON จากนั้นกลับสู่ POJO เพื่อการบริโภคโดย JSP

ฉันชอบที่จะทำให้ชั้นบริการทำงานจริงทั้งหมดและเพิ่มเลเยอร์ "งานนำเสนอ" แยกต่างหากสำหรับเว็บแอป (JSPs) และตัวควบคุม REST สิ่งเหล่านี้จะเป็นตัวควบคุมที่แยกต่างหากซึ่งบริการจะถูกฉีด อีกทางเลือกหนึ่งด้วยบริการ REST และสร้างตรรกะการนำเสนอทั้งหมดในฝั่งไคลเอ็นต์ตามคำตอบก่อนหน้า

นอกจากนี้ฉันไม่ใช่แฟนตัวยงของโมดูล Maven วิธีที่ร้านค้า Java ของเราจะดำเนินโครงการของคุณคือการเผยแพร่บริการระดับปกติจากนั้นให้ชั้นงานนำเสนอขึ้นอยู่กับรุ่นล่าสุด มีที่ว่างสำหรับการอภิปรายในเรื่องนี้ แต่มันก็ใช้ได้กับเราอย่างแน่นอน เราจะมีเว็บอินเตอร์เฟสและอินเตอร์เฟส REST เป็นโปรเจ็กต์ Maven แยกกันเพราะปกติแล้วไฟล์เหล่านั้นจะอยู่ในไฟล์. war ที่ต่างกันดังนั้นจึงต้องมีการปรับใช้แยกต่างหาก

BTW ฉันจะเสริมความต้องการที่จะเพิ่มความเร็วด้วยเครื่องมือสร้างและการจัดการการพึ่งพา เมื่อโครงการของคุณเติบโตในขนาดที่เหมาะสมคุณต้องการ เครื่องมือฟรีเช่น Maven, Jenkins และ Nexus ทำให้การจัดการการปล่อยมีปัญหาน้อยลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.