2016-09-21 7 views
3

저는 Spray.io에서 Akka-http로 응용 프로그램을 마이그레이션하려고합니다. 응용 프로그램은 마이크로 서비스 기반으로, 우리가 위에 구축 한 많은 작은 라이브러리가 있습니다. 여기에 하나의 특정 마이크로 서비스 지침과 경로를 구성의 예입니다 : apiRoutes 제외 spray.io에서 akka http로 경로 마이그레이션 http

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

위의 모든

는 내부 라이브러리에 정의되어 있습니다.

저는 현재 사용중인 라이브러리를 변경하지 않고이 마이크로 서비스에서 Accka-http를 사용하기 시작합니다 (apiRoutes을 Akka-http로 마이그레이션). 다른 모든 개발자가 자신의 코드를 변경해야하므로 동시.

이것이 가능합니까? Akka-http가 Spray.io 지시문/경로를 사용하는 방법이 있습니까?

내가 알 수있는 한 migration guide에는 그러한 정보가 없습니다.

답변

3

이것은 어렵지 않습니다. 아시는 바와 같이, 스프레이의 RouteRequestContext ⇒ Unit이고, Akka의 RouteRequestContext ⇒ Future[RouteResult]입니다 (해당 버전은 RequestContext입니다). 내가 한 것은 스프레이 서비스 액터를 통해이 변환을 제공하기 위해 스프레이 라우트를 래핑 할 수있는 래퍼를 만드는 것입니다. 경로는 개별적으로 포장 된 후 완전한 최상위 수준의 Akka 경로에 대해 필요에 따라 ~으로 접 힙니다. 시간 경과에 따른 변환은 모든 라우트가 변환 될 때까지 래퍼를 하나씩 제거하는 프로세스입니다.

Akka로 변환 했으므로 Akka HTTP 소켓 처리기와 접기 결과로 시작하십시오. 이제 래핑 된 스프레이 라우트를 해당 폴드에 추가 할 것입니다.

부분적으로, 변환되지 않은 스프레이 지시문은 액터에 응답하려고하므로 래퍼가 래핑되는 경로에 대한 서비스 액터를 만듭니다. Akka에 대한이 액터의 표현은 간단합니다 : Future[RouteResult]을 반환하는 함수는 RouteResult (ActorSystem으로 편리하게 포장 된)을 반환하는 메시지와 함께 서비스 액터의 ask()과 같습니다. 액터를 제외하면이 래퍼는 약 10 줄의 코드입니다.

서비스 액터 자체가 스프레이 HttpServiceActor을 확장하고 하나의 메시지 인 Akka RequestContext을 허용합니다. 이 메시지는 기계적으로 스프레이 RequestContext으로 변형되어 사용 패턴이 무엇이든 관계없이 처리됩니다. 해당 메시지 처리기의 마지막 줄은 self ! ctx이며 변환 된 컨텍스트를 수퍼 클래스의 스프레이 HttpServiceActor 처리기로 보냅니다.

다시 Akka로 변환하면 RequestContextwithRouteResponseMapped()을 통해 Spray로 전송됩니다. 전달한 함수는 역순으로 Spray를 Akka로 매핑하고 RouteResult을 반환합니다. HttpEntity.Strict 반환 값을 수행하는 경우 이것은 매우 간단합니다.

여기에 코드를 게시 할 수는 있지만 클라이언트 용으로 작성되었으므로 IP 공유에 대한 제약은 있지만 (분명히 엄격함) 알 수 없습니다.