ZIO 1.0.3 изменяет способ работы сред, и теперь http4s Blaze не будет запускаться

#scala #http4s #zio #tapir

#scala #http4s #zio #тапир

Вопрос:

Я впервые использую 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] . Теперь компилятор жалуется, что вы не можете наследовать от конечного класса, поэтому вы не можете вызвать новые часы.

Я попытался исправить это, заменив его на

 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 (поскольку это часть проекта).

Кроме того, я лично использовал его недавно. Это сработало.