0Pricing
Scala for Backend Engineering & Functional Programming · Lección

Servir la aplicación

Ejecute un servidor web funcional

Servir la aplicación es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.

Servidor Ember

http4s ejecuta su HttpApp[F] en un backend. La opción moderna predeterminada es Ember, un servidor escrito íntegramente en Scala y basado en cats-effect y fs2, disponible como org.http4s.ember.server.EmberServerBuilder.

Las aplicaciones más antiguas pueden usar Blaze, pero Ember es la opción recomendada en adelante.

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

Construcción del servidor

EmberServerBuilder.default[F] proporciona un builder que puede configurar de forma fluida: vincule el host y el puerto, asocie la aplicación y, después, llame a .build para obtener un Resource[F, Server].

Usar un Resource garantiza que el socket se libere al apagar el servidor.

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

Literales de ip4s

Ember usa tipos de ip4s para ofrecer redes con seguridad de tipos. Los interpoladores ipv4"..." y port"..." validan los valores en tiempo de compilación, por lo que una dirección no válida o un puerto fuera de rango no se podrán compilar.

Importe com.comcast.ip4s._ para acceder a ellos.

import com.comcast.ip4s._

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

Ciclo de vida de Resource

El servidor es un Resource porque posee un socket que debe abrirse y cerrarse correctamente. resource.use(_ => ...) lo mantiene en ejecución durante la duración del efecto interno.

Use IO.never para ejecutarlo hasta que se interrumpa el proceso.

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

Punto de entrada de IOApp

La clase principal de una aplicación http4s extiende IOApp, que proporciona un entorno de ejecución administrado por cats-effect. Debe implementar run, que devuelve IO[ExitCode].

IOApp gestiona los grupos de hilos, las señales y el apagado ordenado por usted.

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

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

Un main completo

Para unirlo todo: construya el recurso del servidor y, después, use use con IO.never para que el proceso permanezca activo, devolviendo ExitCode.Success.

Este es el punto de entrada canónico de http4s.

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

Composición de recursos

Las aplicaciones reales adquieren más recursos que un servidor: un pool de conexiones a la base de datos, un cliente HTTP y la configuración. Compóngalos en una sola comprensión for sobre Resource para que todos se liberen en orden inverso.

Pase los clientes adquiridos al construir las rutas.

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

Apagado ordenado

Como el servidor vive en un Resource, cancelar la fibra (por ejemplo, al recibir SIGTERM bajo IOApp) ejecuta el finalizador, que deja de aceptar conexiones y cierra el socket.

Ember procesa las solicitudes en curso dentro de un tiempo de espera de apagado configurable.

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

Middleware del servidor

Envuelva el HttpApp final con middleware del servidor antes de pasarlo al builder. Algunos middleware habituales son Logger, CORS, GZip y ErrorHandling.

El orden es importante: la envoltura más externa ve primero la solicitud y por último la respuesta.

import org.http4s.server.middleware._

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

Configuración

Lea el host, el puerto y los secretos del entorno mediante una biblioteca de configuración como ciris o pureconfig, y devuelva la configuración como parte de un Resource o un efecto.

Evite codificar los puertos directamente para que el mismo binario se ejecute en distintos entornos.

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

Estado y observabilidad

Exponga una ruta de disponibilidad como GET /health que devuelva 200 para que los orquestadores puedan comprobar el proceso. Añada middleware de registro de solicitudes y métricas para obtener visibilidad.

Mantenga las comprobaciones de estado rápidas y sin dependencias, de modo que reflejen el estado del proceso y no el de los servicios posteriores.

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

Comprobación rápida

Recuerde por qué el servidor se modela como un Resource.

Resumen

Sirvió la aplicación con EmberServerBuilder, la vinculó mediante literales de ip4s y la ejecutó desde un IOApp con build.use(_ => IO.never).

Compuso recursos, envolvió middleware, leyó la configuración del entorno, añadió una ruta de estado y recurrió a Resource para realizar un apagado ordenado.

Preguntas frecuentes

¿La lección «Servir la aplicación» es gratis?

Sí — el texto completo de «Servir la aplicación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.

¿Qué aprenderé en «Servir la aplicación»?

Ejecute un servidor web funcional Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?

No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Servir la aplicación»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?

Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Rutas y HttpRoutes
  2. Solicitudes y respuestas
  3. Endpoints JSON
  4. Servir la aplicación
← Volver a Scala for Backend Engineering & Functional Programming