Scala 具有多路由配置的akka http 快速背景

Scala 具有多路由配置的akka http 快速背景,scala,akka-http,Scala,Akka Http,我正在通过一些示例学习Akka HTTP堆栈来创建一个新的REST项目(完全非UI)。我一直在使用和扩展,通过一系列用例和配置来工作,并对Scala和Akka HTTP的工作性能感到惊喜 当前设置 目前我的配置如下: object AkkaHttpMicroservice extends App with Service { override implicit val system = ActorSystem() override implicit val executor = syst

我正在通过一些示例学习Akka HTTP堆栈来创建一个新的REST项目(完全非UI)。我一直在使用和扩展,通过一系列用例和配置来工作,并对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-在多个文件中合并路由

您可以很容易地组合来自多个文件的路由

斯卡拉酒店

object FooRouter {
   val route = path("foo") {
       complete {
          Ok -> "foo"
       } 
   }       
}
object BarRouter {
   val route = path("bar") {
       complete {
          Ok -> "bar"
       } 
   }       
}
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"))
}
斯卡拉巴尔酒店

object FooRouter {
   val route = path("foo") {
       complete {
          Ok -> "foo"
       } 
   }       
}
object BarRouter {
   val route = path("bar") {
       complete {
          Ok -> "bar"
       } 
   }       
}
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"))
}
scala主机

object FooRouter {
   val route = path("foo") {
       complete {
          Ok -> "foo"
       } 
   }       
}
object BarRouter {
   val route = path("bar") {
       complete {
          Ok -> "bar"
       } 
   }       
}
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-分段路由、编组等

是的,您可以分离路由、编组和应用程序逻辑。下面是activator示例:

问题3-使用注释处理路由


我不知道有哪种库允许您使用注释来定义akka http中的路由。尝试了解更多有关DSL路由的信息。这代表了一种不同的http路由方法,但它也是一种方便的工具。

谢谢。通过查看DSL路由,我找到了一条很好的路径,并稍微改变了我的方法。这似乎是处理我手头特殊问题的更合适的心态。问题1的问题是,我试图避免编辑多个文件(即,单独的文件,然后在应用程序中添加路由连接)。这让我发疯。我用过,效果很好。以前使用过
fooorouter.route~BarRouter.route
,但它引发了一些解组异常。谢谢你帮我留了头发。值得一提的是,你需要编写
导入akka.http.scaladsl.server.Directives.\uz
才能工作。Doc:使用这种方法会给我带来一个错误:
Http().bindAndHandle(MainRouter.routes
for me正在抛出一个错误,它说
类型不匹配,预期:Flow[HttpRequest,HttpResponse,Any],实际:server.Route