Como o Quarkus une MicroProfile e Spring

Olá a todos, e aqui está o terceiro post da série sobre Quarkus!

Como o Quarkus une MicroProfile e Spring

Ao desenvolver microsserviços Java, muitas vezes considera-se que Eclipse MicroProfile e Spring Boot é um conjunto de APIs distintas e independentes. Por padrão, os programadores tendem a usar as APIs às quais já estão acostumados, pois estudar novas estruturas e componentes de tempo de execução leva tempo. Hoje, vamos tentar simplificar a aprendizagem de algumas APIs populares do MicroProfile para desenvolvedores Spring e mostrar como utilizar simultaneamente as APIs do Spring e novas funcionalidades úteis. Quarkus.

Se formos um pouco mais detalhados, primeiro examinaremos o escopo e os detalhes de como o Quarkus suporta interfaces de API do Spring, para mostrar aos desenvolvedores Spring como aplicar a API MicroProfile em seu trabalho cotidiano. Em seguida, falaremos sobre a API MicroProfile que será útil para desenvolvedores Spring na criação de microsserviços.

Por que Quarkus? Primeiro, porque oferece codificação ao vivo (live coding), ou seja, a reinicialização automática de quaisquer mudanças nas APIs MicroProfile, APIs Spring e outras APIs Java, que é realizada com um único comando: mvn quarkus:dev. Em segundo lugar, o serviço Person (que é compilado a partir das interfaces de API do Spring, MicroProfile e JPA em um arquivo binário usando a imagem nativa do GraalVM) pode ser iniciado em apenas 0,055 segundos e ocupa cerca de 90 MB na memória RAM (RSS) no endpoint da aplicação RESTful. E a própria compilação é feita com um único comando: mvn package -Pnative. Não vamos nos aprofundar nos detalhes do MicroProfile, mas tentaremos ajudar os desenvolvedores Spring a entender como usar as interfaces API do Spring junto com as interfaces API do MicroProfile no Quarkus. Containers e Kubernetes

Para não sobrecarregar este artigo, vamos abordar apenas os aspectos de alto nível de suporte

, pois é importante entender. O Quarkus é posicionado como uma pilha Java para Kubernetes, projetado para minimizar o consumo de memória e o tempo de inicialização de aplicações e serviços Java, e, como resultado, aumentar a densidade de implantação no host e reduzir os custos globais.

O Quarkus também Kubernetesoferece geração automática

de recursos Kubernetes e fornece guias para implantação em plataformas Kubernetes e Red Hat OpenShift. Além disso, o Quarkus gera automaticamente os arquivos Dockerfile.jvm (empacotamento JVM) e Dockerfile.native (empacotamento de binário nativo), necessários para criar containers. guias para implantação em plataformas Kubernetes e Red Hat OpenShift. Além disso, Quarkus gera automaticamente arquivos Dockerfile.jvm (empacotamento JVM) e Dockerfile.native (empacotamento de binário nativo), necessários para a criação de containers.

E finalmente, ao considerar o Kubernetes como um ambiente de implantação, o Quarkus não utiliza frameworks Java quando uma funcionalidade semelhante é implementada no próprio nível da plataforma Kubernetes. A Tabela 1 apresenta um mapa de correspondência funcional entre Kubernetes e os frameworks Java típicos usados pelos desenvolvedores Spring.

Tabela 1. Mapa de correspondência entre frameworks Java e Kubernetes.

Funcionalidade
Spring Boot Tradicional
Kubernetes

Descoberta de serviço
Eureka
DNS

Configuração
Spring Cloud Config
Config Maps / Secrets

Balanceamento de carga
Ribbon (do lado do cliente)
Service, Replication Controller (do lado do servidor)

Compilação e execução do código do exemplo

Neste artigo, referimo-nos a um exemplo de projeto, onde APIs Spring e MicroProfile são utilizadas em conjunto, e até mesmo a mesma classe Java. O código deste exemplo pode ser compilado e executado a partir da linha de comando; para mais detalhes, consulte o arquivo README.md.

APIs do Spring Framework

Dependency Injection

O Quarkus suporta uma série de APIs de Contextos e Injeção de Dependência (CDI) e APIs de Injeção de Dependência do Spring (Spring DI). Se você trabalha com MicroProfile, Java EE e Jakarta EE, você já está familiarizado com CDI. Por outro lado, os desenvolvedores Spring podem usar a Quarkus Extension para a API Spring DI para garantir compatibilidade com Spring DI. Exemplos de uso das APIs Spring DI suportadas estão na Tabela 2.

