Java REST API Showdown: Qual é a melhor estrutura do mercado?

desenvolver serviços em Java, incluindo APIs de descanso, nem sempre foi fácil ou produtivo até que a primavera chegou e mudou a paisagem. Passaram-se muitos anos desde então, e surgiram novos quadros na comunidade.um destes quadros foi o Micronaut. É desenvolvido pela OCI, a mesma empresa por trás dos Grais, e seu objetivo é ajudar os desenvolvedores a criar micro-serviços e aplicações sem servidores.

Há também Quarkus, outro framework que ganhou popularidade no último ano. Desenvolvido pela RedHat, o Quarkus promete entregar o arranque rápido e menos uso de memória, dois problemas comuns ao desenvolver serviços de descanso em Java.

Com todas estas escolhas, há uma pergunta muito importante a fazer: como é fácil criar um serviço com cada um destes três frameworks?

neste tutorial, você vai criar uma aplicação de repouso seguro usando Spring, Micronaut e Quarkus para ver como eles diferem um do outro, e qual melhor se adequa às suas necessidades.

Índice

  • pré-Requisitos para o Seu Java API REST
    • Criar um Octa Conta para o Gerenciamento de Usuário
    • Gerar Tokens Usando OpenID Ligar o Depurador
  • Criar um Java API REST com Micronaut
    • Desenvolver o Seu Serviço Java
  • Criar um Java API REST com Quarkus
  • Criar um Java API REST com Spring Arranque
  • Pensamentos Finais sobre APIs REST Com Java: Micronaut, Quarkus, e a Primavera de Arranque

Se você quiser, você pode assistir a este tutorial de como um screencast. 👇

pré-requisitos para a sua API Java REST

este tutorial usa Maven 3+. Certifique-se de que está instalado e disponível para usar antes de continuar. Você certamente também pode usar Gradle, mas MMMV.

Você vai construir aplicativos que autenticam pedidos usando OAuth 2.0, garantido por uma aplicação Okta. Não tens uma conta da Okta? Não te preocupes, demora menos de um minuto a criar um novo. Não só isso, mas Okta suporta padrões como JWT, OAuth 2.0, e OIDC. Nós fornecemos suporte para frameworks bem conhecidos como Java EE, Spring Boot, e Spring Security. Heck, nós até temos um plugin Maven que automatiza tudo para você.não há necessidade de reinventar a roda!

crie uma conta Okta para a gestão de utilizadores

abra o seu terminal e execute o seguinte comando:

mvn com.okta:okta-maven-plugin:register

ser-lhe-á pedido para introduzir a seguinte informação:

  • primeiro nome
  • último nome
  • Email
  • empresa

Depois de responder às perguntas, receberá um e-mail para activar a sua nova conta. Depois de activar a sua conta, execute o seguinte comando:

mvn com.okta:okta-maven-plugin:spring-boot

Este comando cria uma aplicação para si com o fluxo de código auth e o redireccionamento URI da segurança da mola para o Okta.

Okta Maven-generated application

To remember it better, you can create the same app manually:

  • vá para a página inicial do programador do Okta e faça login para a sua conta.
  • Clique em Aplicações > Adicionar Aplicativo > Web > Avançar.

verá o seguinte ecrã:

Okta nova aplicação

antes de continuar, faça as seguintes alterações na aplicação:

  • :
    • http://localhost:8080/login/oauth2/code/okta
    • https://oidcdebugger.com/debug
  • tipo de Subsídio permitido
    • Código de Autorização
    • Implícito (Híbrido)

O implícito tipo de bolsa (com o ID e o Token de Acesso permitido verificado) é necessário para obter um token de acesso em seu navegador.

os campos não mencionados acima podem manter os seus valores predefinidos.

Depois de terminar, clique em Pronto. A sua aplicação está pronta!

O próximo passo é aprender a gerar um token válido usando-o.

gerar fichas usando o depurador OpenID Connect

Okta permite-lhe gerir os seus utilizadores na nuvem usando a sua APIs. Ele também permite que você proteja suas aplicações usando OAuth 2.0 e OpenID Connect (também conhecido como OIDC). O OAuth 2.0 fornece um mecanismo para a autorização delegada, o que significa que você não tem que armazenar credenciais de usuário em sua aplicação. Em vez disso, você pode delegar isso a um provedor OAuth 2.0 (Okta, neste caso). OIDC fornece uma camada de identidade em cima do OAuth 2.0 e é por isso que empresas como o Okta são chamadas de “provedores de identidade”, ou IdPs.

