0Pricing
Scala for Backend Engineering & Functional Programming · Lezione

Servire l'applicazione

Esegua un web server funzionale.

Servire l'applicazione è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Server Ember

http4s esegue il Suo HttpApp[F] su un backend. La scelta moderna predefinita è Ember, un server interamente in Scala basato su cats-effect e fs2, disponibile come org.http4s.ember.server.EmberServerBuilder.

Le applicazioni meno recenti possono usare Blaze, ma Ember è la soluzione consigliata per il futuro.

// build.sbt
// "org.http4s" %% "http4s-ember-server" % http4sV

Creazione del server

EmberServerBuilder.default[F] restituisce un builder da configurare in modo fluente: si associano host e porta, si collega l’applicazione e infine si chiama .build per ottenere una Resource[F, Server].

L’uso di una Resource garantisce che il socket venga rilasciato durante l’arresto.

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

Literal di ip4s

Ember utilizza i tipi ip4s per una gestione dei network type-safe. Gli interpolatori ipv4"..." e port"..." verificano i valori in fase di compilazione, quindi un indirizzo non valido o una porta fuori intervallo impediscono la compilazione.

Importi com.comcast.ip4s._ per accedervi.

import com.comcast.ip4s._

val host = host"localhost"
val p    = port"8080"

Ciclo di vita della Resource

Il server è una Resource perché gestisce un socket che deve essere aperto e chiuso correttamente. resource.use(_ => ...) lo mantiene in esecuzione per tutta la durata dell’effetto interno.

Usi IO.never per eseguire l’applicazione fino all’interruzione del processo.

server.use(_ => IO.never).void

Punto di ingresso IOApp

La classe principale di un’applicazione http4s estende IOApp, che fornisce un runtime cats-effect gestito. È necessario implementare run, restituendo IO[ExitCode].

IOApp gestisce per Lei pool di thread, segnali e arresto controllato.

import cats.effect.{IO, IOApp, ExitCode}

object Main extends IOApp {
  def run(args: List[String]): IO[ExitCode] = ???
}

Un main completo

Unendo i passaggi: si costruisce la risorsa del server, poi la si usa con IO.never per mantenere attivo il processo, restituendo ExitCode.Success.

Questo è il punto di ingresso canonico di http4s.

def run(args: List[String]): IO[ExitCode] =
  EmberServerBuilder.default[IO]
    .withPort(port"8080")
    .withHttpApp(app)
    .build
    .use(_ => IO.never)
    .as(ExitCode.Success)

Composizione delle Resource

Le applicazioni reali acquisiscono più risorse di un semplice server: un pool di connessioni al database, un client HTTP, la configurazione. Le si compongono in un’unica comprensione for su Resource, così vengono tutte rilasciate in ordine inverso.

Passi i client acquisiti alla costruzione delle route.

for {
  client <- EmberClientBuilder.default[IO].build
  app     = buildApp(client)
  srv    <- serverResource(app)
} yield srv

Arresto controllato

Poiché il server vive in una Resource, la cancellazione della fiber (ad esempio in seguito a SIGTERM sotto IOApp) esegue il finalizer che interrompe l’accettazione delle connessioni e chiude il socket.

Ember completa le richieste in corso entro un timeout di arresto configurabile.

EmberServerBuilder.default[IO]
  .withShutdownTimeout(30.seconds)
  .withHttpApp(app)
  .build

Middleware del server

Avvolga l’HttpApp finale con i middleware del server prima di passarlo al builder. Tra i più comuni ci sono Logger, CORS, GZip ed ErrorHandling.

L’ordine è importante: il wrapper più esterno vede per primo la richiesta e per ultimo la risposta.

import org.http4s.server.middleware._

val finalApp = Logger.httpApp(true, false)(
  CORS.policy.withAllowOriginAll(app)
)

Configurazione

Legga host, porta e segreti dall’ambiente con una libreria di configurazione come ciris o pureconfig, restituendo la configurazione come parte di una Resource o di un effetto.

Eviti di codificare le porte direttamente nel codice, così lo stesso binario può essere eseguito in ambienti diversi.

val port = sys.env.get("PORT")
  .flatMap(Port.fromString)
  .getOrElse(port"8080")

Health check e osservabilità

Esponga una route di liveness come GET /health che restituisca 200, così gli orchestratori possono verificare il processo. Aggiunga middleware per il logging delle richieste e per le metriche.

Mantenga i controlli di salute semplici e privi di dipendenze, in modo che riflettano lo stato del processo e non quello dei servizi downstream.

val health = HttpRoutes.of[IO] {
  case GET -> Root / "health" => Ok("UP")
}

Verifica rapida

Ricordi perché il server è modellato come una Resource.

Riepilogo

Ha esposto l’applicazione con EmberServerBuilder, l’ha associata usando i literal di ip4s e l’ha eseguita da una IOApp con build.use(_ => IO.never).

Ha composto risorse, avvolto middleware, letto la configurazione dall’ambiente, aggiunto una route di health check e usato Resource per un arresto controllato.

Domande Frequenti

La lezione «Servire l'applicazione» è gratuita?

Sì — il testo completo di «Servire l'applicazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Cosa imparerò in «Servire l'applicazione»?

Esegua un web server funzionale. Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?

Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Servire l'applicazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?

Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Route e HttpRoutes
  2. Richieste e risposte
  3. Endpoint JSON
  4. Servire l'applicazione
← Torna a Scala for Backend Engineering & Functional Programming