web-dev-qa-db-ja.com

複数のルート構成を持つakka-http

クイックバックグラウンド

新しいRESTプロジェクト(完全に非UI)を作成するためのAkka HTTPスタックを学習するいくつかの例を実行しています。 Akka HTTPマイクロサービスの例 を使用および拡張しています。 =一連のユースケースと構成を処理し、Scala&AkkaHTTPがうまく機能することに嬉しい驚きを感じています。

現在の設定

現在、私は次のような構成になっています。

_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パラメータは、pathpathPrefixなどを使用した一般的なデータを含む単純な値です。

問題

複数のScalaファイルまたはどこかにある例でルーティングを設定する方法はありますか?

懸念事項を分離し、アクターのセットアップと処理を処理してアプリケーションのさまざまな領域を処理し、マーシャリングをルートApp拡張機能に任せるクラスのセットを定義できるようにしたいと思います。

これは、クラスで@javax.ws.rs.Path("/whatever")のようなアノテーションを使用して、Java)で物事をどのように行ったかという点で考えすぎている可能性があります。考え方の変化を排除します。

いくつかの異なるキーワードのセットを検索しようとしましたが、間違った質問をしていると思います(たとえば、 12 )。

12
el n00b

問題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でルーティングを定義できるlibはわかりません。 DSLルーティングについてもっと学びましょう。これはhttpルーティングへの異なるアプローチを表していますが、便利なツールでもあります。

22
mgosk