você registrou seu aplicativo com Okta e agora pode gerar um token para ter acesso a ele. Um dos URIs de redirecionamento de login que você registrou é para o site do OpenID Connect.

seus pedidos serão validados usando um token. Para gerar este item, irá usar o Depurador de ligação OpenID. Este site irá fornecer – lhe uma maneira fácil de gerar credenciais para os usuários em sua aplicação Okta.

Go to the https://oidcdebugger.com and fill in the following information:

  • autorize URI: https://{yourOktaDomain}/oauth2/default/v1/authorize
  • Redirect URI: https://oidcdebugger.com/debug
  • IDENTIFICAÇÃO do Cliente: {yourOktaClientId}
  • Escopo: openid email profile
  • Estado: dev
  • Nonce: (mantenha o valor padrão)
  • tipo de Resposta: token

Você pode encontrar o valor de {yourOktaDomain} no canto superior direito da sua conta da página inicial:

Octa página inicial

Para encontrar o seu Octa IDENTIFICAÇÃO de Cliente, siga os passos abaixo:

  • Ir para Aplicações
  • Seleccione o Meu Web App
  • Clique em Geral

O ID do Cliente estará disponível na Credenciais do Cliente secção:

Credenciais do Cliente

Depois de completar todos os campos, clique em Enviar o Pedido. Você será redirecionado para a sua página de login Okta.

Depois de ter autenticado com sucesso, será redireccionado para o depurador OIDC de novo, onde poderá ver o item gerado:

irá usar este token para aceder de forma segura aos serviços que irá construir.

Agora que você tem uma conta Okta e você sabe como gerar tokens usando sua aplicação Okta, vamos começar a comparar os frameworks!

construa uma API Java REST com Micronaut

o primeiro passo para o desenvolvimento do seu serviço Micronaut é baixar SDKMAN!. SDKMAN! é uma ferramenta para gerenciar versões paralelas de vários SDKs, que você vai usar para instalar o cliente Micronaut.

pode transferir o SDKMAN! executando o seguinte comando:

curl -s https://get.sdkman.io | bash

agora, pode instalar o Micronaut em si. Basta executar o seguinte comando no terminal:

sdk install micronaut

após o comando terminar a execução, terá a última versão do Micronaut disponível no seu computador.você está pronto para começar a desenvolver a aplicação!

desenvolva o seu serviço Java

vá para a pasta onde deseja criar a sua aplicação e execute o seguinte comando:

mn create-app com.okta.rest.app --build maven

Este comando irá criar um projeto com a estrutura básica de um Micronaut projeto. Micronaut usa Gradle por padrão, mas como você está usando --build maven, ele vai usar Maven em vez disso.

O próximo passo é adicionar as bibliotecas de segurança dentro do projeto. Editar o pom.xml arquivo e adicione as seguintes dependências:

<dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security</artifactId></dependency><dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-security-jwt</artifactId></dependency>

Estas dependências irá ativar a segurança, especificamente OAuth 2.0 com JWT – dentro de seu projeto. Agora que você tem todas as dependências no lugar, você pode começar a criar o seu endpoint.

Crie a seguinte classe de src/main/java/com/okta/rest/controller:

package com.okta.rest.controller;import io.micronaut.http.MediaType;import io.micronaut.http.annotation.Controller;import io.micronaut.http.annotation.Get;import io.micronaut.http.annotation.Produces;import io.micronaut.security.annotation.Secured;import io.micronaut.security.rules.SecurityRule;import java.security.Principal;@Controller("/hello")public class HelloController { @Get @Secured(SecurityRule.IS_AUTHENTICATED) @Produces(MediaType.TEXT_PLAIN) public String hello(Principal principal) { return "Hello, " + principal.getName() + "!"; }}

@Controller anotação indica a Micronaut que este componente irá receber pedidos de /hello caminho.

A classe tem apenas um método, chamado hello(). The @Get annotation shows that the method will receive HTTP GET requests. Você precisa de @Produces porque o tipo de retorno padrão do Micronaut é um objeto JSON. Uma vez que você está retornando texto simples, você precisa definir explicitamente esta informação no método.

A última anotação é @Secured. Ele simplesmente diz ao Micronaut que este método só é acessível aos usuários autenticados.

