Primeiras aulas do curso Apache Camel: O framework de integração entre sistemas

Apache Camel: O framework de integração entre sistemas

A primeira rota com Camel - Vídeo 1

Olá alunos! Bem-vindos aqui na Alura e ao nosso treinamento de padrões de integração com Apache Camel. Eu sou Nico, sou o instrutor desse treinamento e vou acompanhar vocês nas próximas video aulas.

No treinamento sobre Apache Camel, qual é a nossa motivação? A motivação é a integração entre as aplicações. Nenhuma aplicação hoje em dia vive sozinha, nós temos que puxar dados para outras aplicações, pegar os dados e as fazer mudanças. Fazer isso bem feito é difícil.

Por que isso é difícil? Primeiro, podemos dizer que nós temos vários formatos no mercado que são usados na interação. No primeiro lugar, talvez o XML, JSON. Mas existem vários outros formatos, como arquivos posicionais, esse CSV.

Temos que lidar com esses formatos e normalmente não existe um só formato, no mundo XML, existem vários subpadrões. Também podemos aplicar para JSON como XPath para buscar elementos, transformar elementos través de XSL.

Ou seja, só por causa dos formatos, já vem uma certa complexidade na integração. E não para por aí, pois os formatos são uma coisa e os protocolos são outra. Na web, lógico, eu preciso trabalhar com HTTP.

Quem acessa um serviço mais “enterprise”, no SOAP temos que lidar com esse XML mais especifico. Na mensageria tem o AMQP, o FTP para a troca de arquivos, ou acessando o banco de dados através do SQL. Além de outros protocolos que existem. Isso também vai aparecer na integração e nós temos que lidar com esses padrões e protocolos. Esses são padrões e formatos independentes da plataforma.

Agora, não basta, como desenvolvedor Java. Eu preciso saber as bibliotecas que atendem esses padrões, ou seja, há uma grande complexidade na integração em cima do desenvolvedor e fazer isso de maneira robusta, pensando no tratamento de erro, não é uma tarefa fácil.

Durante o desenvolvimento vários desenvolvedores identificaram algumas boas práticas na integração e começaram a descrever tudo em livro, em um catálogo de padrões. Assim como existem padrões de projeto no mundo de orientação de objetos, também existem padrões de projetos no mundo de integração.

O livro mais famoso “Enterprise Integration Patterns” descreve as boas práticas na integração. O Apache Camel, justamente, implementa a maioria desses padrões. Apache Camel é uma mão na roda das integrações, ele vai te ajudar a lidar com todos esses formatos e protocolos, seguindo essas boas práticas desses padrões de integração.

Então, como funciona, não querendo dar uma grande introdução, o Apache Camel? O que ele é? Podemos pensar de forma simplificada que ele é um entregador de correios. Ele pega os dados de um lugar e envia para outro. Você fala para onde vai e de onde vem, usando uma linguagem de alto nível.

Mas não para por aí. Porque de vez em quando você quer pegar os dados de um banco de dados e enviar para algum serviço e para uma fila , ou escrever um arquivo em algum lugar. Então você pode falar para esse entregador para mandar esses dados para dois lugares.

Eu posso falar para o entregador pegar os dados de dois lugares e juntar eles. Agora, com isso eu posso manipular os dados, transformar os dados, filtrar as informações. Eu posso dividir o conteúdo, pegar esse envelope grande e dividir em sub mensagens, fazer validações e transformações... A lista é longa.

Então com o Apache Camel você define esses passos que os dados vão fazer entre as ocupações de alto nível. Você fala que define uma rota. O Apache Camel é uma “roating engine”, uma máquina de roteamento, é isso que você faz com ele. No meio desse roteamento você faz essas transformações, filtra e divide o conteúdo.

Essas configurações (de onde vem os dados e para onde vão) são feitas através de uma linguagem de alto nível, que se chama Camel DSL. “DSL” significa: “Domain Specific Language”, uma linguagem especifica para definir essas integrações.

