ZIO 1.0.3 меняет способ работы сред, и теперь http4s Blaze не запускается.
Я использую ZIO впервые и начал с шаблонной заглушки с https://github.com/guizmaii/scala-tapir-http4s-zio/blob/master/src/main/scala/example/HttpApp.scala . который использует ZIO версии 1.0.0-RC17 для настройки и запуска сервера http4s Blaze, включая Tapir. Это сработало хорошо, но позже я попытался обновиться до версии 1.0.3, чтобы использовать последнюю версию, но эта версия несовместима с кодом в этой заглушке. Конкретно:
Это код, который определяет сервер (некоторые несвязанные строки маршрутизации вырезаны из оригинала):
val prog: ZIO[ZEnv, Throwable, Unit] = for {
conf <- ZIO.effect(ApplicationConf.build().orThrow())
_ <- putStrLn(conf.toString)
server = ZIO.runtime[AppEnvironment].flatMap { implicit rts =>
val apiRoutes = new ApiRoutes[AppEnvironment]()
val allTapirRoutes = apiRoutes.getRoutes.foldK
val httpApp: HttpApp[RIO[AppEnvironment, *]] = (allTapirRoutes).orNotFound
val httpAppExtended = Logger.httpApp(logHeaders = true, logBody = true)(httpApp)
BlazeServerBuilder[ZIO[AppEnvironment, Throwable, *]]
.bindHttp(conf.port.port.value, conf.server.value)
.withHttpApp(httpAppExtended)
.withoutBanner
.withSocketKeepAlive(true)
.withTcpNoDelay(true)
.serve
.compile[RIO[AppEnvironment, *], RIO[AppEnvironment, *], ExitCode]
.drain
}
prog <- server.provideSome[ZEnv] { currentEnv =>
new Clock {
override val clock: Clock.Service[Any] = currentEnv.clock
}
}
} yield prog
prog.foldM(h => putStrLn(h.toString).as(1), _ => ZIO.succeed(0))
Это основная часть метода run(). Запуск этого кода никогда не приводит к завершению приложения с кодом 0, поскольку сервер Blaze блокирует завершение работы, как и ожидалось. Проблема в этом фрагменте:
prog <- server.provideSome[ZEnv] { currentEnv =>
new Clock {
override val clock: Clock.Service[Any] = currentEnv.clock
}
}
Это не работает в версии 1.0.3 из-за введения Has[A]. Компилятор теперь жалуется, что вы не можете наследовать от конечного класса Has, поэтому вы не можете вызвать новый Clock.
Я попытался исправить это, заменив его на
prog = server.provideSomeLayer[ZEnv]
и замена целых чисел кода выхода объектами ExitCode, что привело к компиляции кода, но после этого сервер Blaze, похоже, не инициализировал или не предотвратил завершение приложения. Он только что закончился с кодом выхода 0.
Здесь явно чего-то не хватает, и я не видел никакой информации о переходе от старой системы окружения к новой системе, основанной на Has[A]. Как я могу исправить этот шаблон, чтобы сервер Blaze снова работал?
1 ответ
Если вас интересует шаблонный проект tapir-zio-http4s, я предлагаю использовать тот, что есть в репозитории tapir: https://github.com/softwaremill/tapir/blob/master/examples/src/main/scala/sttp/tapir . /examples/ZioExampleHttp4sServer.scala
Гарантируется, что он всегда будет компилироваться с последней версией Tapir (поскольку это часть проекта).
Также я лично использовал его недавно. Это сработало.