Introdução

Neste tutorial, exploraremos em profundidade as arquiteturas Janus aplicadas a microserviços, focando em como usar ferramentas como Kubernetes e Istio para gerenciar comunicações bidirecionais em sistemas distribuídos. Veremos como a arquitetura Janus permite que os serviços se comuniquem de maneira eficiente, garantindo que as aplicações funcionem de forma escalável e resiliente. Teremos um exemplo prático onde criaremos uma aplicação de microserviços que interagem entre si, utilizando as funcionalidades avançadas do Istio para roteamento de tráfego, gerenciamento de políticas de segurança e rastreamento. Este tutorial é ideal para desenvolvedores que buscam aprofundar-se na construção de sistemas complexos e modernos.

Etapas

  1. Preparação do Ambiente de Desenvolvimento

    Certifique-se de que você possui o JDK, Maven e o Docker instalados na sua máquina. Além disso, instale o Kubernetes (por exemplo, usando Minikube ou KinD) e o Istio. Você pode verificar as versões do JDK e do Maven com os comandos: `java -version` e `mvn -version`. O Istio pode ser instalado seguindo as instruções disponíveis na documentação oficial.

    commands
    # Verificando versões do JDK e Maven
    java -version
    mvn -version
    # Instalação do Istio
    curl -L https://istio.io/downloadIstio | sh -
    cd istio-<versão> && export PATH=$PWD/bin:$PATH

  2. Criação do Projeto Spring Boot

    Utilize o Spring Initializr para gerar um novo projeto Spring Boot. Adicione as dependências: Spring Web, Spring Cloud Kubernetes e Spring Cloud Istio. Configure o projeto com as opções: Project: Maven, Language: Java. Baixe e descompacte o projeto em seu ambiente local.

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example.janusmicroservices</groupId>
      <artifactId>janus-microservices</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>janus-microservices</name>
      <description>Microserviços com Arquitetura Janus</description>
      <properties>
        <java.version>11</java.version>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-kubernetes</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-istio</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </project>

  3. Configuração do Istio

    Configure o Istio para sua aplicação. Crie um arquivo `istio.yml` em seu projeto para definir as configurações de serviço e as políticas de gerenciamento de tráfego.

    istio.yml
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: janus-service
    spec:
      hosts:
        - janus-service
      http:
        - route:
            - destination:
                host: janus-service
                port:
                  number: 8080
    

  4. Desenvolvimento do Serviço de Exemplo `ProdutoService`

    Implemente a camada de serviço contendo uma API simples gerenciando produtos. Abaixo está a classe `ProdutoService` com um controlador REST para gerenciar produtos.

    ProdutoService.java
    package com.example.janusmicroservices.service;
    
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    @RestController
    @RequestMapping("/produto")
    public class ProdutoService {
        private List<String> produtos = new ArrayList<>();
    
        @PostMapping
        public String addProduto(@RequestBody String nome) {
            produtos.add(nome);
            return nome + " adicionado com sucesso!";
        }
    
        @GetMapping
        public List<String> getProdutos() {
            return produtos;
        }
    }

  5. Implementação do Controle de Acesso e Segurança

    Adicione um filtro de autenticação ao serviço utilizando Spring Security para proteger os endpoints da API dos produtos. Configure as propriedades de segurança no arquivo `application.yml`.

    application.yml
    spring:
      security:
        user:
          name: user
          password: password
    

  6. Testes Unitários do Serviço

    Implemente testes unitários para o `ProdutoService` utilizando JUnit e Mockito. Abaixo está um exemplo de testes para a adição de produtos.

    ProdutoServiceTest.java
    package com.example.janusmicroservices.service;
    
    import org.junit.jupiter.api.Test;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.MockitoAnnotations;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    public class ProdutoServiceTest {
        @InjectMocks
        private ProdutoService produtoService;
    
        @Test
        public void testAddProduto() {
            produtoService.addProduto("Produto 1");
            assertEquals(1, produtoService.getProdutos().size());
        }
    }

  7. Deploy da Aplicação no Kubernetes

    Crie um arquivo de deployment para o Kubernetes que irá gerenciar a execução do serviço. O arquivo abaixo define o deployment do service no Kubernetes.

    deployment.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: janus-service
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: janus-service
      template:
        metadata:
          labels:
            app: janus-service
        spec:
          containers:
          - name: janus-container
            image: yourdockerhub/janus-service:latest
            ports:
            - containerPort: 8080
    

  8. Executando a Aplicação e Testes

    Utilize o Maven para compilar e executar a aplicação. Use o Kubernetes para fazer o deploy e, em seguida, teste os endpoints utilizando cURL ou Postman.

    commands
    # Compilar e executar a aplicação
    mvn clean install
    # Fazer o deploy no Kubernetes
    kubectl apply -f deployment.yml
    # Teste o endpoint de produtos
    curl -X POST -H 'Content-Type: application/json' -d 'Produto 1' http://localhost:8080/produto
    curl -X GET http://localhost:8080/produto

Conclusão

Neste tutorial, você aprofundou seus conhecimentos em arquiteturas Janus para microserviços, aprendendo como implementar comunicações bidirecionais utilizando tecnologias como Kubernetes e Istio. Através da construção de um serviço de exemplo com Spring Boot, você configurou o ambiente, desenvolveu a lógica do serviço e implementou segurança e testes. Agora, com essas habilidades, você pode continuar a explorar e aplicar arquiteturas de microserviços em suas aplicações, aumentando a escalabilidade e a confiabilidade do seu software.

Hashtags

#JanusMicroservices #SpringBoot #Kubernetes #Istio #Microservices #BackEndDevelopment