Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Microsserviços
O que são e por que usar microsserviços
A arquitetura de software por meio de microsserviços (microservices) vem revolucionando o jeito de projetar e desenvolver sistemas complexos já há algum tempo. Diferente da arquitetura monolítica do passado, na qual uma única aplicação contém todas as funcionalidades — e se alguma coisa quebra, tudo desanda —, os microsserviços separam as aplicações em conjuntos inter-relacionados de aplicações menores que funcionam de maneira orquestrada. Cada serviço é projetado para entregar uma função específica para o negócio e pode ser desenvolvido, implantado e escalado independentemente. Tal metodologia de desenvolvimento oferece inúmeros benefícios, como:
· maior flexibilidade e escalabilidade;
· resiliência — pois partes semiautônomas evitam quebrar umas às outras; e
· capacidade de adoção de novas soluções e implantação ágil das mesmas.
A importância dos microsserviços reside na sua capacidade de lidar com as limitações dos sistemas monolíticos. Ao separar serviços — ou seja, unidades de funcionalidade que compõem sistemas completos —, empresas e desenvolvedores aumentam sua capacidade e agilidade de inovação e de entrega iterativa de recursos. Times de desenvolvimento também podem responder agilmente às demandas de mercado, ao mesmo tempo em que se tornam mais capazes de isolar erros de desenvolvimento.
Este é o poder dos microsserviços: entregar sistemas mais robustos e sustentáveis capazes de se desenvolverem ao longo do tempo sem os riscos de grandes atualizações de sistemas monolíticos.
1. Compreendendo Microsserviços
Microsserviços é uma escolha de design de software, ou seja, uma arquitetura de aplicações através da qual se constroem sistemas complexos através da reunião de programas menores, autocentrados em torno de serviços localizados. ¹ Estes serviços, originados da computação em nuvem, podem, então, ser desenvolvidos e implementados independentemente, já que a comunicação entre eles, isto é, a troca de dados se dá basicamente por meio de APIs. ²
Serviços desacoplados
Microsserviços promovem a ideia de serviços desacoplados, isto quer dizer que cada serviço opera independentemente dos outros. Esse desacoplamento permite que equipes de desenvolvimento trabalhem em serviços diferentes simultaneamente sem causar quaisquer perturbações uns aos outros e às partes (i.e. serviços) da aplicação nas quais ninguém está mexendo. O resultado é maior rapidez e eficiência no desenvolvimento.
Unidades de implantação independente
Cada microsserviço pode ser implantado independentemente, permitindo atualizações mais frequentes e iterações mais ágeis. Assim sendo, uma falha ou mudança no serviço não necessita de reimplementação de toda a aplicação, o que reduz o tempo de inatividade (downtime) e aumenta confiabilidade.
Escalabilidade e resiliência
Microsserviços são projetados para serem altamente escaláveis e resilientes. Os serviços podem ser escalados independentemente de suas necessidades individuais e específicas, otimizando o uso de recursos e promovendo uma performance eficiente. A natureza autônoma dos serviços também contribuem para a resiliência do sistema, porquanto problemas em um serviço não impactem diretamente os outros, auxiliando no isolamento de erros e subsequente recuperação.
Flexibilidade
Microsserviços oferecem flexibilidade incomparável na escolha de tecnologias. Porquanto serviços sejam independentes, os desenvolvedores podem selecionar os stacks mais apropriados para cada serviço, em vez de estarem constritos a um stack unificado e inflexível. Essa maleabilidade também se estende a decisões de escalonamento, nas quais cada serviço pode ser ampliado de acordo com requisitos individuais ao invés de sujeitar toda a aplicação ao mesmo escalonamento.
Mais facilidade de atualização e manutenção
Microsserviços simplificam a manutenção ao desmantelar a aplicação em partes melhor administráveis independentemente. As atualizações podem atingir serviços individuais sem afetarem todo o sistema, assim permitindo implementações mais rápidas e seguras.
Isolamento de falhas aprimorado
Num sistema monolítico, uma falha numa parte da aplicação tem o potencial de derrubar todo o sistema. Os microsserviços mitigam esse risco por meio de isolamento de falha aprimorado. Se um serviço falha, somente aquela parte da aplicação deixa de funcionar, e o resto do sistema pode continuar operacional. O isolamento de falhas melhora a confiabilidade e a estabilidade geral do software.
Spring framework
Amplamente utilizado em desenvolvimento corporativo e aplicações de grande escala, o Spring Framework é usado em diversos setores da indústria para construir aplicativos web, serviços RESTful, aplicativos móveis, entre outros.
O que é Spring Framework e para que serve?  
O Spring Framework é um framework de desenvolvimento de software para a plataforma Java, oferecendo uma infraestrutura abrangente para facilitar a criação de aplicativos Java empresariais. 
 Uma das principais características do Spring é a Inversão de Controle (IoC), que permite que o container do Spring gerencie a criação e injeção de dependências entre os componentes. Isso reduz o acoplamento entre classes e torna o código mais flexível e fácil de manter. Além disso, o Spring suporta a Injeção de Dependência (DI), uma forma de IoC, onde as dependências de um componente são fornecidas externamente, tornando o código mais modular e facilitando os testes. 
