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

  1. 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 sbtVersion

  2. Criaçã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.g8

  3. Adicionando 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.sbt
    name := "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"
    )

  4. 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.scala
    import 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!"
    }

  5. 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.scala
    import play.api.mvc._
    import javax.inject._
    
    @Singleton
    class MyController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {
      def index = Action { Ok("Bem-vindo ao Play Framework!") }
    }

  6. 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/routes
    GET    /                controllers.MyController.index

  7. 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:9000

  8. Testes 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.scala
    import 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.

Hashtags

#Scala #Akka #PlayFramework #SistemasReativos #DesenvolvimentoEscalável