Então como seria, agora de verdade, essa linguagem? Não é português? São métodos que chamamos no final de “from”, que é de onde vem os dados no meio termo entre “from” e “to” (onde vão os dados).

Agora eu posso fazer essas transformações, filtros, splits, aggregations. Eu posso fazer muita coisa! O Camel é uma mão na roda, uma grande ajuda na integração de alto nível para trabalhar com todos esses padrões e protocolos.

Vamos ver agora o Apache Camel funcionando, vamos começar a utilizar esse Camel DSL!

A primeira rota com Camel - Vídeo 2

Vamos lá, mãos a obra! Mas qual é a nossa ideia? Qual é o nosso projeto concreto para usarmos o Apache Camel? A ideia é que vamos fazer uma rota de pedido. Teremos uma loja virtual como Casa do Código, por exemplo, quando um cliente faz uma compra lá, e essa loja virtual gera um pedido. Ele envia esse pedido, esse XML, para um fila JMS.

O Apache Camel precisa agora pegar essa mensagem XML e fazer a integração com outros sistemas, como usamos aqui o sistema SOAP e vamos usar esse sistema com HTTP/JSON. É claro que pensando no tratamento de erro. Para nós começarmos, eu preparei um projeto, então peço a vocês que parem o vídeo e irem ao primeiro exercício, lá vocês acharam o zip para baixar.

Eu já baixei esse zip aqui na minha pasta e vou extrair rapidamente. Esse projeto que eu vou importar agora é um projeto Maven. Você que não gosta do Maven ou quem não conhece, quem não quer não precisa usá-lo. Mas vocês precisam criar um novo Java project. Para quem segue do Maven, peço agora para continuar no vídeo e importar o projeto. Importe a pasta que acabamos de extrair.

A primeira vez que vocês importam o projeto vai demorar um pouco, ele vai criar aqui uma pasta que ficará baixando depois todos os arquivos, até vai dificultar um pouco a visualização no início. Aqui na máquina demorou 15 minutos porque o Maven começou a trabalhar para baixar todas as dependências- o que pode levar um tempo.

Novamente, para quem não gosta do Maven, crie um projeto Java e baixe o arquivo que também está disponível nesse primeiro exercício, mas você precisa adicionar tudo manualmente.

Agora sim, tudo preparado! Vamos começar? Tem já uma classe chamada “RotaPedidos.java”, que é justamente a classe que vai definir a rota de pedidos. Aqui também inicializei o Camel e criei esse tal de “CamelContext”. A partir dele iremos definir a nossa primeira rota.

Irei usar “context.addRoutes”. Para adicionarmos uma rota nós vamos usar um “RouteBuilder()”. Tome cuidado e use no singular! Vamos já subscrever criando uma classe anônima. Agora só falta importarmos e escrevermos um método “configure”

Agora nós vamos definir nossa rota, ou seja, aqui dentro vou usar esse método que mostrei, o “from”, para falar: “olhe, esses são dados de algum lugar. E vou falar para onde vão esses dados “to”.

Só que agora aqui dentro preciso definir direitinho da onde vem os dados, banco de dados, JMS, um serviço app. Para nós começarmos, sem configurarmos muita coisa, vamos simplificar nossa vida um pouco. Repare que o projeto já tem uma pasta chamada “pedidos”, então ao invés de lermos as mensagens de um file JMS, vamos ler essas mensagens aqui de uma pasta.

Então agora eu vou acessar a pasta através de um componente que nos é disponível, chamado file. Estou falando como é chamado a pasta “pedidos”. Eu quero ficar olhando o tempo todo, então vou falar para o Camel, para descansar um pouco, fazer isso a cada 5 segundos. Vou definir aqui um “delay”. Repare que aqui já temos algo muito complexo com o nome da pasta e os parâmetros.

