Как разместить статические ресурсы в finagle
Я пытаюсь разместить статические ресурсы, такие как файлы JavaScript и CSS, в Finagle.
Мне удалось заставить его работать, но я должен специально настроить каждый маршрут к папке ресурса в моей службе маршрутизации. Например:
def build():RoutingService[Request with Request] = {
val routingService = RoutingService.byPathObject {
case Root => ControllerRegistry.rootController.root()
case Root / "public" / resource => ControllerRegistry.publicController.findPublic()
case Root / "public" / "bootstrap"/ "css" / resource => ControllerRegistry.publicController.findPublic()
}
routingService
}
а также
def findPublic(): Service[Request, Response] = {
val findPublic = new Service[Request, Response] {
def apply(request: Request) = {
Future {
val resource = Path(request.path) match {
case Root / "public" / resource => getResourceText(s"/public/$resource")
case Root / "public" / "bootstrap" / "css" / resource => getResourceText(s"/public/bootstrap/css/$resource")
case _ => throw new IllegalStateException
}
val response = Response()
response.setContent(copiedBuffer(resource, UTF_8))
response
}
}
}
findPublic
}
Теперь я могу получить любой ресурс в public
а также public/bootstrap/css
, но я не могу получить public/bootstrap/js
без дополнительной настройки.
1 ответ
TLDR: Finagle - не совсем подходящая библиотека для того, что вы хотите. Вы можете использовать что-то вроде Finatra, которое построено на вершине finagle.
Длинная версия: Finagle предназначен для создания распределенных систем, это не веб-фреймворк, как ruby on rails (даже если finagle-http предоставляет очень простую функцию для этого). Это позволяет легко создавать сервисы, которые взаимодействуют друг с другом (и заботятся о балансировке нагрузки, тайм-ауте, отключении, обратном давлении, распределенной трассировке,...). В Твиттере есть библиотека веб-фреймворка, построенная поверх finagle., но это еще не с открытым исходным кодом, в то же время вы можете использовать Finatra.