Introdução
Neste artigo, vamos explorar o desenvolvimento de aplicações escaláveis em Scala utilizando Akka e o Play Framework, focando em sistemas reativos. As aplicações reativas são projetadas para serem elásticas, resilientes e orientadas a eventos, permitindo mitigar problemas comuns como alta latência e baixa escalabilidade em ambientes concorrentes. Com a combinação de Akka para gerenciamento de atores e o Play Framework para a construção de APIs, você ganhará flexibilidade e performance em suas aplicações. Vamos cobrir desde a configuração do ambiente até a implementação de um sistema reativo completo, fornecendo exemplos de código práticos e detalhados ao longo do caminho.
Etapas
Configuração do Ambiente de Desenvolvimento
Antes de começarmos, certifique-se de ter o Scala e o SBT (Scala Build Tool) instalados em sua máquina. Você pode verificar a instalação usando os comandos `scala -version` e `sbt sbtVersion`. Caso não tenha, siga as instruções no site oficial do Scala.
commands# Verificar versões instaladas
scala -version
sbt sbtVersionCriação do Projeto com SBT
Utilize o SBT para criar um novo projeto Scala. Crie uma nova pasta para o seu projeto e navegue até ela. Execute `sbt new scala/scala-seed.g8` para criar a estrutura básica do projeto.
commands# Criar nova pasta do projeto
mkdir meu-projeto-akka-play
cd meu-projeto-akka-play
# Criar o projeto Scala
sbt new scala/scala-seed.g8Adicionando Dependências no Build.sbt
Abra o arquivo `build.sbt` e adicione as dependências para Akka e Play Framework. Assim, você poderá usar essas ferramentas em seu projeto.
build.sbtname := "meu-projeto-akka-play" version := "0.1" scalaVersion := "2.13.10" dependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.6.16", "com.typesafe.akka" %% "akka-stream" % "2.6.16", "com.typesafe.akka" %% "akka-http" % "10.2.9", "com.typesafe.play" %% "play" % "2.8.15" )
Implementação de um Ator Básico com Akka
Crie uma classe de ator simples que processa mensagens. Os atores em Akka são unidades fundamentais que respondem a mensagens de forma assíncrona.
MyActor.scalaimport akka.actor.{Actor, ActorSystem, Props} class MyActor extends Actor { def receive = { case msg: String => println(s"Recebido: $msg") } } object ActorMain extends App { val system = ActorSystem("MeuSistema") val myActor = system.actorOf(Props[MyActor], name = "meuAtor") myActor ! "Olá, Akka!" }
Configurando o Play Framework
Crie um controlador no Play Framework para lidar com requisições HTTP. Isso permitirá expor suas funcionalidades via API REST.
MyController.scalaimport play.api.mvc._ import javax.inject._ @Singleton class MyController @Inject()(val controllerComponents: ControllerComponents) extends BaseController { def index = Action { Ok("Bem-vindo ao Play Framework!") } }
Configurando Rotas no Play Framework
Defina as rotas do seu projeto no arquivo `conf/routes`. Esse arquivo mapeia as URLs para as ações de controle apropriadas.
conf/routesGET / controllers.MyController.index
Executando a Aplicação
Utilize o SBT para compilar e executar a aplicação. Isso iniciará o servidor e você poderá acessar a API a partir do navegador ou ferramentas como Postman.
commands# Compilar e executar a aplicação
sbt run
# Acesse a aplicação via navegador
http://localhost:9000Testes Unitários com Akka
Crie testes unitários para validar a funcionalidade do ator que você implementou. O Akka possui suporte para testes que permitem validar a comunicação entre atores.
MyActorSpec.scalaimport akka.actor.ActorSystem import akka.testkit.{TestKit, TestProbe} import org.scalatest.{BeforeAndAfterAll, Matchers, WordSpecLike} class MyActorSpec extends TestKit(ActorSystem("test-system")) with WordSpecLike with Matchers with BeforeAndAfterAll { "Um Ator" must { "responder a mensagens" in { val probe = TestProbe() val actor = system.actorOf(Props[MyActor]) probe.send(actor, "Teste").expectMsg("Recebido: Teste") } } override def afterAll(): Unit = { TestKit.shutdownActorSystem(system) } }
Conclusão
Neste tutorial, você aprendeu a desenvolver aplicações escaláveis utilizando Scala, Akka e Play Framework. Iniciamos com a configuração do ambiente, criamos um projeto do zero com SBT, implementamos um ator básico com Akka e configuramos um controlador no Play Framework. O entendimento das funções desses componentes é fundamental para o desenvolvimento de sistemas reativos e escaláveis. Ao final, mostramos como executar a aplicação e criar testes unitários, garantindo a eficácia e robustez do seu software. Agora você está preparado para explorar ainda mais as capacidades do Scala e aplicar esses conhecimentos em projetos reais.