Servir l’application
Exécutez un serveur web fonctionnel.
Servir l’application est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Scala for Backend Engineering & Functional Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Serveur Ember
http4s exécute votre HttpApp[F] sur un serveur. Le choix moderne par défaut est Ember, un serveur entièrement écrit en Scala et basé sur cats-effect et fs2, disponible sous la forme de org.http4s.ember.server.EmberServerBuilder.
Les applications plus anciennes peuvent utiliser Blaze, mais Ember est la solution recommandée pour l'avenir.
// build.sbt
// "org.http4s" %% "http4s-ember-server" % http4sVConstruction du serveur
EmberServerBuilder.default[F] fournit un constructeur que vous configurez de manière fluide : vous liez l'hôte et le port, rattachez l'application, puis appelez .build pour obtenir une Resource[F, Server].
L'utilisation d'une Resource garantit que le socket est libéré lors de l'arrêt.
import com.comcast.ip4s._
import org.http4s.ember.server.EmberServerBuilder
EmberServerBuilder.default[IO]
.withHost(ipv4"0.0.0.0")
.withPort(port"8080")
.withHttpApp(app)
.buildLittéraux ip4s
Ember utilise les types ip4s pour assurer la sûreté de typage du réseau. Les interpolateurs ipv4"..." et port"..." valident les valeurs à la compilation : une adresse invalide ou un port hors limites ne pourra donc pas être compilé.
Importez com.comcast.ip4s._ pour y accéder.
import com.comcast.ip4s._
val host = host"localhost"
val p = port"8080"Cycle de vie d'une Resource
Le serveur est une Resource parce qu'il possède un socket qui doit être ouvert et fermé proprement. resource.use(_ => ...) le maintient en fonctionnement pendant toute la durée de l'effet interne.
Utilisez IO.never pour l'exécuter jusqu'à l'interruption du processus.
server.use(_ => IO.never).voidPoint d'entrée IOApp
La classe principale d'une application http4s étend IOApp, qui fournit un environnement d'exécution cats-effect géré. Vous implémentez run, qui renvoie IO[ExitCode].
IOApp gère pour vous les pools de threads, la gestion des signaux et l'arrêt progressif.
import cats.effect.{IO, IOApp, ExitCode}
object Main extends IOApp {
def run(args: List[String]): IO[ExitCode] = ???
}Un programme principal complet
Pour tout assembler, construisez la ressource du serveur, puis utilisez-la avec use et IO.never afin que le processus reste actif, en renvoyant ExitCode.Success.
C'est le point d'entrée http4s canonique.
def run(args: List[String]): IO[ExitCode] =
EmberServerBuilder.default[IO]
.withPort(port"8080")
.withHttpApp(app)
.build
.use(_ => IO.never)
.as(ExitCode.Success)Composition de Resources
Les applications réelles acquièrent davantage qu'un serveur : un pool de connexions à une base de données, un client HTTP, une configuration. Composez-les dans une seule compréhension for sur Resource afin qu'ils soient tous libérés dans l'ordre inverse.
Transmettez les clients acquis à la construction des routes.
for {
client <- EmberClientBuilder.default[IO].build
app = buildApp(client)
srv <- serverResource(app)
} yield srvArrêt progressif
Comme le serveur vit dans une Resource, l'annulation de la fibre (par exemple lors d'un SIGTERM sous IOApp) exécute le finaliseur qui cesse d'accepter les connexions et ferme le socket.
Ember laisse se terminer les requêtes en cours dans le délai d'arrêt configurable.
EmberServerBuilder.default[IO]
.withShutdownTimeout(30.seconds)
.withHttpApp(app)
.buildIntergiciel du serveur
Enveloppez l'HttpApp final avec l'intergiciel du serveur avant de le transmettre au constructeur. Les intergiciels courants sont Logger, CORS, GZip et ErrorHandling.
L'ordre est important : l'enveloppe la plus externe voit la requête en premier et la réponse en dernier.
import org.http4s.server.middleware._
val finalApp = Logger.httpApp(true, false)(
CORS.policy.withAllowOriginAll(app)
)Configuration
Lisez l'hôte, le port et les secrets depuis l'environnement avec une bibliothèque de configuration telle que ciris ou pureconfig, en renvoyant la configuration dans une Resource ou un effet.
Évitez de coder les ports en dur afin que le même binaire puisse s'exécuter dans différents environnements.
val port = sys.env.get("PORT")
.flatMap(Port.fromString)
.getOrElse(port"8080")État de santé et observabilité
Exposez une route de vivacité telle que GET /health qui renvoie 200, afin que les orchestrateurs puissent sonder le processus. Ajoutez un intergiciel de journalisation des requêtes et de métriques pour assurer la visibilité.
Gardez les vérifications d'état peu coûteuses et indépendantes des dépendances afin qu'elles reflètent l'état du processus, et non celui des services en aval.
val health = HttpRoutes.of[IO] {
case GET -> Root / "health" => Ok("UP")
}Vérification rapide
Rappelez-vous pourquoi le serveur est modélisé comme une Resource.
Récapitulatif
Vous avez servi l'application avec EmberServerBuilder, l'avez lié à l'aide des littéraux ip4s et l'avez exécutée depuis une IOApp avec build.use(_ => IO.never).
Vous avez composé des ressources, enveloppé des intergiciels, lu la configuration depuis l'environnement, ajouté une route d'état de santé et utilisé Resource pour assurer un arrêt progressif.
Questions Fréquemment Posées
La leçon « Servir l’application » est-elle gratuite ?
Oui — le texte complet de « Servir l’application » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Scala for Backend Engineering & Functional Programming, passe à CoddyKit PRO. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Servir l’application » ?
Exécutez un serveur web fonctionnel. Tu pratiques Scala for Backend Engineering & Functional Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Scala for Backend Engineering & Functional Programming ?
Aucune expérience préalable n'est requise. Scala for Backend Engineering & Functional Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Servir l’application » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Scala for Backend Engineering & Functional Programming ?
Oui. Chaque leçon Scala for Backend Engineering & Functional Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Routes et HttpRoutes
- Requêtes et réponses
- Points de terminaison JSON
- Servir l’application