akka-http с несколькими конфигурациями маршрутов

Быстрый фон

Я просматриваю несколько примеров изучения HTTP-стека Akka для создания нового проекта REST (полностью не UI). Я использовал и дополнял Пример HTTP-микрослужбы Akka, чтобы работать с множеством вариантов использования и конфигурации и были приятно удивлены тем, насколько хорошо работают Scala и Akka HTTP.

Текущая настройка

На данный момент у меня такая конфигурация:

object AkkaHttpMicroservice extends App with Service {
  override implicit val system = ActorSystem()
  override implicit val executor = system.dispatcher
  override implicit val materializer = ActorMaterializer()

  override val config = ConfigFactory.load()
  override val logger = Logging(system, getClass)

  Http().bindAndHandle(routes, config.getString("http.interface"), config.getInt("http.port"))
}

Параметр routes — это простое значение, в котором содержатся типичные данные с использованием path, pathPrefix и т. д.

Эта проблема

Есть ли способ настроить маршрутизацию в нескольких файлах Scala или пример где-нибудь?

Я действительно хотел бы иметь возможность определить набор классов, которые разделяют проблемы и имеют дело с настройкой и обработкой Актера для работы с различными областями приложения и просто оставляют маршалинг корневому расширению App.

Возможно, я слишком много думаю о том, как я делал вещи в Java, используя такие аннотации, как @javax.ws.rs.Path("/whatever") в своих классах. Если это так, пожалуйста, не стесняйтесь указать на изменение мышления.

Я пытался найти несколько разных наборов ключевых слов, но считаю, что задаю неправильный вопрос (например, 1, 2).


person el n00b    schedule 29.12.2015    source источник


Ответы (1)


Проблема 1 — объединение маршрутов в нескольких файлах

Вы можете легко комбинировать маршруты из нескольких файлов.

FooRouter.scala

object FooRouter {
   val route = path("foo") {
       complete {
          Ok -> "foo"
       } 
   }       
}

BarRouter.scala

object BarRouter {
   val route = path("bar") {
       complete {
          Ok -> "bar"
       } 
   }       
}

MainRouter.scala

import FooRouter
import BarRouter
import akka.http.scaladsl.server.Directives._
import ...

object MainRouter {
   val routes = FooRouter.route ~ BarRouter.route
}

object AkkaHttpMicroservice extends App with Service {
  ...    
  Http().bindAndHandle(MainRouter.routes, config.getString("http.interface"), config.getInt("http.port"))
}

Здесь у вас есть некоторые документы:

Проблема 2 – отдельная маршрутизация, сортировка и т. д.

Да, вы можете разделить маршрутизацию, маршаллинг и логику приложения. Вот пример активатора: https://github.com/theiterators/reactive-microservices

Проблема 3 — обработка маршрутов с помощью аннотаций

Я не знаю ни одной библиотеки, которая позволяла бы вам использовать аннотацию для определения маршрутизации в akka-http. Попробуйте узнать больше о маршрутизации DSL. Это представляет собой другой подход к маршрутизации http, но это тоже удобный инструмент.

person mgosk    schedule 29.12.2015
comment
Спасибо. Изучение маршрутизации DSL навело меня на правильный путь и немного изменило мой подход. Это кажется более подходящим мышлением для решения моей конкретной проблемы. Проблема с проблемой 1 заключается в том, что я пытался избежать редактирования нескольких файлов (т. е. отдельного файла, а затем добавления конкатенации маршрутов в приложении). - person el n00b; 30.12.2015
comment
Это сводило меня с ума. Я использовал http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/routes.html#the-routing-tree, и все заработало. Ранее использовалось FooRouter.route ~ BarRouter.route, но оно выдавало какое-то неупорядочивающее исключение. Спасибо за спасение моих волос. - person Greedy Coder; 14.02.2017
comment
Стоит сказать, что вам нужно написать import akka.http.scaladsl.server.Directives._, чтобы это работало. Документ: http://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/routes.html#composing-routes - person Rick; 23.07.2017
comment
Использование этого подхода вызывает у меня ошибку: Http().bindAndHandle(MainRouter.routes для меня выдает ошибку, она говорит Type mismatch, expected: Flow[HttpRequest, HttpResponse, Any], actual: server.Route - person NateH06; 11.04.2018