Eu até posso definir mais de um parâmetro, mas vamos fazer isso depois. Agora, o que vou fazer com meus pedidos? É só definir a rota e mandar para outra pasta. A ideia é, na verdade, fazer a integração com os serviços, mas com calma. Então a minha rota mais simples na pasta é enviar um XML para outra pasta.

A rota já está definida, falta agora inicializar o Camel, mas faço isso depois desses Routes. Vamos chamar o “context.start()”. O Camel já vai inicializar e começar a trabalhar, só que quando esse método acaba, o Camel também será finalizado.

Então vamos dar um tempo para que um “threat.sleep(20000);” e com um “context.stop();” nós vamos dar um “stop” no Camel. Já temos nosso Camel inicializado, com a rota configurada e “start-stop” aqui. Vamos rodar: “Run As” e “2 Java Application”

O que vou fazer aqui? Primeiro eu vou abrir o console para nós acompanharmos. Mas ele já terminou a rota-pedido, foram só 20 segundos. Agora eu vou fazer alguma coisa no meio, para ficar mais fácil.

O Camel oferece um componente “log”, em que posso dar alguma mensagem, mas eu quero acompanhar o Camel para saber o que ele faz. Ele nos oferece uma pequena linguagem de expressões.

Cada mensagem que o Camel lê, cada dado lido, possui internamente uma ID. Então eu posso logar aqui através do “log(“${id}”).”, a ID da mensagem. Ao rodar, agora deveria aparecer algumas informações.

Para funcionar, nós precisamos copiar os pedidos de volta na pasta “pedidos” e rodarmos novamente. Reparem aqui que apareceu 4 mensagens. Aqui é o ID que imprimimos. Por que temos 4? Porque temos 4 XML!

Então cada arquivo, o Camel leu, transformou isso internamente em uma mensagem dele e deu uma ID pra ele. Até podemos fazer mais coisas aqui através dessa “expression language”. Eu posso mostrar o “body” da mensagem no final do meu arquivo XML.

Vamos testar novamente! Só que eu vou fazer algo a mais. Percebam que sempre preciso copiar esses arquivos de volta. Para facilitar nossa vida, eu vou adicionar mais um parâmetro aqui no componente, que fará no “noop-true”, ou seja, na verdade ele não apaga os arquivos da pasta “pedidos”, ele fica quieto, só trabalhando.

Rodando novamente aqui, reparem que apareceu muito mais informações no console, apareceu aqui a ID da mensagem e também agora o XML do arquivo com os dados do pedido, na segunda mensagem e aqui de novo com o XML que está lá dentro. Reparem também que ele não tirou os arquivos da pasta “pedido”, porque eu coloquei esse comando.

Ainda não vamos acessar serviços externos, mas já posso mostrar uma transformação, ou seja, entre o “from” e o “to” eu posso fazer validações, transformações e dividir o conteúdo, dentre várias outras possibilidades. Mas como vocês viram aqui na imagem, um desses meus serviços que iria se conectar depois, não recebe um JSON. Eu tenho um XML, então vou transformar ele em um JSON.

E para isso, o Camel possui um método chamado “marshal”. Quem já trabalhou com HTTPS já viu esse método de “marshal” e “unmarshal”, de transformar um formato em outro. Quero fazer um “marshal”, mas transformar um XML em JSON, e já há um método prontopara isso.

Ou seja, depois de executar isso, a mensagem, o “body” da mensagem que está na rota, já deveria ser um JSON. Esse “body” nós já vimos, então vou tirá-lo e colocar uma nova mensagem de “log” aqui, para nós vermos um “body” novo, transformado e, na teoria, em um JSON.

Vou apagar os pedidos e reexecutar o nosso código. Fiquem de olho no console. Aparece aqui um “warning”, mas nós já vemos nosso JSON. São 4 JSONs, na teoria eu tenho vários. Vamos renomear os arquivos

