0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

ให้บริการแอปพลิเคชัน

เรียกใช้เว็บเซิร์ฟเวอร์เชิงฟังก์ชัน

ให้บริการแอปพลิเคชัน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เส้นทางและ HttpRoutes
  2. คำขอและการตอบกลับ
  3. ปลายทาง JSON
  4. ให้บริการแอปพลิเคชัน
← กลับไปที่ Scala for Backend Engineering & Functional Programming