Você agora tem um controlador que está seguro, mas você ainda não definiu a configuração de segurança. Vamos configurar o Micronaut para se conectar à sua aplicação Okta.

Mudar o nome src/main/resources/application.ymlapplication.properties e adicione a seguinte configuração de segurança:

micronaut.security.enabled=truemicronaut.security.token.jwt.enabled=truemicronaut.security.token.jwt.signatures.jwks.okta.url=https://{yourOktaDomain}/oauth2/default/v1/keys

Substituir {yourOktaDomain} com o valor do seu Octa conta.

a configuração acima activa a segurança usando OAuth 2.0. Você declara que o seu cliente OAuth 2.0 vem da Okta, especificando o emissor da sua organização Okta.

também está a permitir o uso de fichas web JSON, ou JWTs. Uma vez que você quer ler a informação do Okta, você deve declarar onde você pode encontrar o seu JWKS (conjunto de chaves Web JSON) para validar as assinaturas JWT.está na hora de testar o seu serviço! Iniciar o aplicativo executando o seguinte comando:

./mvnw mn:run

Com o aplicativo em execução, execute o seguinte comando:

curl -X GET -I http://localhost:8080/hello

O comando acima irá produzir um resultado semelhante a este:

HTTP/1.1 401 UnauthorizedDate: Tue, 8 Jan 2019 15:47:36 GMTtransfer-encoding: chunkedconnection: close

Como você pode ver, o pedido de não passar. Para fazê-lo funcionar, você precisa passar no token de acesso OAuth 2.0 obtido pelo depurador OIDC. Atribuir o item de acesso a uma variável

na sua linha de comandos.

TOKEN=eyJraWQiOiJxOE1QMjFNNHZCVmxOSkxGbFFWNlN...

Execute o comando abaixo:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

Agora funciona conforme o esperado! Desta vez está a receber a mensagem de saudação como resposta:

pode ver que o Micronaut necessita de muito pouco código para criar uma API de repouso segura. Se você contasse as linhas de código, você descobriria que ~24% são dependências em XML (8 linhas), o código Java é apenas 22 linhas de código, e a configuração de segurança leva 3 linhas. O suporte embutido de OAuth 2.0 do Micronaut torna mais fácil a integração com a Okta e eles até têm um guia para a Okta em sua documentação.óptimo! Agora vamos ver como você cria o mesmo aplicativo usando Quarkus.

crie uma API de repouso Java com Quarkus

para desenvolver a sua aplicação usando o Quarkus, só precisa do Maven instalado, não existem outras dependências necessárias.vamos começar a criar a sua aplicação! Vá à pasta onde a deseja criar e execute o seguinte comando:

mvn io.quarkus:quarkus-maven-plugin:1.8.1.Final:create \ -DprojectGroupId=com.okta.rest \ -DprojectArtifactId=quarkus \ -DclassName="com.okta.rest.quarkus.HelloResource" \ -Dpath="/hello" \ -Dextensions="jwt"

o comando acima cria um projecto com o ‘plugin’ de Quarkus Maven. Ele irá criar um recurso chamado HelloResource, que vai receber pedidos no caminho /hello. Você também está adicionando a extensão JWT de Quarkus no projeto.

Depois de criar o projecto, edite src/java/com/okta/rest/quarkus/HelloResource.java e adicione informação do utilizador ao método hello() :

package com.okta.rest.quarkus;import io.quarkus.security.Authenticated;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.SecurityContext;import java.security.Principal;@Path("/hello")public class HelloResource { @GET @Path("/") @Authenticated @Produces(MediaType.TEXT_PLAIN) public String hello(@Context SecurityContext context) { Principal userPrincipal = context.getUserPrincipal(); return "Hello, " + userPrincipal.getName() + "!"; }}

A classe acima irá comportar-se da mesma forma que a que criou no Micronaut. Ele lê a informação do usuário com base no token que foi gerado no pedido e retorna uma mensagem de saudação para o usuário que é encontrado.

ainda não configurou o Quarkus com o seu emissor e chaves do Okta, por isso vamos fazer isso.

Editar src/main/resources/application.properties e adicione o código a seguir:

mp.jwt.verify.publickey.location=https://{yourOktaDomain}/oauth2/default/v1/keysmp.jwt.verify.issuer=https://{yourOktaDomain}/oauth2/default

