ให้บริการแอปพลิเคชัน
เรียกใช้เว็บเซิร์ฟเวอร์เชิงฟังก์ชัน
ให้บริการแอปพลิเคชัน เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
เซิร์ฟเวอร์ Ember
http4s เรียกใช้ HttpApp[F] บนแบ็กเอนด์ ตัวเลือกสมัยใหม่ที่เป็นค่าเริ่มต้นคือ Ember ซึ่งเป็นเซิร์ฟเวอร์ที่เขียนด้วย Scala ล้วนและสร้างบน cats-effect กับ fs2 โดยใช้งานผ่าน org.http4s.ember.server.EmberServerBuilder
แอปพลิเคชันรุ่นเก่าอาจใช้ Blaze แต่ Ember เป็นแนวทางที่แนะนำสำหรับอนาคต
// build.sbt
// "org.http4s" %% "http4s-ember-server" % http4sVการสร้างเซิร์ฟเวอร์
EmberServerBuilder.default[F] จะให้ตัวสร้างที่คุณกำหนดค่าได้อย่างต่อเนื่อง ได้แก่ ผูกโฮสต์และพอร์ต แนบแอป แล้วเรียก .build เพื่อรับ Resource[F, Server]
การใช้ Resource รับประกันว่าซ็อกเก็ตจะถูกปล่อยเมื่อปิดระบบ
import com.comcast.ip4s._
import org.http4s.ember.server.EmberServerBuilder
EmberServerBuilder.default[IO]
.withHost(ipv4"0.0.0.0")
.withPort(port"8080")
.withHttpApp(app)
.buildลิเทอรัลของ ip4s
Ember ใช้ชนิดข้อมูลของ ip4s เพื่อให้การสื่อสารเครือข่ายปลอดภัยด้านชนิดข้อมูล ตัวแทรก ipv4"..." และ port"..." จะตรวจสอบตั้งแต่เวลาคอมไพล์ ดังนั้นที่อยู่ไม่ถูกต้องหรือพอร์ตนอกช่วงจะคอมไพล์ไม่ผ่าน
นำเข้า com.comcast.ip4s._ เพื่อใช้งานตัวแทรกเหล่านี้
import com.comcast.ip4s._
val host = host"localhost"
val p = port"8080"วงจรชีวิตของ Resource
เซิร์ฟเวอร์เป็น Resource เพราะเป็นเจ้าของซ็อกเก็ตที่ต้องเปิดและปิดอย่างเรียบร้อย resource.use(_ => ...) จะทำให้เซิร์ฟเวอร์ทำงานตลอดช่วงเวลาของเอฟเฟกต์ภายใน
ใช้ IO.never เพื่อให้ทำงานต่อไปจนกว่ากระบวนการจะถูกขัดจังหวะ
server.use(_ => IO.never).voidจุดเริ่มต้นของ IOApp
คลาสหลักของแอป http4s จะสืบทอดจาก IOApp ซึ่งจัดเตรียมรันไทม์ cats-effect ที่มีการจัดการให้ คุณต้องเขียน run ให้คืนค่าเป็น IO[ExitCode]
IOApp จัดการกลุ่มเธรด การจัดการสัญญาณ และการปิดระบบอย่างเรียบร้อยให้คุณ
import cats.effect.{IO, IOApp, ExitCode}
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = ???
}เมธอดหลักฉบับสมบูรณ์
เมื่อนำทุกอย่างมารวมกัน ให้สร้างทรัพยากรเซิร์ฟเวอร์ แล้วใช้ use ร่วมกับ IO.never เพื่อให้กระบวนการทำงานต่อไป พร้อมคืนค่า ExitCode.Success
นี่คือจุดเริ่มต้นมาตรฐานของแอปพลิเคชัน http4s
def run(args: List[String]): IO[ExitCode] =
EmberServerBuilder.default[IO]
.withPort(port"8080")
.withHttpApp(app)
.build
.use(_ => IO.never)
.as(ExitCode.Success)การประกอบทรัพยากร
แอปจริงมักต้องจัดหามากกว่าเซิร์ฟเวอร์ เช่น กลุ่มการเชื่อมต่อฐานข้อมูล ไคลเอนต์ HTTP และการกำหนดค่า ให้ประกอบสิ่งเหล่านี้ใน for-comprehension เดียวบน Resource เพื่อให้ทั้งหมดถูกปล่อยตามลำดับย้อนกลับ
ส่งไคลเอนต์ที่จัดหาแล้วเข้าไปตอนสร้างเส้นทาง
for {
client <- EmberClientBuilder.default[IO].build
app = buildApp(client)
srv <- serverResource(app)
} yield srvการปิดระบบอย่างเรียบร้อย
เนื่องจากเซิร์ฟเวอร์อยู่ใน Resource การยกเลิกไฟเบอร์ เช่น เมื่อได้รับ SIGTERM ภายใต้ IOApp จะเรียกตัวล้างทรัพยากร ซึ่งจะหยุดรับการเชื่อมต่อและปิดซ็อกเก็ต
Ember จะจัดการคำขอที่กำลังทำงานอยู่ให้เสร็จภายในช่วงหมดเวลาปิดระบบที่กำหนดค่าได้
EmberServerBuilder.default[IO]
.withShutdownTimeout(30.seconds)
.withHttpApp(app)
.buildมิดเดิลแวร์ของเซิร์ฟเวอร์
ครอบ HttpApp สุดท้ายด้วยมิดเดิลแวร์ของเซิร์ฟเวอร์ก่อนส่งให้ตัวสร้าง มิดเดิลแวร์ที่ใช้กันทั่วไป ได้แก่ Logger, CORS, GZip และ ErrorHandling
ลำดับมีความสำคัญ: ตัวครอบชั้นนอกสุดจะเห็นคำขอก่อนและเห็นการตอบกลับเป็นลำดับสุดท้าย
import org.http4s.server.middleware._
val finalApp = Logger.httpApp(true, false)(
CORS.policy.withAllowOriginAll(app)
)การกำหนดค่า
อ่านโฮสต์ พอร์ต และข้อมูลลับจากสภาพแวดล้อมด้วยไลบรารีการกำหนดค่า เช่น ciris หรือ pureconfig โดยคืนค่าการกำหนดค่าเป็นส่วนหนึ่งของ Resource หรือเอฟเฟกต์
หลีกเลี่ยงการกำหนดพอร์ตตายตัว เพื่อให้ไบนารีเดียวกันทำงานได้ในหลายสภาพแวดล้อม
val port = sys.env.get("PORT")
.flatMap(Port.fromString)
.getOrElse(port"8080")สุขภาพและการสังเกตระบบ
เปิดเผยเส้นทางตรวจสอบการทำงาน เช่น GET /health ที่คืนค่า 200 เพื่อให้ระบบจัดการอัตโนมัติตรวจสอบกระบวนการได้ เพิ่มมิดเดิลแวร์สำหรับบันทึกคำขอและเมตริกเพื่อให้มองเห็นการทำงาน
ทำให้การตรวจสอบสุขภาพมีค่าใช้จ่ายต่ำและไม่ขึ้นต่อสิ่งอื่น เพื่อให้สะท้อนสถานะของกระบวนการ ไม่ใช่สถานะของระบบปลายทาง
val health = HttpRoutes.of[IO] {
case GET -> Root / "health" => Ok("UP")
}ตรวจสอบอย่างรวดเร็ว
ทบทวนว่าเหตุใดเซิร์ฟเวอร์จึงจำลองเป็น Resource
สรุป
คุณให้บริการแอปด้วย EmberServerBuilder ผูกเซิร์ฟเวอร์โดยใช้ลิเทอรัลของ ip4s และเรียกใช้จาก IOApp ด้วย build.use(_ => IO.never)
คุณประกอบทรัพยากร ครอบด้วยมิดเดิลแวร์ อ่านการกำหนดค่าจากสภาพแวดล้อม เพิ่มเส้นทางตรวจสอบสุขภาพ และใช้ Resource เพื่อการปิดระบบอย่างเรียบร้อย
คำถามที่พบบ่อย
บทเรียน “ให้บริการแอปพลิเคชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ให้บริการแอปพลิเคชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ให้บริการแอปพลิเคชัน”
เรียกใช้เว็บเซิร์ฟเวอร์เชิงฟังก์ชัน คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ให้บริการแอปพลิเคชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางและ HttpRoutes
- คำขอและการตอบกลับ
- ปลายทาง JSON
- ให้บริการแอปพลิเคชัน