O framework é dividido em módulos, cada um com uma funcionalidade específica, permitindo que você use apenas os módulos necessários para o seu projeto, mantendo a aplicação mais leve e eficiente. Além disso, o Spring suporta Aspect-Oriented Programming (AOP), que permite abstrair funcionalidades transversais em aspectos reutilizáveis, melhorando a modularidade do código. 
Outro ponto forte do Spring é o suporte a bancos de dados, incluindo uma camada de acesso a dados chamada Spring Data, que simplifica o acesso a bancos de dados relacionais e NoSQL. O framework também é compatível com ORM, como o Hibernate.
Por que utilizar Spring em Java?  
 Existem várias razões pelas quais é vantajoso utilizar o Spring Framework em projetos Java: 
Simplificação do desenvolvimento 
O Spring Framework fornece uma ampla gama de recursos que simplificam o desenvolvimento de aplicativos Java. Ele adota o princípio da Inversão de Controle (IoC) e da Injeção de Dependência (DI), que reduzem o acoplamento entre componentes e facilitam a configuração e o gerenciamento das dependências, tornando o código mais limpo e organizado. 
Modularidade 
O Spring é projetado com base em módulos, permitindo que você utilize apenas os módulos necessários para o seu projeto. 
Gerenciamento de Transações 
O Spring oferece suporte a transações declarativas, o que simplifica a gerência de transações em operações de banco de dados. Isso torna o código mais legível e menos propenso a erros em comparação com o tratamento manual de transações. 
 Integração com outros frameworks 
O Spring pode ser facilmente integrado com outros frameworks e bibliotecas populares do ecossistema Java, como Hibernate, JPA, JMS, entre outros. Isso facilita a construção de aplicativos robustos e flexíveis, tirando proveito das melhores ferramentas disponíveis. 
Aspect-Oriented Programming (AOP) 
O Spring suporta AOP, permitindo que você separe aspectos transversais do código (como logging, segurança, tratamento de exceções) em módulos reutilizáveis. Isso evita a duplicação de código e promove a modularidade e a reutilização. 
 Testabilidade 
