Camel, Camel K e Kamelets no Tchelinux

Recentemente eu tive a honra de participar do super evento Tchelinux (um evento online com mais de 40 horas de conteúdo gratuito) . Na palestra que eu preparei para este evento eu falarei um pouquinho sobre os desafios de integração de sistemas na era da computação em nuvem. Nessa palestra eu apresento o Apache Camel, Camel K, Camel JBang e Kamelets.

Confira a palestra para aprender um sobre como tudo isso se relaciona e como essas tecnologias podem acelerar a maneira como você desenvolve integrações. A palestra vai ao ar nessa quarta-feira, dia 18 de novembro.

Atualizações do ebook grátis: Camel Passo a Passo

Recentemente eu fiz uma atualização no e-book sobre Apache Camel. Essa atualização vem com algumas alterações importantes:

  1. Eu converti o e-book para um website com visual moderno e bonito. Assim fica muito mais fácil de manter o conteúdo atualizado. O link para acessar o livro é: http://angusyoung.org/camel-passo-a-passo/. A partir de agora, não irei mais manter as versões em PDF ou e-pub.
  2. Atualizei o material para o #Apache #Camel 3.11.1. O exemplo com #Camel #Quarkus foi atualizado para a versão 2.2.0. Minha intenção é fazer pequenas revisões do livro a cada nova versão de suporte estendido (LTS – long-term support) do Apache Camel. A próxima versão LTS será a 3.14 (por sinal, vale notar que essa será a última versão que suportará o Java 8).
  3. Adicionei algumas informações sobre funcionalidades que não tinha mencionado anteriormente: Camel Main, links para APIs relevantes. Também melhorei as explicações sobre funcionalidades em diversas partes do texto, bem como corrigi alguns erros.
  4. E o mais importante de tudo, a partir de agora todo o texto do livro está disponível no GitHub. Desta forma, basta abrir um ticket ou um pull request no repositório do livro caso alguém encontre algum problema, queira oferecer alguma sugestão ou contribuir com algum material. O endereço do repositório é: https://github.com/integracao-passo-a-passo/ebook.

Conhecendo o JBang

O JBang é uma aplicação que permite executar códigos em Java sem a necessidade de compilar diretamente o código e/ou criar projetos usando Maven ou Gradle. Simplificando, o JBang traz para o Java a agilidade dos scripts em Shell ou Python com o poder e a flexibilidade do Java.

O JBang pode ser instalado facilmente usando o SDKman!:

sdk install jbang

Uma vez instalado, você pode gerar um projeto a partir de um template padrão:

jbang init -t cli hello.java

Como resultado desse comando, ele irá criar um arquivo hello.java com um conteúdo parecido com o seguinte:

///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS info.picocli:picocli:4.5.0

import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Parameters;

import java.util.concurrent.Callable;

@Command(name = "hello", mixinStandardHelpOptions = true, version = "hello 0.1",
        description = "hello made with jbang")
class hello implements Callable<Integer> {

    @Parameters(index = "0", description = "The greeting to print", defaultValue = "World!")
    private String greeting;

    public static void main(String... args) {
        int exitCode = new CommandLine(new hello()).execute(args);
        System.exit(exitCode);
    }

    @Override
    public Integer call() throws Exception { // your business logic goes here...
        System.out.println("Hello " + greeting);
        return 0;
    }
}

Algumas particularidades interessantes do arquivo acima:

//DEPS org.grupo:dependencia:${dependencia.versao}

O JBang permite gerenciar dependências de diversas maneiras, a mais comum sendo através desse tipo de linha de configuração (modeline) precedida por //DEPS.

As dependências são referenciadas através da nomenclatura GAV (grupo, artefato, versão) no formato: G:A:V. Além disso é possível tanto usar BOM POMs para facilitar o gerenciamento de versões quanto trocar a versões fixas no código por propriedades que podem ser passadas por linha de comando:

//DEPS org.grupo:dependencia:${dependencia.versao}

Tornando possível executar o projeto usando algo semelhante ao seguinte:

jbang -Ddependencia.versao=2.0.1

Outra particularidade muito interessante do JBang é o uso do projeto PicoCLI para o gerenciamento das opções de linha de comando, o que permite tornar o script bastante flexível de maneira bastante elegante e direta.

Para executar esse arquivo você pode rodar:

./hello.java

ou

jbang run hello.java

Ao executar qualquer um dos comandos acima, temos o resultado esperado que é a impressão da famosa mensagem “Hello World”. E claro, também podemos brincar com a PicoCLI para mudar parte da mensagem:

jbang run hello.java --gretting Mundo!
Hello Mundo!

Obviamente essa é só uma introdução bastante simples sobre o JBang. A capacidade de utilizar as inúmeras bibliotecas reutilizáveis que temos disponíveis em Java, torna o projeto bastante interessante para desenvolvedores com a necessidade de automatizar tarefas e que, talvez, não se sintam confortáveis com Shell Scripts. Além disso pode ser uma plataforma extremamente interessante para desenvolvedores iniciantes, pois remove a necessidade de gerenciar os projetos com Maven ou Gradle.

Projetos interessantes pra acompanhar no universo Kafka

Recentemente um amigo me perguntou sobre alguns projetos interessantes no universo Kafka. E eu separei 3 projetos que eu acompanho, 1 dos quais eu contribuo, e que acho interessantes. É uma lista bem pessoal e nem de longe representa toda a riqueza do universo Kafka.

O Strimzi é um projeto que facilita o trabalho de rodar o Kafka em Kubernetes (k8s) e suas distribuições (OpenShift, GKS, k3s, etc). O Kafka é relativamente complicado para gerenciar e botar em produção, e ainda mais complicado de rodar dentro de Kubernetes. Esse projeto abstrai a maior parte da complexidade de manter um cluster Kafka rodando nesse tipo de ambiente.

O Camel Kafka Connector (disclaimer: eu contribuo com esse projeto) é um runtime do Apache Camel que envelopa todos os mais de 300 componentes do Camel e permite roda-los como conectores dentro de uma instância do Kafka Connect. O Kafka Connect é um componente do Kafka pra rodar programas que movem dados pra dentro ou pra fora do Kafka. Na maior parte das vezes você consegue fazer integrações pra dentro ou fora do Kafka sem precisar escrever uma linha de código sequer.

O Debezium é um projeto pra Change Data Capture (CDC) e que permite capturar as alterações que ocorrem e um banco de dados e publicá-las no Kafka. O Debezium usa a API do Kafka Connect para rodar seus “source connectors”.

Ebook grátis: Camel Passo a Passo

Em 2014 eu escrevi um mini e-book sobre integração de sistemas com Apache Camel. Naquela época o Apache Camel encontrava-se por volta da sua versão 2.10.x. Desde então, graças a velocidade de inovação da comunidade Open Source, inúmeras mudanças e melhorias foram feitas no Apache Camel (que hoje está em sua versão 3.6 ou 3.4.4 na versão LTS). Além disso, ao longo dos anos o projeto Camel foi adicionando números subprojetos novos, como o Camel Quarkus, o Camel Kafka Connector e o Camel K.

Para atualizar o livro para as versões atuais do Camel e cobrir um pouco sobre os novos subprojetos eu resolvi fazer uma extensa atualização na edição passada. Essa nova atualização também conta com algumas atualizações de cenários de integração, dando maior enfoque nos projetos de integração da Apache como o Apache Kafka e o Apache Artemis (futura nova geração do Apache ActiveMQ).

Hoje eu resolvi liberar uma versão preliminar do ebook que, ressalto, está disponível completamente de graça e sem custo algum. Essa é uma versão preliminar que cobre, no momento, detalhes básicos sobre integração de sistemas com Camel e uma introdução sobre o Camel Quarkus (para integrações subatômicas e supersônicas com Java). O livro vêm com alguns exemplos comentados que dão uma noção básica do funcionamento e servem de acompanhamento para os trechos de código do ebook.

Como o livro ainda é uma versão preliminar, é bastante possível que contenha alguns erros e pequenas inconsistências. Neste caso, eu agradeceria comentários e correções que pudessem ajudar a melhorar o conteúdo do livro através do meu email pessoal (angusyoung@gmail.com).

Os livros estão disponíveis em formato PDF e epub em formato amigável para leitura em tablets (como o iPad) e podem ser baixados nos seguintes links:

Obs.: alguns leitores de epub podem exibir a formatação de código levemente diferente do esperado, mas sem implicar em qualquer perda de conteúdo.

Diminua o tempo dos builds com Maven Daemon

Desde sua versão inicial, em 13 de julho de 2004, o Apache Maven promoveu uma revolução na forma como projetos Java são desenvolvidos. Esse projeto, que começou com um subprojeto do Apache Turbine em 2002, modernizou a forma como o projetos gerenciavam as dependências em Java (entre muitas outras inovações, na verdade). Até então, as estratégias mais comum para construir projetos em Java eram baseados no Apache Ant, Makefiles ou Shell Scripts.