Pronto! A versão Quarkus da sua aplicação está pronta para ser testada. Vá para a sua pasta do projecto e execute o seguinte comando:

./mvnw compile quarkus:dev

o comando acima irá iniciar a sua aplicação.

o primeiro passo é certificar-se de que recebe um 401 - Unauthorized quando não utiliza as credenciais correctas.

Execute o seguinte comando no terminal:

curl -X GET -I http://localhost:8080/hello

Conforme o esperado, o resultado é uma resposta 401 HTTP:

HTTP/1.1 401 Unauthorizedwww-authenticate: Bearer {token}Content-Length: 0

Se executar este mesmo pedido, incluindo o item do depurador OIDC, deverá devolver a mensagem de saudação.

Execute o seguinte comando:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

Ele trabalhou como um encanto! No meu caso, o resultado foi:

Quarkus requer ainda menos linhas de código do que Micronaut! Ele gera um aplicativo com dependências incluídas, tem 25 linhas de código Java, e apenas 2 linhas de configuração. Sim, linhas de código é uma comparação tola, mas também mostra como esses frameworks requerem muito pouco código para desenvolver aplicativos seguros.dois já foram, falta um! Agora que você foi capaz de implementar o aplicativo em Micronaut e Quarkus, vamos terminar criando o mesmo aplicativo usando Spring Boot.

crie uma API de repouso Java com arranque de Primavera

arranque de primavera não tem quaisquer pré-requisitos para começar a criar o seu aplicativo, por isso vamos começar por criar o projecto!

abra o seu terminal e execute o seguinte comando:

curl https://start.spring.io/starter.zip -d language=java \ -d bootVersion=2.3.4.RELEASE \ -d dependencies=web,okta \ -d packageName=com.okta.rest \ -d name=spring-boot \ -d type=maven-project \ -o spring-boot.zip

O comando acima irá criar uma spring-boot.zip ficheiro com uma Mola de Inicialização de aplicativo que usa o Maven. Pode extrair o ficheiro para uma pastaspring-boot

usando o comando abaixo.

unzip spring-boot.zip -d spring-boot

Agora, irá implementar o controlador que irá receber os pedidos.

crie um ID

pacote e umHelloController

classe nele:

package com.okta.rest.controller;import org.springframework.security.core.annotation.AuthenticationPrincipal;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.security.Principal;@RestControllerpublic class HelloController { @GetMapping("/hello") public String hello(@AuthenticationPrincipal Principal principal) { return "Hello, " + principal.getName() + "!"; }}

a configuração aqui é muito semelhante às outras estruturas. Você anota a classe com @RestController para que Spring saiba que você receberá pedidos na classe. @GetMappingirá receber pedidos HTTP GET no/hello path. Para obter o utilizador autenticado, utiliza o @AuthenticationPrincipal anotação.

diferente dos outros frameworks, você não precisa especificar que este endpoint é autenticado uma vez que a primavera já controla esta informação a partir de suas configurações.

o último passo é adicionar a informação do emitente, para que o Suporte de OIDC do Spring Security possa descobrir automaticamente os parâmetros com os quais precisa de se comunicar.

Editar src/main/resources/applications.properties e adicione a seguinte configuração:

okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default

Vamos testá-lo! Inicie a sua aplicação de arranque com o Maven.

./mvnw spring-boot:run

em Seguida, abra um terminal e execute o comando abaixo:

curl -X GET -I http://localhost:8080/hello

A resposta é um erro HTTP 401, desde que você não incluem o token:

HTTP/1.1 401Set-Cookie: JSESSIONID=316DCFD55C302A8D69EFD865411DFA77; Path=/; HttpOnlyWWW-Authenticate: BearerX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockCache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Frame-Options: DENYContent-Length: 0Date: Thu, 09 Jan 2020 15:46:34 GMT

Teste novamente, agora de passar o token:

curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/hello

funcionou! Tal como acontece com os outros serviços, o resultado deste comando é o seguinte:

Despertadores de mola no mínimo a quantidade de código necessária: 17 linhas de Java e apenas 1 linha de configuração! Spring sempre foi excelente em tornar a vida dos desenvolvedores mais fácil, então isso não é surpresa.é isso! Você implementou uma API básica de descanso Java em todos os três frameworks!

Final Thoughts on REST APIs With Java: Micronaut, Quarkus, and Spring Boot

