Akka HTTP:如何与演员分割路线

时间:2018-04-21 09:39:44

标签: scala akka akka-http

我有一个旧的Scala / Akka Http项目,我试图简化和重构。我想知道是否有更好的方法来组织路线,也许是在演员之间分开。这就是我现在拥有的东西(远非理想):

```

object MyAPI {
  def props(): Props = Props(new MyAPI())
  val routes = pathPrefix("api") {
    pathPrefix("1") {
      SomeActor.route  //More routes can be appended here using ~

    }
  }
}

final class MyAPI extends Actor with ActorLogging {

  implicit lazy val materializer = ActorMaterializer()
  implicit lazy val executionContext = context.dispatcher

  Http(context.system)
    .bindAndHandleAsync(Route.asyncHandler(MyAPI.routes), MyHttpServer.httpServerHostName, MyHttpServer.httpServerPort)
    .pipeTo(self)

  override def receive: Receive = {
    case serverBinding: ServerBinding =>
      log.info(s"Server started on  ${serverBinding.localAddress}")
      context.become(Actor.emptyBehavior)
    case Status.Failure(t) =>
      log.error(t, "Error binding to network interface")
      context.stop(self)
  }
}

```

```

object SomeActor {

  def props(): Props = Props[SomeActor]
  val route = get {
    pathPrefix("actor") {
      pathEnd {
        complete("Completed") //Is there a clean way 'ask' the actor below?
      }
    }
  }

}

class SomeActor extends Actor with ActorLogging {
  implicit lazy val executionContext = context.dispatcher;



  override def receive: Receive = {
    //receive and process messages here

  }

```

所以,我的问题是 - 是否有一种简洁的方法来构建和重构路由,而不是将它们集中在一个大的路由定义中?我或许可以创建一个actor(路由器)的层次结构,主路由定义只是将它委托给路由器,随着我们在actor层次结构中更深入,我们会逐步添加更多细节。但是,是否有一个普遍接受的模式或两个组织路线?

1 个答案:

答案 0 :(得分:0)

我想建议你在功能的基础上,你可以拥有你想要的多个演员,但是创建一个主管演员,这将监视每个儿童演员。并且所有的监督策略都应写入主管本身,并且您要发送给演员的所有信息都应该由主管转发。

一旦从终点获取数据,可能是get或post方法将数据带入someRequest case类。然后将它发送到一些handleReq()方法。然后根据功能进行处理。

您可以构建类似这样的项目。 SRC / 演员//all the actors will be in this package

模型// all the case classes and constants

回购// all the db related function you can do here

服务// all your routes and endPoint functions

现在你可以拥有package util,你可以放置任何actor所使用的所有实用程序特性,或者服务可能是你有很多验证,你可以拥有一个名为validator的软件包。

结构取决于您的业务。我认为这会有所帮助。