Após todos esses anos o Maven continua sendo uma ferramenta poderosa e popular. Entretanto, tendo sido inicialmente desenvolvido em uma época que as CPUs mais comuns eram Pentium 4 e semelhantes, ou até mesmo, com as Intel Core 2 Duo, populares por volta de 2010 quando a atual série 3.x do Maven foi lançada, o Maven mostra algumas limitações em utilizar todo o poder de processamento em paralelo das CPUs da atualidade.

Embora o Maven tenha suporte a paralelização do processo de build, esse processo é bastante rudimentar e não costuma ser muito confiável ou estável. Com os projetos atuais se tornando cada vez maiores e mais complexos, utilizar todo o poder de processamento disponível para diminuir o tempo de build se tornou cada vez mais urgente.

Pensando nisso, um grupo de programadores da comunidade open source resolveu utilizar o técnicas utilizadas em outros sistemas de build, como o Gradle, para melhorar a capacidade do Maven em utilizar esse poder de processamento disponível, otimizar a utilização de recursos e diminuir o tempo de build dos projetos.

O resultado desse trabalho é o Maven Daemon (também conhecido como mvnd). Esse projeto, desenvolvido em cima do próprio Maven, utiliza as seguintes técnicas para aumentar o desempenho do Maven:

  • Usa um daemon, mantido em memória para rodar os builds, evitando múltiplas execuções da JVM.
  • Utiliza um cliente nativo, construído com a GraalVM, para uma inicialização quase imediata.
  • Cache de classes dos plugins do Maven, reutilizado entre múltiplos builds.
  • Utilização de builds em paralelo por padrão, fazendo melhor uso do poder de processamento disponível no sistema.

Todo esse trabalho de otimização resulta numa considerável diminuição do tempo de build. Usando, por exemplo, um dos projetos que contribuo com frequência, esse tempo cai de 32 minutos e 51 segundos com o Maven para 7 minutos e 16 segundos com o mvnd.

Em comparação com um build feito com o mvnd, o build Maven padrão fica parecendo uma lesma com preguiça numa segunda-feira de manhã 🐌:

O processo de instalação do mvnd é bastante simples e não difere muito do que já ocorre com o Maven. Basta extrair os arquivos de instalação de exportar o diretório bin para o PATH. Usuários do igualmente fantástico SDKMAN! podem instalá-lo ainda mais facilmente usando o seguinte comando:

sdk install mvnd 0.0.9

Para rodar os builds com o mvnd, basta utilizar o comando mvnd ao invés do tradicional mvn. Todas as opções do Maven são completamente aceitas e compatíveis e não é necessário fazer nada mais.

Por fim, é possível que alguns builds apresentem problemas ao rodarem em paralelo. Isso geralmente é causado por plugins desatualizados ou, infelizmente, incompatíveis. Nesse caso, a recomendação é atualizar ou desabilitar o plugin mal comportado.

Configurando o Foreman para Provisionamento com a Libvirt

Introdução

O objetivo desse artigo é fornecer um guia rápido de como configurar o Foreman para que ele possa provisionar máquinas virtuais usando as funcionalidades fornecidas pela libvirt. Ele fornece um material adicional de apoio à excelente documentação fornecida pelo projeto. Esse guia foi feito levando em conta um ambiente com Red Hat Enterprise Linux 6.7 ou 7.2, devendo funcionar sem maiores problemas em ambientes baseados em CentOS 6 ou 7.

Sobre o Foreman

O Foreman é uma ferramenta que permite gerenciar o ciclo de vida de servidores físicos ou virtuais, facilitando o provisionamento de sistemas e aplicações, automação de tarefas e, de modo geral, facilitando o gerenciamento de servidores. Entre outras coisas, ele permite a instalação desassistida de máquinas virtuais e o seu provisionamento em “Compute Resources” como OpenStack, Amazon EC2 e libvirt. Para ter uma ideia de como ele funciona, recomendo esse vídeo:

Continue reading “Configurando o Foreman para Provisionamento com a Libvirt”

Ebook: Integração de Sistemas com Apache Camel

Eu escrevi um mini-livro que descreve os conceitos básicos do Apache Camel e padrões de integração. Dois exemplos de integração de sistemas acompanha o conteúdo do livro: o primeiro deles contém uma implementação básica de um sistema back-end usando Active MQ e Apache Camel e o segundo contém uma implementação simples de um broker usando Apache Camel.

O livro pode ser baixado, em PDF, aqui. Os exemplos estão disponíveis no meu GitHub ou aqui.