Em o projeto do nosso exemplo utiliza tanto CDI quanto Injeção de Dependência do Spring. Para mais informações e exemplos sobre este assunto, você pode encontrar no guia do Quarkus, chamado Guia de Spring DI.

Tabela 2. Exemplos de uso das APIs Spring DI suportadas.

Funcionalidades suportadas do Spring DI
Exemplos

Injeção de Constructor

public PersonSpringController(
   PersonSpringRepository personRepository,  // injetado      
   PersonSpringMPService personService) {    // injetado
      this.personRepository = personRepository;
      this.personService = personService;
}

Injeção de Campo
Autowired
Valor

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

Bean
@Configuration

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Componente

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

Service

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

Framework Web

Os usuários do MicroProfile irão apreciar que o Quarkus suporta JAX-RS, MicroProfile Rest Client, JSON-P e JSON-B como a principal modelo de programação web. Os desenvolvedores do Spring ficarão agradavelmente surpresos com o suporte recentemente adicionado ao Spring Web API no Quarkus, especialmente pelas interfaces que gerenciam REST. Assim como no DI do Spring, o principal objetivo do suporte ao Spring Web API é permitir que os desenvolvedores do Spring utilizem as interfaces do Spring Web juntamente com as interfaces do MicroProfile. Exemplos do uso das APIs do Spring Web suportadas são apresentados na tabela 3, e informações adicionais e exemplos sobre o tema podem ser encontrados no guia Quarkus intitulado Guia do Spring Web.

Tabela 3. Exemplos de uso das interfaces API do Spring Web suportadas.

Funcionalidades suportadas do Spring Web
Exemplos

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (parcial)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring Data JPA

Os usuários do MicroProfile também ficarão satisfeitos com o suporte do Quarkus para JPA usando Hibernate ORM. Há boas notícias também para os desenvolvedores do Spring: o Quarkus suporta as anotações e tipos comuns do Spring Data JPA. Exemplos do uso das APIs do Spring Data JPA suportadas são apresentados na tabela 4.
Em o projeto do nosso exemplo são utilizadas as interfaces API do Spring Data JPA, e informações adicionais estão disponíveis no guia Quarkus intitulado Guia do Spring Data JPA.

Tabela 4. Exemplos de uso das interfaces API do Spring Data JPA suportadas.

Funcionalidades suportadas do Spring Data JPA
Exemplos

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmentos de Repositório

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Métodos de consulta derivados

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Consultas definidas pelo usuário

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

Interfaces API do MicroProfile

Tolerância a Falhas

As estruturas de Tolerância a Falhas são muito importantes para prevenir falhas em cascata e criar arquiteturas de microsserviços confiáveis. Os desenvolvedores Spring já usam há anos circuit breakers para garantir a resiliência. Hystrix. No entanto, o Hystrix não é atualizado há muito tempo, enquanto a Tolerância a Falhas do MicroProfile está sendo ativamente desenvolvida e já possui anos de uso em produção. Portanto, para aumentar a confiabilidade dos serviços no Quarkus, é recomendado aplicar as interfaces API do MicroProfile Fault Tolerance, cujos exemplos de uso estão na tabela 5. Informações adicionais sobre isso podem ser encontradas no guia do Quarkus. Guia de Tolerância a Falhas.

Tabela 5. Exemplos de uso das interfaces de API suportadas pelo MicroProfile Fault Tolerance.

Funções do MicroProfile Fault Tolerance
Descrição
Exemplos

@Asynchronous

Execução de lógica em uma thread separada

@Asynchronous
@Retry
public Future getSalutation() {
   ...
   return future;
}

@Bulkhead

Limitação do número de solicitações simultâneas

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@CircuitBreaker

Tratamento inteligente de falhas e recuperação de falhas

@CircuitBreaker(delay=500 // milissegundos
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

Chamada de lógica alternativa em caso de falha

@Timeout(500) // milissegundos
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "olá";
}

Retry

Repetição em caso de falha na solicitação

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

Timeout

Tempo limite de espera em caso de falha

@Timeout(value = 500) // milissegundos
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

Verificação de Serviços (Service Health)

As plataformas Kubernetes monitoram a integridade dos contêineres por meio de serviços especiais. Para que a plataforma subjacente possa monitorar os serviços, os desenvolvedores Spring geralmente usam HealthIndicator configuráveis e o Spring Boot Actuator. No Quarkus, isso pode ser feito com o MicroProfile Health, que por padrão realiza verificações de prontidão (liveness check), mas pode ser configurado para verificar simultaneamente a prontidão e a disponibilidade (readiness). Os exemplos de uso das APIs suportadas pelo MicroProfile Health estão na tabela 6, e mais informações estão disponíveis no guia do Quarkus. Guia de Saúde.

