Как вы можете создать Hello World API с помощью Scala и Akka HTTP

Да, это все еще актуально.

Akka - это популярный набор инструментов на основе акторов для создания параллельных и распределенных приложений в JVM. Эти приложения в основном используют Scala или Java.

В нем есть несколько модулей, которые помогают создавать такие приложения, и Akka HTTP - один из них.

Akka HTTP имеет как клиентские, так и серверные утилиты. В этом руководстве мы сосредоточимся на сервере.

Вы должны быть знакомы со Scala, и у вас должны быть установлены и установлены SBT и IntelliJ. Если это не так, проверьте официальную документацию.

Без лишних слов, давайте создадим API hello world, используя Scala и Akka HTTP!

Настройка проекта

Не стесняйтесь клонировать репо, убедитесь, что вы используете ветку 2.1-review-project.

Если нет, мы будем использовать sbt 1.1.6и Scala 2.12.6. Проверьте build.propertiesи build.sbtфайлы , чтобы убедиться версий есть соответствующее этим.

Начнем с добавления необходимых зависимостей. Поскольку Akka HTTP зависит от субъектов и потоков, нам также необходимо добавить эти библиотеки.

Добавьте в конец build.sbtфайла следующий фрагмент :

libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.13", "com.typesafe.akka" %% "akka-stream" % "2.5.13", "com.typesafe.akka" %% "akka-http" % "10.1.3",)

Если вам будет предложено включить автоматический импорт, сделайте это. В противном случае вы можете открыть терминал и cdперейти в корневой каталог вашего проекта. Затем запустите, sbt updateчтобы получить зависимости.

При автоматическом импорте ваш проект будет обновляться каждый раз при обновлении определенных файлов, включая build.sbtфайл.

Создавать зависимости

Давайте создадим объект Scala под именем src / main / scala Server. Мы начнем с создания экземпляров зависимостей, необходимых для создания сервера с Akka HTTP.

Во-первых, объект будет расширять Appтрейт:

object Server extends App {}

Это позволит запускать наш Serverобъект.

Нам понадобится хост и порт для привязки сервера, поэтому давайте добавим их сейчас:

val host = "0.0.0.0"val port = 9000

Поскольку в Akka HTTP используются акторы и потоки Akka, нам также необходимо указать их зависимости:

implicit val system: ActorSystem = ActorSystem("helloworld")implicit val executor: ExecutionContext = system.dispatcherimplicit val materializer: ActorMaterializer = ActorMaterializer()

Даже если вам не нужно знать, что они делают, чтобы начать разработку приложений HTTP Akka, всегда полезно знать, для чего они нужны.

ActorSystemИспользуются для управления актерами. Он используется для их создания и поиска. Актеры в одной системе обычно используют одну и ту же конфигурацию.

ExecutionContextОтвечают исполняющим Futureс. Он знает, где и как их выполнять, например, в пуле потоков.

И наконец, он ActorMaterializerотвечает за запуск потоков.

После этого мы можем создать маршрут приветствия!

Создать маршрут

Чтобы создать наш маршрут, мы будем использовать DSL маршрутизации Akka HTTP. Он основан на «слоях» того, что называется директивой. Для обзора, не стесняйтесь просматривать их официальные документы.

Добавьте маршрут под зависимостями:

def route = path("hello") { get { complete("Hello, World!") }}

У нас есть первый уровень, на котором мы пытаемся сопоставить путь входящего запроса как «/ hello». Если он не совпадает, он будет отклонен.

Если он совпадает, он будет пытаться соответствовать внутренним «директивам». В нашем случае мы сопоставляем запросы GET. Мы завершаем цикл запроса / ответа сообщением «Hello, World».

Запустить сервер

Когда наш маршрут создан, все, что нам нужно сделать, это запустить сервер:

Http().bindAndHandle(route, host, port)

Мы привязываем наш маршрут к данному хосту и порту с помощью HTTP- Httpобъекта Akka .

Чтобы запустить наш Serverобъект, вы можете щелкнуть его правой кнопкой мыши и выбрать « Выполнить сервер» .

Дайте ему пару секунд на компиляцию, затем перейдите в браузер. Перейдите к, //localhost:9000/helloи вы должны увидеть наш «Hello, World!» сообщение.

Круто, не правда ли?

логирование

Прежде чем завершить это руководство, мы добавим базовое ведение журнала на наш сервер.

Вы могли заметить, что при запуске нашего Serverобъекта обратной связи не было . Мы не знаем, удалось это или нет.

Мы можем только предположить, что это сработало, потому что приложение не аварийно завершило работу.

Добавим к нему логирование.

If you look into the bindAndHandle function from the Http object, it returns a future of ServerBinding . We can hook some logs into the future’s onComplete function.

Let’s do that:

val bindingFuture = Http().bindAndHandle(route, host, port)bindingFuture.onComplete { case Success(serverBinding) => println(s"listening to ${serverBinding.localAddress}") case Failure(error) => println(s"error: ${error.getMessage}")}

Run the Server again, and this time you should see:

listening to /0:0:0:0:0:0:0:0:9000

Wrapping up

While using Scala and Akka HTTP is not the fastest way to develop APIs, it allows you to integrate other Akka modules, such as actors, streams, clusters, and more, making it easier to develop resilient and scalable systems.

Having said that, it’s good to keep in mind that developing an application using Scala and/or Akka doesn’t necessarily mean that it will be resilient and scalable. You’ll still need to perform work to accomplish that, but it’s easier than with other technologies.

If you liked Akka HTTP, we’ve got a free course that’ll quickstart your way into developing APIs with it. You’ll build an API for a Todo application, explained step by step. Check it out! ??

Akka HTTP Quickstart

Learn how to create web applications and APIs with Akka HTTP in this free course!link.codemunity.io