Como funciona isso? Como eu descobrirei essas coisas? Esses parâmetros de “delay”... Eu vou mostrar isso rapidamente, acessando a página do Camel pelo navegador: “camelapache.org”.

A documentação é relativamente boa, conseguimos ler e testar bastante e aqui temos os componentes do Camel - que são muitos, mais de 100 componentes. Muitas coisas que o Camel sabe fazer e integrar.

O que nós estamos usando agora é “file” e vou procurar aqui o “file:”. Reparem que o componente faz parte do Camel Core. Clicando aqui ele me leva diretamente até a documentação desse componente que já usamos e os “options” dele.

Então vale a pena que vocês deem uma lida com mais calma em todas as opções. São muitas coisas, alguns já prontos para ler, apagar os arquivos automaticamente, acessar pastas etc.

Mas o que nós queríamos é mudar o nome, e para isso precisamos manipular o “header”. Eu vou procurar o “header”. Reparem que fizemos algo parecido. Aqui tem um “header”, aqui aparece o “direct”. Estamos usando o “file, vamos ver depois o que significa o “direct”. Aqui ele usa o “file”, mas ele muda o nome do arquivo, ou seja, seta um header com um nome especial (CamelFileName) e coloca aqui uma constante.

[13: 06] Vamos testar esse código copiando e colando no Eclipse. Iremos testar novamente, chamando de “pedido.json”. Vamos autorizar o JSON no console. Repare que agora apareceu só um “pedido.json”, deve ser o último, eu imagino. O problema é que criamos uma constante, sempre será esse nome, e não queremos. Queremos algo mais dinâmico, com um nome original e a extensão JSON.

E aqui de novo entra o “expression language”, eu posso usar: “${file:name}”. Então eu uso o “File:name” sem a extensão. A extensão padrão será “.json”. Só para interpretarmos isso tudo, nós podemos usar constante. Temos que usar outro método chamado “simple” para interpretarmos essas expressões de mais forma simples. Vamos salvar e executar novamente

Reparem que ainda aparece o XML, talvez eu tenha errado em alguma coisa. Faltou o “noext”. Vamos testar novamente e veremos se realmente funciona. Aperte a tecla “F5” para atualizar. Já aparece o “pedido.json” com o JSON do primeiro pedido

Já aprendemos bastante coisa, por agora, para praticarmos e revisarmos os exercícios. Peço a vocês para que façam eles agora. Até o próximo capitulo!

Separando e filtrando mensagens - Vídeo 1

Bem-vindos ao segundo capítulo do treinamento Camel na plataforma Alura. Revisando o que fizemos, definimos nossa primeira rota com Camel. Vimos que o Camel é uma máquina de roteamento, onde você fala de onde vêm os dados e para onde vão e ele faz alguma coisa no meio.

Camel é uma biblioteca em que você pode utilizar standalone, ou seja, separado, como estamos fazendo aqui no projeto, ou também integrar no seu projeto existente, sem problemas.

Definimos a primeira rota aqui e vimos esse método “from”. Você fala: “pegue aqui os arquivos dessa pasta ‘pedidos’ e depois mandamos isso para outra pasta”, ou seja, na verdade só usamos aqui o “file sharing” - assim se chama esse padrão.

Nesse capítulo, agora vamos continuar trabalhando no serviço HTTP que recebe o JSON. Lembrando que nós queremos definir essa rota, ou seja, recebendo as mensagens de um JMS, o Apache Camel faz essas transformações, validações etc. que estamos trabalhando, para se comunicar com dois serviços aqui, HTTP/JSON e um serviço SOAP. Vamos continuar focando nesse lado aqui.

Na minha rota eu já estou fazendo a transformação para JSON, no entanto, o meu serviço HTTP/JSON só deveria receber os pedidos com o formato “EBOOK”. Reparem, aparece aqui o formato de “EBOOK” e no outro “pedido”, acho que o segundo, tem um impresso. Isso ele não deveria receber, eu só quero que receba os “pedidos” com o item “EBOOK”.

Temos que, aplicando um padrão de projeto de integração, filtrar as nossas mensagens - e é claro que o Apache Camel nos dá suporte nisso. Vamos então, antes de logar o ID, filtrar, “filter()” - assim se chama esse método - as nossas mensagens. Como vamos filtrar? Há bastante formas de fazer isso.

No nosso caso, estamos trabalhando com o XML e por isso vamos usar aqui uma linguagem específica para acessar o nosso XML e extrair informações e fazer comparações. Essa linguagem se chama XPath, eu vou passar nesse método uma expressão “xpath”, só deixando isso aqui compilar.

O que vou colocar agora aqui dentro? Vamos dar uma olhada no meu pedido. Eu preciso acessar esse texto dentro do elemento “formato”. Então eu vou definir agora, através XPath, como acessar esse elemento “formato”. Reparem que o meu XML na raiz tem um “pedido”, então “/pedido/”.

Depois do “pedido” tem outros elementos, mas eu preciso agora navegar até o “formato”, ou seja, o próximo elemento que eu quero acessar é o elemento “/itens”. Depois do “itens/” vem o “/item”, e dentro do “/item” agora me interessa o “/formato”. Então já estou agora nesse elemento, com o XPath eu defino uma expressão dessa maneira.

Mas no “formato” agora não tem mais um super elemento e eu preciso agora acessar esse texto desse “formato”, então eu vou falar que eu quero acessar esse elemento através dos colchetes, usando a função “text”.

“text” vai me extrair agora o texto desse elemento “formato” que eu quero comparar e saber que esse texto, dentro do “formato”, é igual a ““EBOOK””, ou seja, isso é a minha expressão que vai devolver o “true” ou “false”. Então vou apertar as teclas “Ctrl + X” aqui, salvando e jogando isso dentro do XPath.

Até vou deixar isso um pouquinho mais bonito, para deixar claro que está relacionado um com o outro. O “filter” agora funciona através dessa expressão “xpath”, acessando confortavelmente de alto nível o meu XML. Como o XML é muito comum na integração, faz sentido que também conheçamos esse “xpath” para definirmos esse tipo de expressão.

Salvando a rota e executando. Vamos ver agora. Tem essas informações [DE INFO] em vermelho, mas que não me interessam. Agora, o que me interessa aqui é em preto, porque isso aqui, o “log” é que nós definimos através do Camel.

Vamos ver quantas mensagens eu tenho. Reparem, um JSON aqui. A primeira mensagem, segundo JSON, terceiro JSON e quarto JSON. Ou seja, na verdade todos os pedidos passaram.

Vamos dar uma olhada no conteúdo, o primeiro pedido realmente teve um “EBOOK”, como vimos aqui. O segundo pedido já tem uma coisa estranha: tem um “EBOOK”, mas também tem um item impresso. Isso eu não quero.

Eu quero que o meu serviço não receba informações sobre livros que não são “EBOOK”, eu só quero que ele receba itens que realmente são “EBOOK”. Não faz sentido enviar para esse serviço também itens que não são “EBOOK”. Ou seja, meu filtro funcionou, mas não o suficiente.

Antes que eu realmente filtre aqui o que eu vou fazer, voltando no segundo pedido, eu vou dividir meu conteúdo. Eu vou pegar essa mensagem do pedido e criar pequenas mensagens, submensagens.

Um pedido vai se transformar, nesse caso aqui, em duas submensagens, porque tem dois itens. Eu vou fazer isso e depois essas submensagens eu consigo filtrar com mais facilidade. Então vamos voltar, mãos à obra aqui!

Antes de filtrar, eu vou dividir o conteúdo. Como fazer isso? De novo, é um padrão de projeto de integração, o método aqui se chama “split()”. Como eu estou usando um XML, eu posso fazer um “split()” e dividir o conteúdo através de várias formas de novo aplicando um código meu, usando o método. Mas eu uso o XML aqui, então o que nós vamos fazer é usarmos o nosso já conhecido “xpath”.