Tabela 6. Exemplos de uso das interfaces de API suportadas pelo MicroProfile Health.

Funções do MicroProfile Health
Descrição
Exemplos

@Liveness

A plataforma realiza a reinicialização de aplicativos containerizados defeituosos.
Endpoint:
host:8080/health/live

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Readiness

A plataforma não enviará tráfego para o aplicativo contêinerizado caso esteja indisponível.
Endpoint:
host:8080/health/ready

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Métricas

Os aplicativos fornecem métricas para fins operacionais (para monitoramento de SLA de desempenho) ou não operacionais (indicadores SLA de negócios). Desenvolvedores Spring fornecem métricas através do Spring Boot Actuator e Micrometer. Por sua vez, o Quarkus utiliza MicroProfile Metrics para fornecer métricas básicas (JVM e sistema operacional), métricas de fornecedor (Quarkus) e métricas de aplicativos. MicroProfile Metrics requer que a implementação suporte formatos de saída JSON e OpenMetrics (Prometheus). Exemplos de uso da API MicroProfile Metrics estão na Tabela 7.

Em o projeto do nosso exemplo MicroProfile Metrics é utilizado para fornecer métricas de aplicativo. Mais informações podem ser encontradas no guia Quarkus. Guia de Métricas.

Tabela 7. Exemplos de uso das APIs MicroProfile Metrics.

Funções do MicroProfile Metrics
Descrição
Exemplos

@Counted

Indica um contador que contabiliza o número de chamadas para o objeto anotado.

@Counted(name = "fallbackCounter", 
  displayName = "Contador de Fallback", 
  description = "Contador de Fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Indica um sensor que conta o número de chamadas simultâneas para o objeto anotado.

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Concurrent Fallback", 
  description="Concurrent Fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

@Gauge

Indica um sensor que mede o valor do objeto anotado.

@Metered(name = "FallbackGauge",
   displayName="Medidor de Fallback",
   description="Frequência de fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

Indica um medidor que monitora a frequência de chamadas para o objeto anotado.

@Metered(name = "MeteredFallback",
   displayName="Medidor de Fallback",
   description="Frequência de fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

Métrica

Anotação que contém informações sobre os metadados ao receber uma solicitação para registrar ou gerar métricas.

@Metric
@Metered(name = "MeteredFallback",
   displayName="Medidor de Fallback",
   description="Frequência de fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

Cronometrado

Indica um temporizador que monitora a duração do objeto anotado.

@Timed(name = "TimedFallback",
   displayName="Fallback Temporizado",
   description="Atraso do fallback")
public String salutationFallback() {
   return fallbackSalutation;
}

Pontos finais de métricas

Métricas de aplicações localhost:8080/metrics/application
Métricas básicas localhost:8080/metrics/base
Métricas do fornecedor localhost:8080/metrics/vendor
Todas as métricas localhost:8080/metrics

Cliente REST MicroProfile

Microserviços frequentemente expõem pontos finais RESTful, que requerem APIs de cliente apropriadas para interação. Para utilizar os pontos finais RESTful, os desenvolvedores Spring geralmente usam RestTemplate. Entretanto, o Quarkus oferece interfaces de API do MicroProfile Rest Client para resolver essa tarefa, com exemplos de uso apresentados na tabela 8.

Em o projeto do nosso exemplo A utilização de pontos finais RESTful é realizada através do MicroProfile Rest Client. Informações adicionais e exemplos sobre isso podem ser encontrados no guia Quarkus. Guia do Cliente Rest.

Tabela 8. Exemplos de uso das interfaces de API MicroProfile Rest Client.

Funcionalidades do MicroProfile Rest Client
Descrição
Exemplos

@RegisterRestClient

Registra uma interface Java tipada como cliente REST

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestClient

Marca a injeção de uma instância da interface tipada do cliente REST

@Autowired // ou @Inject
@RestClient
MyRestClient restClient;

Invocação

Invoca um ponto final REST

System.out.println(
   restClient.getSalutation());

mp-rest/url

Define um ponto final REST

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Resultados

Neste blog, que será especialmente útil para desenvolvedores Spring, discutimos brevemente como usar as APIs do Spring juntamente com as APIs do MicroProfile no Quarkus para desenvolver microserviços Java e depois compilá-los em código binário nativo, economizando centenas de megabytes de memória e iniciando em milissegundos.

Como você já percebeu, mais informações sobre o suporte às APIs do Spring e MicroProfile, assim como muitos outros detalhes úteis, podem ser encontradas nos guias do Quarkus.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster