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" % http4sVCreazione 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)
.buildLiteral 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).voidPunto 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 srvArresto 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)
.buildMiddleware 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
- Route e HttpRoutes
- Richieste e risposte
- Endpoint JSON
- Servire l'applicazione