E eu quero, voltando aqui para mostrar, dividir através do “/pedido/itens/item”. Então eu vou acessar esse elemento e cada item vai se tornar uma mensagem. Ele vai dividir através desse elemento.

Teclas “Ctrl + X” nessa expressão e jogando, aqui dentro, deixando a coisa compilar. Faltou o ponto. O que eu fiz aqui? O teclado está diferente, me enrolo um pouquinho. Salvando...

Fazer o “split()” e depois ir filtrando, ou seja, deveria ser diferente, até o JSON deveria ser diferente; porque nós transformamos, através desse split, o nosso XML e, consequentemente, o JSON.

Vamos executar e vamos ver. Eu vou aumentar um pouquinho aqui. Está executando e não funcionou. Muito bom! Vamos tentar descobrir o que está acontecendo aqui. Fizemos uma mudança no código e parou de funcionar. Vou parar aqui.

E para saber se nossa função de “split()”, o “xpath”, realmente funciona. Eu vou fazer um “log” logo depois desse “xpath”, aqui em cima, para ver se ele faz um “split”. Deveria dividir o conteúdo corretamente. Então limpando aqui, vamos executar de novo. Sim! Salvando, executando!

Reparem, agora apareceram mensagens aqui. Reparem que agora já há uma mudança, aparecem mais mensagens do que arquivos XML, seis mensagens. Aparentemente ele fez um “split” correto. Por quê? Aqui no primeiro “pedido” temos um item, a primeira mensagem.

No segundo “pedido” temos dois itens, segunda, terceira mensagem. No terceiro “pedido” temos mais dois itens, a quarta e quinta mensagem, ou seja, no quarto “pedido” deveria ter apenas um item. Certinho, tem apenas um item aqui, ou seja, cada item dentro dos meus XMLs se tornou uma mensagem - então o nosso “split” funcionou.

O que aconteceu? Vamos mostrar! Vou colocar aqui o “body” para ver o conteúdo, não só o ID da mensagem, que não me ajuda tanto. Vou reexecutar. Está fazendo... Já fez, então vamos dar uma olhada no nosso XML.

Reparem que o XML mudou, não tem mais um “pedido” no início, começa com “item” e por isso nosso “filter” parou de funcionar. Nós falamos que nosso XML começa com “pedido”, mas como fizemos a transformação, essa divisão de conteúdo, não começa mais com “pedido”. Agora é com “item”.

Para chegar no formato nossa expressão é até um pouquinho mais simples, basta falar: “pegue o ‘/item/formato’ e depois compare texto com ‘EBOOK’ ”. Então vamos testar de novo, limpando o [CONSOLE], acho que agora vai rolar. Executando, vamos ver...

Apareceu o XML, como já aparecia, e logo depois o XML. Apareceu aqui um “EBOOK”, certinho. Primeiro “item”. Vamos ver o segundo, item “IMPRESSO”, mas não deveria aparecer o JSON, exatamente, porque o filtro não deixou passar. Aparece o próximo “EBOOK”, aí sim, de novo, aparece o JSON porque é um “EBOOK”. “IMPRESSO” não deveria aparecer. Perfeito! Vocês já pegaram a ideia. Legal, conseguimos!

Vocês devem estar ansiosos para fazer a chamada HTTP, mas nós já vimos bastante coisas e vamos praticar um pouco. Essa chamada do serviço HTTP realmente vai ficar para o próximo capítulo, mas vocês vão ver que não é nada demais, com o Apache Camel nas mãos vai ficar bastante simples. Então mãos à obra! Exercícios e nós nos vemos no próximo capítulo!

Sobre o curso Apache Camel: O framework de integração entre sistemas

O curso Apache Camel: O framework de integração entre sistemas possui 118 minutos de vídeos, em um total de 77 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

  • 1269 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1269 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1269 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1269 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas