使用Spring MVC或Akka HTTP公开Akka actor

时间:2018-06-24 15:19:58

标签: java spring-mvc akka akka-http

我能够使用Spring的RestController通过HTTP公开Akka actor,如下例所示。控制器访问一个银行帐户(以Akka actor的身份实现),索要余额,并在HTTP请求结束时将其返回给客户端。

@RequestMapping(value="{accountId}/balance", method = RequestMethod.GET)
public BalanceResponse getBalance(@PathVariable String accountId) throws Exception {
    ActorRef account = _accountBag.get(accountId);
    Timeout timeout = new Timeout(Duration.create(TIMEOUT_IN_SECONDS, "seconds"));
    Future<Object> future = Patterns.ask(account, new AccountActor.BalanceRequest(), timeout);
    AccountActor.BalanceResponse result = (AccountActor.BalanceResponse) Await.result(future, timeout.duration());
    return new BalanceResponse(accountId, result.getBalance());
}

但是随着我对Akka的研究不断发展,我意识到还有其他方法可以公开Akka演员,例如使用Akka HTTP。我已经从Lightbend网站下载了Akka HTTP模板,以了解如何使用它。除了DSL以外,在我看来Akka HTTP处理与actor的通信的方式几乎与我在银行示例中使用的方式相同:有一个ActorRef,我使用问号来获取所需的信息(下面的示例)从模板)。

private Route getUser(String name) {
  return get(() -> {
      //#retrieve-user-info
      CompletionStage<Optional<User>> maybeUser = PatternsCS
        .ask(userRegistryActor, new UserRegistryMessages.GetUser(name), timeout)
        .thenApply(obj ->(Optional<User>) obj);

      return onSuccess(() -> maybeUser,
          performed -> {
              if (performed.isPresent())
                  return complete(StatusCodes.OK, performed.get(), Jackson.marshaller());
              else
                  return complete(StatusCodes.NOT_FOUND);
          }
        );
      //#retrieve-user-info
    });
}

我的问题:使用Spring MVC和Akka HTTP有什么实际区别?在使用DSL或编写所有管道代码之间是否只是偏爱的问题?还是在选择框架时我应该考虑一些性能问题或其他方面?

0 个答案:

没有答案