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)