我有一个旧的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层次结构中更深入,我们会逐步添加更多细节。但是,是否有一个普遍接受的模式或两个组织路线?
答案 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的软件包。
结构取决于您的业务。我认为这会有所帮助。