2016-09-21 80 views
3

我正在將Spray.io中的應用程序遷移到Akka-http。該應用程序是基於微服務的,有許多我們建立在其上的小型庫。以下是在一個特定的微服務構成指令和路由的示例:從spray.io遷移到akka http

val routes = 
    (decompressRequest & compressResponseIfRequested) { 
    metricsRoute ~ 
    healthStatusRoute ~ 
    apiRoutes    // only these are my app's routes 
    } 

所有上述的,除了apiRoutes在內部庫中定義。

我想開始在這個微服務中使用Akka-http(遷移apiRoutes到Akka-http)而不更改我目前使用的任何庫,因爲這會迫使所有其他開發人員在同一時間。

這可能嗎?有什麼方法讓Akka-http使用Spray.io指令/路由?

據我所知,migration guide沒有這樣的信息。

回答

3

這不難做到。如您所知,噴霧中的RouteRequestContext ⇒ Unit,Akka的RouteRequestContext ⇒ Future[RouteResult](當然,其各自版本爲RequestContext)。我所做的是創建一個包裝,可以包裝噴霧路線以通過噴霧服務參與者提供此轉化。根據需要,路線被單獨包裹,然後與~摺疊,以完成頂級Akka路線。隨着時間的推移,一個接一個地移除包裝直到所有路線都被轉換爲止。

由於您將轉換爲 Akka,請從Akka HTTP套接字處理程序和摺疊結果開始。現在你要添加包裝的噴霧路線。

對於它的一部分,未轉換的Spray指令想要對Actor作出響應,所以你的包裝爲包裹的路由創建一個服務actor。這位演員對阿卡的介紹很簡單:一個功能需要RequestContext並且返回Future[RouteResult]與服務參與者的ask()相同,並返回RouteResult(便利地由ActorSystem包裝在Future中)。不包括Actor,這個包裝大約有十行代碼。

服務演員本身擴展噴霧HttpServiceActor並接受一個消息,這是一個Akka RequestContext。這條信息被機械地轉換成Spray RequestContext,處理任何需要的使用模式。該消息處理程序的最後一行是self ! ctx,將翻譯後的上下文發送給超類中的Spray HttpServiceActor處理程序。

翻譯回Akka的結果是withRouteResponseMapped()發送給Spray的RequestContext。你傳遞的功能是相反的,將Spray構造映射回Akka並返回RouteResult。如果你只是在執行HttpEntity.Strict返回值,這很簡單。

我希望我可以在這裏發佈代碼,但它是爲客戶編寫的,他們對IP共享有一些未知的(但顯然是嚴格的)限制。