O uso de Injeção de Dependência facilita a criação de testes unitários, permitindo que você substitua facilmente as dependências por objetos simulados durante os testes. Isso melhora a qualidade e a confiabilidade do código. 
Segurança 
O Spring possui recursos integrados para lidar com questões de segurança, como autenticação e autorização. Ele oferece uma abordagem flexível para implementar requisitos de segurança específicos do projeto. 
O Spring Framework é uma API?Sim, o Spring Framework é uma API (Application Programming Interface) extensa e abrangente para o desenvolvimento de aplicativos Java. Uma API é um conjunto de classes, interfaces e métodos que permitem a interação e o acesso a funcionalidades específicas de um software ou plataforma. 
No caso do Spring Framework, ele é uma API desenvolvida para a plataforma Java que fornece uma série de recursos e facilidades para simplificar o desenvolvimento de aplicativos empresariais. Esses recursos incluem gerenciamento de IoC (Inversão de Controle), Injeção de Dependência, suporte a transações, integração com bancos de dados, suporte a AOP (Aspect-Oriented Programming) e muito mais.  A API do Spring é dividida em diversos módulos, cada um com funcionalidades específicas. Por exemplo, o Spring Core contém as funcionalidades básicas de IoC e DI, enquanto o Spring Data oferece suporte a acesso a bancos de dados. Cada módulo pode ser usado independentemente ou em conjunto, dependendo das necessidades do projeto. 
Spring Boot 
O Spring Boot é uma subprojetos do Spring Framework que visa simplificar ainda mais o desenvolvimento de aplicativos Java. Ele foi criado para ser uma abordagem "convention-over-configuration" (convenção sobre configuração), o que significa que o desenvolvedor precisa fazer menos configurações manuais e mais convenções são seguidas automaticamente pelo framework. O Spring Boot inclui um servidor web incorporado (como Tomcat, Jetty ou Undertow) e usa o conceito de "starter dependencies" (dependências iniciais) para configurar automaticamente muitos aspectos do aplicativo com base nas dependências adicionadas ao projeto. Ele também oferece recursos de configuração externa, permitindo que você configure facilmente seu aplicativo através de arquivos de propriedades ou YAML. (Formato para arquivo de configuração)
Diferença entre o Spring e o Spring Boot 
Complexidade de configuração: O Spring Framework requer mais configuração manual por parte do desenvolvedor para definir o ambiente e configurar as dependências do projeto. Já o Spring Boot, como uma abordagem "convention-over-configuration", busca reduzir a quantidade de configuração necessária, tornando o desenvolvimento mais rápido e simples. 
Inicialização do projeto: No Spring Framework, o desenvolvedor precisa configurar e inicializar manualmente o ambiente, enquanto o Spring Boot oferece uma inicialização mais rápida e fácil, com a maioria das configurações feitas automaticamente com base nas dependências adicionadas. 
Embutindo Servidor Web: O Spring Boot inclui um servidor web incorporado por padrão, o que torna mais fácil executar e implantar aplicativos Java sem a necessidade de configurar um servidor externo. 
Convenções: O Spring Boot segue convenções predefinidas para configurar automaticamente muitos aspectos do aplicativo, enquanto no Spring Framework, o desenvolvedor tem mais liberdade para definir as configurações de acordo com suas necessidades. 
Spring é bom para desenvolvimento web?  
O Spring é uma excelente escolha para o desenvolvimento web devido aos seus diversos recursos e vantagens. Ele fornece uma infraestrutura robusta que simplifica a construção de aplicativos web de alto desempenho e escaláveis. 
Uma das principais vantagens do Spring é o suporte a padrões de arquitetura web, como o MVC (Model-View-Controller), que facilita a organização do código em camadas lógicas, tornando-o mais fácil de entender e manter. 
Introdução ao Spring Boot
No âmbito da agilidade de desenvolvimento e produção de código pronto para integração e implantação, está o Spring Boot, um framework open source projetado para simplificar a criação de aplicações baseadas no framework Spring para Java. O Spring Boot agiliza a configuração de aplicações, liberando os desenvolvedores das necessidades de definir códigos-modelo e configurações, assim acelerando o processo de desenvolvimento.
Principais características e benefícios do Spring Boot para o desenvolvimento com microsserviços
O Spring Boot é conhecido por suas funcionalidades que facilitam o desenvolvimento ágil e a criação eficiente de microsserviços. A autoconfiguração é uma dessas características, onde o framework configura aplicações automaticamente com base nas dependências incluídas no projeto. Isso reduz significativamente a necessidade de configurações manuais, permitindo que os desenvolvedores concentrem-se na construção das funcionalidades da aplicação, promovendo um desenvolvimento ágil.
Os inicializadores POMs (Modelos de Objeto de Projeto) simplificam ainda mais o processo de configuração, agregando um conjunto de dependências comumente usadas para funcionalidades específicas. Com inicializadores como `spring-boot-starter-web`, `spring-boot-starter-data-jpa`, `spring-boot-starter-security`, e `spring-boot-starter-test`, os desenvolvedores podem configurar rapidamente um projeto com as bibliotecas necessárias, evitando o incômodo de configurar cada dependência individualmente. Isso promove uma configuração simplificada e uma integração rápida de novas funcionalidades, essencial para o desenvolvimento rápido de microsserviços.
Além disso, o Spring Boot inclui servidores integrados como Tomcat, Jetty e Undertow, permitindo que as aplicações rodem de forma independente sem a necessidade de servidores externos. Isso, combinado com a linha de comando (CLI) do Spring Boot, que permite a prototipagem rápida de aplicações usando scripts Groovy, facilita a testagem e iteração de ideias, acelerando o desenvolvimento.
Outro benefício significativo é a escalabilidade das aplicações Spring Boot, que são leves e ideais para a arquitetura de microsserviços. Cada serviço pode ser escalado independentemente conforme a demanda, o que é crucial para manter a performance e a eficiência em sistemas distribuídos. Além disso, o Spring Boot vem equipado com recursos prontos para produção, como métricas, checagens de saúde e configurações externalizadas, que são essenciais para manter a robustez e a disponibilidade dos serviços em ambientes produtivos.
A integração natural do Spring Boot com o Spring Cloud também é um grande diferencial, fornecendo um conjunto de ferramentas completo para a construção e gerenciamento de sistemas distribuídos. Essa integração simplifica a implementação de padrões de microsserviços, como configuração centralizada, descoberta de serviços, balanceamento de carga, e muito mais, tornando o Spring Boot uma escolha poderosa para o desenvolvimento de microsserviços.
Implementando Microsserviços com Spring Boot e Spring Cloud
Projetar microsserviços envolve dividir uma aplicação monolítica em serviços menores, independentes e implantáveis. Identificar limites de serviço apropriados é crucial para garantir que cada microsserviço gerencie uma capacidade de negócio distinta. As seguintes diretrizes podem ajudar nesse processo:
· Capacidades de Negócio: Defina serviços em torno de capacidades de negócio, em vez de funcionalidades técnicas. Cada microsserviço deve representar uma função específica de negócio.
· Princípio da Responsabilidade Única: Garanta que cada serviço tenha uma única responsabilidade e um escopo bem definido.
· Propriedade dos Dados: Atribua a propriedade dos dados aos serviços para evitar bancos de dados compartilhados. Cada microsserviço deve gerenciar seus próprios dados, garantindo o acoplamento frouxo entre serviços.
· Design Orientado a Domínio: Use os princípios de design orientado a domínio (DDD) para modelar serviços. Identifique contextos delimitados e raízes agregadas para delinear os limites de serviço de forma eficaz.
Melhores Práticas para Design de Serviços
· Design de API: Projete APIs claras, consistentes e versionadas para comunicação entre serviços. Use princípios RESTful ou gRPC para comunicação entre serviços.
· Sem Estado: Assegure que os microsserviços sejam sem estado, sempre que possível, para facilitar a escalabilidade e resiliência.
· Resiliência e Tolerância a Falhas: Implemente padrões como circuit breakers, retries e timeoutspara melhorar a tolerância a falhas e a resiliência.
· Monitoramento e Log: Incorpore logging e monitoramento centralizados para rastrear a saúde, desempenho e erros dos serviços.
· Segurança: Proteja os microsserviços usando OAuth2, JWT ou outros mecanismos de autenticação e autorização.
Spring Cloud:
O Spring Cloud fornece ferramentas para desenvolvedores construir alguns dos padrões comuns de nuvens distribuída, tais como configuração distribuída, descoberta de serviços, curcuit breakers, roteamento inteligente, entre outros.
O mundo dos microserviços trouxe diversas inovações e desafios para a arquitetura de software. Uma das principais questões é: como os microserviços descobrem e se comunicam entre si de forma eficiente e resiliente? A resposta para muitos desenvolvedores Java tem sido a combinação do Spring Cloud com o Eureka da Netflix.
A descoberta de serviço é o processo pelo qual um serviço identifica e localiza outro serviço na rede, facilitando a comunicação.
O Spring Cloud oferece soluções para muitos dos desafios associados aos microserviços. Ele fornece ferramentas para construir aplicações que podem ser facilmente escaladas e gerenciadas em ambientes cloud. Uma das suas principais funcionalidades é a integração com sistemas de descoberta de serviço, como o Eureka.
Eureka: O Sistema de Registro e Descoberta
Desenvolvido pela Netflix, o Eureka serve como um catálogo de todos os serviços disponíveis em um sistema. Ele funciona da seguinte forma:
1. Registro de Serviço: Quando um microserviço é iniciado, ele se registra no servidor Eureka, informando sua localização e outros metadados.
2. Descoberta de Serviço: Quando um serviço precisa se comunicar com outro, ele consulta o servidor Eureka para descobrir a localização do serviço desejado.
3. Renovação e Health Check: Os serviços registrados regularmente enviam sinais de “vida” para o Eureka. Se o Eureka não receber um sinal de um serviço após um determinado período, ele assume que o serviço está indisponível e o retira do registro.
Utilizar o Spring Cloud em conjunto com o Eureka fornece uma solução robusta e escalável para a descoberta de serviço em arquiteturas de microserviços. O Eureka garante que os serviços possam se localizar e se comunicar com eficiência, enquanto o Spring Cloud fornece as ferramentas necessárias para gerenciar e monitorar essas interações. Juntos, eles formam uma combinação poderosa para qualquer desenvolvedor Java que esteja trabalhando com microserviços.
Para ser capaz de se integrar a uma grande variedade de componentes e fornecedores de plataformas, os engenheiros da empresa Pivotal resolveram separar o Spring Cloud em uma série de componentes menores, a saber:
· Spring Cloud Config trata da gestão dos dados de configuração da aplicação através de um serviço centralizado para que os dados de configuração da sua aplicação (particularmente os dados de configuração específicos do seu ambiente) estão limpos e separados dos seus micro serviço implantado. 
· Spring Cloud service discovery  pode abstrair a localização física (IP e/ou nome do servidor) de onde os seus servidores são implantados a partir dos clientes que consomem o serviço. 
· Spring Cloud/Netflix Hystrix e Ribbon, o  Spring Cloud integra-se fortemente com projetos de código aberto Netflix. Para padrões de resiliência de clientes de micro serviços, Spring Cloud envolve as bibliotecas Netflix Hystrix, torna trivial a sua utilização a partir dos seus próprios micro serviços para implementar. 
· Spring Cloud/Netflix Zuul, Spring Cloud utiliza o projeto Netflix Zuul para fornecer capacidades de encaminhamento de serviços para a sua aplicação de micro serviços. Zuul é um serviço porta de entrada que faz os pedidos de serviço de procura e assegura que todas as chamadas para os seus micro serviços passam por uma única "porta de entrada" antes de o serviço visado ser invocado. Com isto, o serviço centralização de chamadas de serviço, pode impor políticas de serviço padrão tais como autenticação de autorização de segurança, filtragem de conteúdos, e regras de encaminhamento.
·  Spring Cloud Stream, Spring Cloud Stream é uma via de tecnologia que lhe permite integrar facilmente o processamento de mensagens leves no seu micro serviços. 
· Spring Cloud Sleuth, O Spring Cloud Sleuth permite-lhe integrar identificadores de rastreio únicos nos canais de chamadas e mensagens HTTP (RabbitMQ, Apache Kafka) que estão a ser utilizados na sua aplicação. 
· Spring Cloud Security,  é uma estrutura de autenticação e autorização que pode controlar quem pode acessar seus serviços e o que eles podem fazer com seus serviços. 
Zuul
O Api Gateway Zuul é uma ferramenta desenvolvida pela Netflix que pode ser usada e possui uma grande facilidade de integração com o Spring, esse vendor possui uma enorme gama de produtos para essa arquitetura de sistemas distribuídos que se comunicam muito bem, levando isso consideração vamos utilizar o Zuul juntamente com o Eureka e o Ribbon. Zuul é um serviço porta de entrada que faz os pedidos de serviço de procura e assegura que todas as chamadas para os seus micro serviços passam por uma única "porta de entrada" antes de o serviço visado ser invocado. Com isto, o serviço centralização de chamadas de serviço, pode impor políticas de serviço padrão tais como autenticação de autorização de segurança, filtragem de conteúdos, e regras de encaminhamento
Api Gateway
Essa ferramenta trata-se de um gerenciador de APIs, ela age como um proxy reverso para nosso back-end, sendo a porta de entrada dos consumidores de nossos serviços, muita das vezes representando a abertura da nossa rede interna com a internet.
Service Discovery, 
Um recurso capaz de descobrir quando adicionamos novas máquinas ou serviços. Então, assim que adicionarmos uma segunda máquina, por exemplo, o Service Discovery também vai adicionar esse IP ao seu registro (que nós chamamos de Service Registry). Dessa forma, o sistema não precisa consultar diferentes listas, já que ele simplesmente utiliza o Service Registry para receber o IP e permitir o acesso. Além dessa função, o Service Discovery também verifica constantemente o estado de saúde das nossas máquinas. E se nós adicionarmos uma terceira máquina, por exemplo, que começa a apresentar algum problema com o risco de sair do ar, automaticamente o Service Discovery percebe esse problema e consegue removê-la do Service Registry, garantindo que ao acessarmos o registro nós simplesmente iremos pegar o estado atualizado das máquinas que estiverem funcionando. Nós podemos encontrar o Service Discovery em diversos setores, como os Load Balancers que trabalham de forma automática ou nos Pods do Kubernetes quando criamos novos serviços.
Map Struct
MapStruct é uma biblioteca de mapeamento de objetos Java para Java, que gera automaticamente código de mapeamento para converter objetos de um tipo em outro. Com o MapStruct, você não precisa escrever o código de mapeamento manualmente. Em vez disso, o MapStruct o gera automaticamente a partir das anotações definidas nas classes. Com o MapStruct, a partir de um interface a biblioteca criará automaticamente uma implementação concreta durante o tempo de compilação, que consegue fazer transferência dos dados entre objetos. Ela serve para simplificar o mapeamento entre objetos, evitando duplicação de códigos além de minimizar os erros, assim como simplificar esse trabalho.
Swagger
Swagger é uma especificação aberta para definição de APIs REST. O documento Swagger especifica a lista de recursos que estão disponíveis na API REST e as operações que podem ser chamadas sobre esses recursos. O documento Swagger também especifica a lista de parâmetros a uma operação, incluindo o nome e o tipo dos parâmetros, se os parâmetros são necessários ou opcionais, e informações sobre valores aceitáveis para esses parâmetros. Adicionalmente, o documento Swagger pode incluir JSON Schema que descreve a estrutura do corpo de solicitação que é enviado para uma operação em uma API REST, e o esquema JSON descreve a estruturade quaisquer corpos de resposta que são retornados de uma operação.
Os documentos swagger devem estar em qualquer formato JSON com uma extensão de arquivo .json ou formato YAML com uma extensão de arquivo .yaml ou .yml.
APIs REST são frequentemente usadas para a integração de aplicações, seja para consumir serviços de terceiros, seja para prover novos. Para estas APIs, o Swagger facilita a modelagem, a documentação e a geração de código
Ferramentas que o Swagger disponibiliza
Dentre as principais ferramentas que o Swagger possui listaremos aqui apenas as três principais e mais usadas, sendo Swagger Editor, Swagger UI e Swagger Codegen.
O Swagger Editor é uma ferramenta que auxilia na edição e criação de definições para a API em formato YAML ou Json. 
O Swagger UI é a partir da especificação da API, podemos criar documentações elegantes e acessíveis ao usuário, permitindo assim uma compreensão maior da API. Aplicado na publicação da documentação.
Swagger Codegen a partir da especificação  em YAML gera automaticamente o “esqueleto” da API em diferentes linguagens, como Java, Python, Kotlin, Lua, Haskell, C++, entre outras .

Mais conteúdos dessa disciplina