我能够使用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或编写所有管道代码之间是否只是偏爱的问题?还是在选择框架时我应该考虑一些性能问题或其他方面?