A Oracle apresentou um novo framework chamado Project Helidon, composto por uma coleção de bibliotecas Java projetadas para criar aplicações baseadas em microservices, que unem o Payara Micro, Thorntail (antiga WildFly Swarm), o OpenLiberty, e o TomEE a família MicroProfile.
Chamado originalmente de J4C (Java for Cloud), o Helidon foi projetado para ser simples e rápido e é composto de duas versões: a Helidon SE e a Helidon MP. A versão Helidon SE apresenta três núcleos de APIs para criar aplicações baseadas em microservices, um web server, um núcleo de configuração e um outro de segurança. A versão Helidon SE não precisa de um servidor de aplicação. A versão Helidon MP suporta a especificação MicroProfile na versão 1.1 para construir aplicações baseadas em microservices.
Web Server
Inspirado no Node.JS e no framework do Java, o web server do Helidon é uma API assíncrona e reativa que é executado utilizando o Netty. A interface WebServer inclui suporte para a configuração, roteamento, manipulação de erro e a construção de endpoints de métricas e saúde.
O exemplo de código abaixo demonstra como iniciar um servidor web simples para apresentar o texto "It works!" em uma porta randomicamente disponível:
// starts the server on a random available port
public void startWebServerUsingRandomPort() throws Exception {
WebServer webServer = WebServer
.create(Routing.builder()
.any((req,res) -> res.send("It works!" + "\n"))
.build())
.start()
.toCompletableFuture()
.get(10,TimeUnit.SECONDS);
System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
webServer.shutdown().toCompletableFuture();
}
Configuração
O componente de configuração Config carrega e processa a configuração das propriedades no formato chave/valor. Por padrão, a configuração das propriedades será lida de um arquivo definido application.properties ou application.yaml localizado no diretório /src/main/resources.
O exemplo de código abaixo demonstra como utilizar o Config e constrói sob o exemplo anterior ao ler o arquivo applications.yaml para especificar a porta em que o Web server iniciará.
// application.yaml
server:
port: 8080
host: 0.0.0.0
// starts the server on a port defined in application.yaml
public void startWebServerUsingDefinedPort() throws Exception {
Config config = Config.create();
ServerConfiguration serverConfig = ServerConfiguration.fromConfig(config.get("server"));
WebServer webServer = WebServer
.create(serverConfig,Routing.builder()
.any((req,res) -> res.send("It works!" + "\n"))
.build())
.start()
.toCompletableFuture()
.get(10,TimeUnit.SECONDS);
System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
webServer.shutdown().toCompletableFuture();
}
Segurança
A classe de Segurança disponibiliza suporte para autenticação, autorização e auditoria. Alguns provedores de segurança foram implementados para serem usados em aplicações com o Helidon: de um construtor, por configuração ou um híbrido dos dois.
O exemplo de código abaixo mostra como implementar uma instância de Segurança, como usar o Config para obter autenticação de um usuário (com senha encriptada), e como mostrar a hora do servidor.
// application.yaml
http-basic-auth:
users:
login: "mpredli"
password: "${CLEAR=somePassword}"
roles: ["user","admin"]
Config config = Config.create();
Security security = Security.builder()
.config(config)
.addProvider(...)
.build();
String user = config.get("http-basic-auth.users.login").asString();
String password = config.get("http-basic-auth.users.password").asString();
System.out.println("\n");
System.out.println("INFO: user = " + user);
System.out.println("INFO: password = " + password);
SecurityTime time = SecurityTime.builder().build();
time = security.getServerTime();
System.out.println("INFO: server time = " + time.toString());
System.out.println("\n");
Mais exemplos sobre segurança podem ser encontrados no GitHub.
A arquitetura do Helidon
O relacionamento entre o Helidon SE e o Helidon MP é apresentado no diagrama de arquitetura.
O gráfico abaixo mostra onde o Helidon SE é o Helidon MP se encaixam nas categorias de frameworks de microservices.
Getting Started
O Helidon possui exemplos de início rápido que demonstram as diferenças entre o Helidon SE e o Helidon MP. Os comandos Maven e Java abaixo irão gerar e empacotar um exemplo do Helidon SE que cria um serviço REST usando o web server do Helidon.
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-se \
-DarchetypeVersion=0.10.1 \
-DgroupId=io.helidon.examples \
-DartifactId=quickstart-se \
-Dpackage=io.helidon.examples.quickstart.se
$ cd quickstart-se
$ mvn package
$ java -jar target/quickstart-se.jar
Os comandos Maven e Java abaixo irão gerar e empacotar um exemplo do Helidon MP que cria um serviço REST usando a API JAX-RS do MicroProfile.
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-mp \
-DarchetypeVersion=0.10.1 \
-DgroupId=io.helidon.examples \
-DartifactId=quickstart-mp \
-Dpackage=io.helidon.examples.quickstart.mp
$ cd quickstart-mp
$ mvn package
$ java -jar target/quickstart-mp.jar
Uma vez que o servidor está executando, os comandos seguintes podem ser executados:
O projeto completo do Helidon pode ser encontrado no GitHub.
Dmitry Kornilov, gerente sênior de desenvolvimento de software na Oracle falou com o InfoQ sobre este novo projeto.
InfoQ: O que inspirou a Oracle a desenvolver este novo framework para microservices?
Dmitry Kornilov: O trabalho no Helidon começou a algum tempo atrás, quando a arquitetura de microservices começou a se tornar muito popular para criar serviços na nuvem, a experiência no desenvolvimento também precisava mudar. O Java EE é uma tecnologia estável mas possui muito código legado. Então, ao invés de construir os microservices usando o Java EE, nós percebemos que precisávamos de um novo framework que fosse projetado para construir os microservices do zero. Foi assim que o Helidon nasceu.
InfoQ: O que torna o Helidon único em meio às outras implementações do MicroProfile como o OpenLiberty, Thorntail, Payara Micro e TomEE?
Kornilov: O Helidon não é apenas uma implementação do MicroProfile. Ele vem com dois sabores: o Helidon SE e o Helidon MP.
O Helidon SE forma o núcleo do Helidon. É um leve conjunto de bibliotecas que podem ser usadas separadas, mas quando usadas juntas fornecem a base que um desenvolvedor precisa para criar um microservice: a configuração, segurança e um servidor web, o que traz uma abordagem mais moderna e reativa que os desenvolvedores gostam. Nós tentamos deixar isto bem claro: não é usada nenhuma injeção "mágica", que faz com que a aplicação com o Helidon SE seja fácil de debugar. Não há um formato especial do jar, sem classloaders especiais. Sua aplicação é apenas uma aplicação vanilla do Java SE. Isto também significa que é compatível com todas as IDEs sem nenhum plugin necessário.
O Helidon MP é a nossa implementação MicroProfile e é construída com o Helidon SE, não é derivada de uma aplicação. Então não há um modelo de publicação, empacotamento do Java EE ou coisas extras que você não precisa.
InfoQ: Por que foi implementada a especificação 1.1 do MicroProfile ao invés de uma versão mais recente?
Kornilov: o desenvolvimento do Helidon iniciou há algum tempo atrás e nós decidimos manter a versão do MicroProfile que era a mais recente na época. Nós estamos evoluindo continuamente o Helidon e o suporte para uma versão mais recente do MicroProfile virá em breve.
InfoQ: Quais as previsões para o Helidon especialmente em termos de suporte ao Jakarta EE é versões mais recentes da especificação MicroProfile?
Kornilov: Já estamos trabalhando no suporte de uma versão mais recente do MicroProfile. Quando tivermos visibilidade do novo Jakarta EE nós iremos nos juntar a eles no desenvolvimento e suportá-los com o Helidon. Nós também planejamos adicionar funcionalidades do Oracle Cloud Integration ao Helidon, suporte a HTTP client, um projeto de web app inicial, e melhorar constantemente nossos exemplos e documentação.
Referências
- Helidon Takes Flight por Dmitry Kornilov (7 de setembro de 2018)
- Oracle Releases New Java Microservices Framework por John Waters (10 de setembro de 2018)
- Microservices From Dev to Deploy, Part 1: Getting Started with Helidon por Todd Sharp (3 de outubro de 2018)
Evolução natural
by Diego Andrade,
Evolução natural
by Diego Andrade,
Seu comentário está aguardando aprovação dos moderadores. Obrigado por participar da discussão!
É notável a evolução do Java depois da venda para a Oracle.
Com certeza vou testar o Helidon!!