When it comes to developing your REST API, all three frameworks did the job well. Com apenas um pouco de código e alguma configuração, você foi capaz de desenvolver uma aplicação segura usando Okta e OAuth 2.0.

A Primavera existe há muitos anos, é amplamente popular, e tem muitas características em torno de seu ecossistema. Pessoalmente, eu ainda acredito que é a melhor opção disponível na programação em Java.Micronaut e Quarkus estão crescendo em popularidade e ganhando impulso dentro da comunidade Java. Se você está enfrentando problemas de desempenho, ou talvez se você está ansioso para uma mudança, você pode dar a um deles uma tentativa e ver como corre.

O desempenho é o ponto de comparação mais frequentemente destacado entre estes três quadros. Se você está procurando uma startup rápida em um ambiente sem servidor, ou a capacidade de criar imagens nativas com GraalVM, Micronaut e Quarkus provavelmente funcionará bem para você. Apenas por diversão, os tempos de inicialização para cada uma dessas aplicações são como segue (com base na média de três tentativas):

  • Micronaut: 474ms
  • Quarkus: 1132ms
  • Primavera de Inicialização: 1014ms

eu tenho esses números da execução de cada quadro do Maven metas para o desenvolvimento.

  • Micronaut: ./mvnw mn:run
  • Quarkus: ./mvnw compile quarkus:dev
  • Primavera de Inicialização: ./mvnw spring-boot:run

Esses comandos não são otimizados para a velocidade, então eu embalados cada aplicação com ./mvnw package e começou-los com java -jar.

  • Micronaut: 596ms
  • Quarkus: 658ms
  • Primavera de Inicialização: 1878ms

NOTA: Estes números foram calculados em um 2019 MacBook Pro com 2.4 GHz, 8-Core Intel Core i9 CPU e 64 GB de RAM. OpenJDK 15 was used with no JAVA_OPTS setting.se está à procura de tempos de arranque ainda mais rápidos, pode usar o GraalVM. Ao invés de fazer testes de tempo eu mesmo, eu olhei para a documentação de cada projeto.

  • Micronaut: 12ms de acordo com a criação da sua primeira aplicação de grau de Micronaut.
  • Quarkus: 14ms according to Quarkus and GraalVM: Booting Hibernate at Supersonic Speed, Subatomic Size on InfoQ. Os documentos do Quarkus não listam uma hora de arranque.Bota De Mola: 44ms de acordo com o nativo de Graal da Primavera 0.6.0 libertado.

no final, você será capaz de desenvolver produtivamente uma aplicação segura, independentemente da escolha que você faça.

deseja dar uma olhada no código fonte? Você pode encontrá-lo no GitHub em okta-java-rest-api-comparison-example.

você deseja saber mais sobre Java, REST APIs e secure applications? Aqui estão alguns outros posts do nosso blog, que você pode achar úteis:

  • Assistir GraalVM Ativar O Java Em Binários
  • OAuth 2.0 Java Guia: Seguro Seu Aplicativo em 5 Minutos
  • Java Microservices com a Primavera de Inicialização e de Primavera Nuvem
  • Como Desenvolver um Quarkus Aplicação com Java e OIDC de Autenticação
  • Autenticação Simples com Mola de Segurança

Para mais posts como este, siga @oktadev no Twitter. Também publicamos regularmente screencasts em nosso canal do YouTube!

Changelog:

  • 23, 2020: actualizado para Micronaut 2.0.2, Quarkus 1.8.1, e arranque de molas 2.3.4. Veja as alterações de código no aplicativo exemplo no GitHub. Mudanças neste post podem ser vistas no oktadeveloper / okta-blog#423.
  • 21 de Maio de 2020: tempos de arranque adicionados para java -jar e rodando com GraalVM. Mudanças neste artigo podem ser vistas no oktadeveloper / okta-blog # 304.
  • ay 20, 2020: upgrade to Micronaut 1.3.5, Quarkus 1.4.2, and Spring Boot 2.3.0. Veja as alterações de código no aplicativo exemplo no GitHub. Mudanças neste artigo podem ser vistas no oktadeveloper / okta-blog # 301. 30 de Janeiro de 2020: atualizado para otimizar o Micronaut com base no feedback da equipe do Micronaut. Também recalculou os tempos de arranque com base numa média de três tentativas. Veja as alterações de código no aplicativo exemplo no GitHub. As alterações a este artigo podem ser vistas no oktadeveloper/okta-blog#176.

Related Posts

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *