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" % http4sVConstrucció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)
.buildLiterales 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).voidPunto 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 srvApagado 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)
.buildMiddleware 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
- Rutas y HttpRoutes
- Solicitudes y respuestas
- Endpoints JSON
- Servir la aplicación