Introdução
Neste tutorial, vamos explorar como utilizar o Akka e o Play Framework em aplicações Scala para construir sistemas reativos e responsivos. Sistemas reativos são projetados para responder a eventos em tempo real, sendo importantes em um contexto onde a escalabilidade e a resiliência são cruciais. Aprenderemos como configurar um projeto Scala que implementa a arquitetura reativa, utilizando o Akka para gerenciar a concorrência e o Play Framework para criar APIs Web eficientes. Este guia destina-se a desenvolvedores familiarizados com Scala que desejam aprofundar seus conhecimentos em desenvolvimento de sistemas reativos e responsivos.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o JDK (Java Development Kit) e o SBT (Scala Build Tool) instalados em sua máquina. Verifique as versões instaladas usando os comandos `java -version` e `sbt about`. Caso não os tenha instalados, siga as instruções oficiais nos sites das respectivas ferramentas.
commands# Verificar versões instaladas
java -version
sbt aboutCriação do Projeto Scala com SBT
Use o SBT para criar um novo projeto Scala. Crie uma pasta para o seu projeto e dentro dessa pasta, inicialize um novo projeto SBT usando o comando: `sbt new scala/scala-seed.g8`. Escolha o nome do projeto e as opções desejadas.
commands# Criar novo projeto SBT
mkdir meu-projeto-reactivo
cd meu-projeto-reactivo
sbt new scala/scala-seed.g8Adicionando Dependências do Akka e Play Framework
Edite o arquivo `build.sbt` para incluir as dependências do Akka e do Play Framework. Adicione as seguintes linhas ao arquivo:
build.sbtname := "meu-projeto-reactivo" version := "0.1" scalaVersion := "2.13.6" libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.6.14", "com.typesafe.akka" %% "akka-stream" % "2.6.14", "com.typesafe.play" %% "play" % "2.8.8" )
Implementação de um Ator Akka
Crie uma classe que representa um ator. Este ator será responsável por processar mensagens de forma assíncrona. Crie um diretório chamado `src/main/scala/com/example/actors` e adicione o seguinte código:
GreetingActor.scalapackage com.example.actors import akka.actor.{Actor, ActorSystem, Props} class GreetingActor extends Actor { def receive: Receive = { case "saudar" => sender() ! "Olá, Mundo!" } } object GreetingActor { def props: Props = Props[GreetingActor] }
Configuração do Play Framework
Crie um controlador Play que utilize o ator para processar solicitações HTTP. Crie um pacote chamado `controllers` e adicione a seguinte classe:
GreetingController.scalapackage controllers import akka.actor.ActorSystem import akka.pattern.ask import akka.util.Timeout import javax.inject.Inject import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.ExecutionContext import scala.concurrent.duration._n class GreetingController @Inject() (cc: ControllerComponents, actorSystem: ActorSystem)(implicit ec: ExecutionContext) extends AbstractController(cc) { private val greetingActor = actorSystem.actorOf(GreetingActor.props) implicit val timeout: Timeout = Timeout(5.seconds) def greet() = Action.async { request => (greetingActor ? "saudar").mapTo[String].map { greeting => Ok(greeting) } } }
Configuração da Rota HTTP
Edite o arquivo `conf/routes` para definir a rota que mapeia a requisição HTTP ao controlador de saudação:
routesGET /greet controllers.GreetingController.greet()
Executando a Aplicação
Use o SBT para compilar e executar a aplicação. No terminal, execute os seguintes comandos:
commands# Compilar e executar a aplicação
sbt runTestando a Aplicação
Utilize o Postman ou cURL para testar os endpoints da API. Para fazer uma requisição ao endpoint que retorna a saudação, use o comando:
curl_examplecurl -X GET http://localhost:9000/greet
Implementação de Testes Unitários
Crie uma classe de testes que valida a funcionalidade do controlador. Adicione o seguinte código ao pacote de testes:
GreetingControllerSpec.scalaimport org.scalatestplus.play. import play.api.test.Helpers._ import play.api.test._ class GreetingControllerSpec extends PlaySpec { "GreetingController" should { "return greeting" in { val controller = new GreetingController(... val result = controller.greet().apply(FakeRequest()) status(result) mustBe OK contentAsString(result) mustBe "Olá, Mundo!" } } }
Conclusão
Neste tutorial, você aprendeu a utilizar o Akka e o Play Framework para criar uma aplicação Scala reativa e responsiva. Passamos por todas as etapas, desde a configuração do ambiente de desenvolvimento até a implementação de um ator e um controlador Play que processa requisições HTTP. Além disso, cobrimos como testar a aplicação usando cURL. Com essa base, você pode explorar mais sobre a criação de sistemas reativos utilizando Scala, Akka e o Play Framework.