Arquitetura de microsserviço - Guia rápido
Microservice é uma metodologia de desenvolvimento de aplicativos baseada em serviço. Nessa metodologia, os grandes aplicativos serão divididos nas menores unidades de serviço independentes. Microsserviço é o processo de implementação da Arquitetura Orientada a Serviços (SOA), dividindo o aplicativo inteiro como uma coleção de serviços interconectados, onde cada serviço atenderá a apenas uma necessidade de negócios.
O conceito de se tornar micro
Em uma arquitetura orientada a serviços, pacotes de software inteiros serão subdivididos em pequenas unidades de negócios interconectadas. Cada uma dessas pequenas unidades de negócios se comunicará entre si usando protocolos diferentes para entregar negócios de sucesso ao cliente. Agora a questão é: como a Microservice Architecture (MSA) difere de SOA? Em uma palavra, SOA é um padrão de design e Microservice é uma metodologia de implementação para implementar SOA ou podemos dizer que Microservice é um tipo de SOA.
A seguir estão algumas regras que precisamos manter em mente ao desenvolver um aplicativo orientado a microsserviço.
Independent - Cada microsserviço deve ser implantado de forma independente.
Coupling - Todos os microsserviços devem ser fracamente acoplados uns aos outros, de forma que as alterações em um não afetem o outro.
Business Goal - Cada unidade de serviço de todo o aplicativo deve ser a menor e capaz de atender a uma meta de negócios específica.
Vamos considerar um exemplo de portal de compras online para entender o microsserviço em profundidade. Agora, vamos dividir todo este portal de comércio eletrônico em pequenas unidades de negócios, como gerenciamento de usuários, gerenciamento de pedidos, check-in, gerenciamento de pagamentos, gerenciamento de entrega, etc. Um pedido bem-sucedido precisa passar por todos esses módulos em um tempo específico quadro, Armação. A seguir, a imagem consolidada de diferentes unidades de negócios associadas a um único sistema de comércio eletrônico.
Cada um desses módulos de negócios deve ter sua própria lógica de negócios e partes interessadas. Eles se comunicam com softwares de outros fornecedores para algumas necessidades específicas e também entre si. Por exemplo, o gerenciamento de pedidos pode se comunicar com o gerenciamento de usuários para obter informações do usuário.
Agora, considerando que você está executando um portal de compras online com todas as unidades de negócios mencionadas anteriormente, você precisa de algum aplicativo de nível corporativo consistindo em diferentes camadas, como front-end, back-end, banco de dados, etc. Se seu aplicativo não for escalado e completamente desenvolvido em um único arquivo de guerra, então será chamado de um aplicativo monolítico típico. De acordo com a IBM, um aplicativo monolítico típico deve possuir a seguinte estrutura de módulo internamente, onde apenas um terminal ou aplicativo será responsável por lidar com todas as solicitações do usuário.
Na imagem acima, você pode ver diferentes módulos, como Banco de dados, para armazenar diferentes usuários e dados de negócios. No front-end, temos um dispositivo diferente onde normalmente processamos os dados do usuário ou da empresa para uso. No meio, temos um pacote que pode ser um arquivo EAR ou WAR implementável que aceita a solicitação do final do usuário, processa-a com a ajuda dos recursos e a renderiza de volta para os usuários. Tudo ficará bem até que a empresa queira fazer alguma alteração no exemplo acima.
Considere os seguintes cenários em que você precisa alterar seu aplicativo de acordo com as necessidades do negócio.
A unidade de negócios precisa de algumas mudanças no módulo “Pesquisa”. Em seguida, você precisa alterar todo o processo de pesquisa e reimplantar seu aplicativo. Nesse caso, você está reimplantando suas outras unidades sem qualquer alteração.
Agora, novamente, sua unidade de negócios precisa de algumas alterações no módulo “Check-out” para incluir a opção “carteira”. Agora você tem que mudar o seu módulo “Check out” e reimplantar o mesmo no servidor. Observe que você está reimplantando os diferentes módulos de seus pacotes de software, embora não tenhamos feito nenhuma alteração neles. Aí vem o conceito de arquitetura orientada a serviços mais específico para a arquitetura de microsserviços. Podemos desenvolver nossa aplicação monolítica de forma que cada módulo do software se comporte como uma unidade independente, capaz de lidar com uma única tarefa de negócios de forma independente.
Considere o seguinte exemplo.
Na arquitetura acima, não estamos criando nenhum arquivo ear com serviço ponta-a-ponta compacto. Em vez disso, estamos dividindo diferentes partes do software, expondo-as como um serviço. Qualquer parte do software pode se comunicar facilmente através do consumo dos respectivos serviços. É assim que o microsserviço desempenha um grande papel no aplicativo da web moderno.
Vamos comparar nosso exemplo de carrinho de compras na linha de microsserviço. Podemos dividir o nosso carrinho de compras em diferentes módulos, como “Pesquisa”, ”Filtro”, “Checkout”, “Carrinho”, “Recomendação”, etc. Se quisermos construir um portal de carrinho de compras, então temos que construir o módulos mencionados acima, de forma que eles possam se conectar entre si para oferecer a você uma boa experiência de compra 24 horas por dia, 7 dias por semana.
Vantagens desvantagens
A seguir estão alguns pontos sobre as vantagens de usar microsserviços em vez de usar um aplicativo monolítico.
Vantagens
Small in size- Microsserviços é uma implementação do padrão de design SOA. É recomendável manter seu serviço o máximo que puder. Basicamente, um serviço não deve executar mais de uma tarefa de negócios, portanto, será obviamente pequeno em tamanho e fácil de manter do que qualquer outro aplicativo monolítico.
Focused- Conforme mencionado anteriormente, cada microsserviço é projetado para entregar apenas uma tarefa de negócios. Ao projetar um microsserviço, o arquiteto deve se preocupar com o ponto focal do serviço, que é sua entrega. Por definição, um microsserviço deve ser de natureza completa e deve estar comprometido em fornecer apenas uma propriedade de negócios.
Autonomous- Cada microsserviço deve ser uma unidade de negócios autônoma de todo o aplicativo. Com isso, o aplicativo fica mais fracamente acoplado, o que ajuda a reduzir o custo de manutenção.
Technology heterogeneity- O Microservice oferece suporte a diferentes tecnologias para se comunicarem entre si em uma unidade de negócios, o que ajuda os desenvolvedores a usar a tecnologia correta no local correto. Ao implementar um sistema heterogêneo, pode-se obter o máximo de segurança, velocidade e um sistema escalonável.
Resilience- Resiliência é uma propriedade de isolar uma unidade de software. A Microservice segue alto nível de resiliência na metodologia de construção, portanto, sempre que uma unidade falha, não impacta todo o negócio. A resiliência é outra propriedade que implementa um sistema altamente escalável e menos acoplado.
Ease of deployment- Como todo o aplicativo é subdividido em pequenos pedaços de unidades, cada componente deve ser uma pilha completa por natureza. Todos eles podem ser implantados em qualquer ambiente muito facilmente com menos complexidade de tempo, ao contrário de outros aplicativos monolíticos do mesmo tipo.
A seguir estão alguns pontos sobre as desvantagens da arquitetura de microsserviço.
Desvantagens
Distributed system- Devido à heterogeneidade técnica, diferentes tecnologias serão usadas para desenvolver diferentes partes de um microsserviço. Um grande conjunto de profissionais qualificados é necessário para dar suporte a esse grande software distribuído heterogêneo. Conseqüentemente, a distribuição e a heterogeneidade representam a desvantagem número um do uso de microsserviços.
Cost - O microsserviço é caro, pois você precisa manter um espaço de servidor diferente para diferentes tarefas de negócios.
Enterprise readiness- A arquitetura de microsserviços pode ser considerada um conglomerado de diferentes tecnologias, conforme a tecnologia evolui a cada dia. Portanto, é muito difícil fazer uma empresa de aplicativo de microsserviço pronta para ser comparada ao modelo de desenvolvimento de software convencional.
Microsserviço sobre SOA
A tabela a seguir lista certos recursos de SOA e microsserviço, destacando a importância do uso de microsserviços em vez de SOA.
Componente | SOA | Microsserviço |
---|---|---|
Padrão de design | SOA é um paradigma de design para software de computador, onde os componentes de software são expostos ao mundo exterior para uso na forma de serviços. | Micro Service é parte do SOA. É uma implementação especializada de SOA. |
Dependência | As unidades de negócios dependem umas das outras. | Todas as unidades de negócios são independentes umas das outras. |
Tamanho | O tamanho do software é maior do que o software convencional. | O tamanho do software é pequeno. |
Tecnologia | A pilha de tecnologia é menor que o microsserviço. | O microsserviço é de natureza heterogênea, pois tecnologias exatas são usadas para realizar uma tarefa específica. Os microsserviços podem ser considerados um conglomerado de muitas tecnologias. |
Autônomo e Foco | Os aplicativos SOA são desenvolvidos para executar várias tarefas de negócios. | Os aplicativos de microsserviço são desenvolvidos para executar uma única tarefa de negócios. |
Natureza | Monolítico por natureza. | Pilha completa na natureza. |
Desdobramento, desenvolvimento | A implantação é demorada. | A implantação é muito fácil. Conseqüentemente, será menos demorado. |
Custo-efetividade | Mais econômico. | Menos custo-benefício. |
Escalabilidade | Menos em comparação com microsserviços. | Totalmente dimensionado. |
Exemplo | Vamos considerar um aplicativo de reserva CAB online. Se quisermos construir esse aplicativo usando SOA, então suas unidades de software serão -
|
Se o mesmo aplicativo for construído usando arquitetura de microsserviço, então suas APIs serão -
|
O dimensionamento é um processo de decompor um software em unidades diferentes. O dimensionamento também define em termos de escalabilidade. Escalabilidade é o potencial para implementar mais recursos avançados do aplicativo. Isso ajuda a melhorar a segurança, durabilidade e capacidade de manutenção do aplicativo. Temos três tipos de procedimentos de escalonamento que são seguidos nas indústrias. A seguir estão as diferentes metodologias de dimensionamento junto com os exemplos correspondentes da vida real.
Dimensionamento do eixo X
A escala do eixo X também é chamada de escala horizontal. Neste procedimento, todo o aplicativo é subdividido em diferentes partes horizontais. Normalmente, qualquer aplicativo de servidor da web pode ter esse tipo de escala. Considere uma arquitetura MVC normal que segue a escala horizontal, conforme mostrado na figura a seguir.
Como exemplo, podemos considerar qualquer aplicativo de servlet JSP. Nesta aplicação, o controlador controla todas as solicitações e irá gerar visualização comunicando-se com o modelo sempre que necessário. Normalmente, os aplicativos monolíticos seguem este método de dimensionamento. O dimensionamento do eixo X é muito básico por natureza e consome muito menos tempo. Nesta metodologia, um software será dimensionado dependendo das diferentes tarefas pelas quais a unidade é responsável. Por exemplo, o controlador é responsável por controlar a solicitação de entrada e saída, a visualização é responsável por representar a funcionalidade do negócio para os usuários no navegador, enquanto o modelo é responsável por armazenar nossos dados e funciona como banco de dados.
Dimensionamento do eixo Y
A escala do eixo Y também é chamada de escala vertical que inclui qualquer escala de nível de recurso. Qualquer sistema DBaaS ou Hadoop pode ser considerado dimensionado para o eixo Y. Nesse tipo de escalonamento, a solicitação do usuário é redirecionada e restringida pela implementação de alguma lógica.
Vamos considerar o Facebook como um exemplo. O Facebook precisa lidar com 1,79 milhão de usuários a cada segundo; portanto, controlar o tráfego é uma grande responsabilidade dos engenheiros de rede do Facebook. Para superar qualquer perigo, eles seguem a escala do eixo Y, que inclui a execução de vários servidores com o mesmo aplicativo ao mesmo tempo. Agora, para controlar esse enorme nível de tráfego, o Facebook redireciona todo o tráfego de uma região para um servidor específico, conforme mostrado na imagem. Essa transferência de tráfego com base na região é chamada de balanceamento de carga na linguagem arquitetônica.
Este método de dividir recursos em pequenas unidades de negócios independentes é conhecido como dimensionamento do eixo Y.
Dimensionamento do eixo Z
A escala dos eixos X e Y é muito mais fácil de entender. No entanto, um aplicativo também pode ser dimensionado no nível de negócios, o que é chamado de dimensionamento do eixo Z. A seguir está um exemplo de dimensionamento de um aplicativo de serviço de táxi em diferentes verticais de unidades de negócios.
Vantagens do dimensionamento
Cost - O dimensionamento adequado de um software reduzirá o custo de manutenção.
Performance - Devido ao acoplamento fraco, o desempenho de um software dimensionado corretamente é sempre melhor do que um software não dimensionado.
Load distribution - Usando diferentes tecnologias, podemos facilmente manter a carga do nosso servidor.
Reuse - A escalabilidade de um software também aumenta a usabilidade do software.
A Microservice implementa SOA internamente. Em um sentido mais amplo, podemos considerá-lo como um subconjunto de um aplicativo SOA.
Regra e fluxo de trabalho
A seguir estão os princípios que precisam ser observados durante o desenvolvimento de um microsserviço.
High Cohesion- Todos os modelos de negócios precisam ser subdivididos na menor parte do negócio, tanto quanto possível. Cada serviço deve ser focado para executar apenas uma tarefa de negócios.
Independent - Todos os serviços devem ser completos por natureza e independentes uns dos outros.
Business Domain Centric - O software será modularizado de acordo com a unidade de negócios e não é baseado em camadas.
Automation- A implantação de teste será automatizada. Tente introduzir o mínimo de interação humana.
Observable - Cada serviço será de natureza completa e deve ser implementado de forma independente e observável como um aplicativo corporativo.
Gerenciamento de equipe
“Two Pizza Rule” é um tipo de regra que restringe o número de participantes em uma equipe de desenvolvimento de microsserviço. De acordo com essa regra, o número de membros da equipe de uma aplicação deve ser tão pequeno que eles possam ser alimentados por duas pizzas. Geralmente, o número não deve ser maior do que 8. Como o microsserviço é uma pilha completa por natureza, a equipe também é uma pilha completa por natureza. Para aumentar a produtividade, precisamos formar uma equipe de no máximo 8 membros com todos os tipos de conhecimentos necessários para esse serviço.
Gestão de Tarefas
A tarefa é um papel importante no ciclo de vida de desenvolvimento de software. O desenvolvimento de um aplicativo em grande escala pode ser dividido em várias pequenas unidades de tarefa. Vamos considerar que precisamos desenvolver um aplicativo como o Facebook. Então, a funcionalidade “Log in” pode ser considerada como uma tarefa de todo o processo de construção. O progresso de cada uma dessas tarefas precisa ser monitorado adequadamente por profissionais altamente qualificados. Ágil é a conhecida estrutura de processo seguida nas indústrias para acompanhar o bom gerenciamento de tarefas.
Até agora aprendemos o que é microsserviço e quais são as necessidades básicas dele acima da arquitetura MVC moderna. Neste capítulo, aprenderemos os diferentes elementos dessa arquitetura que são igualmente importantes para um serviço.
Categorias de Serviços
Com o nome Microservice, supomos que será um serviço que pode ser consumido por meio de protocolos HTTP, no entanto, precisamos saber que tipo de serviço pode ser construído usando esta arquitetura. A seguir está a lista de serviços que podem ser implementados usando a arquitetura Microservice.
Platform as a Service [PaaS]- Nesta arquitetura orientada a serviços, a plataforma se apresenta como uma ferramenta que pode ser customizada de acordo com as necessidades do negócio. PaaS desempenha um papel importante no desenvolvimento de aplicativos móveis. O maior exemplo de PaaS é o motor Google App, onde o Google fornece diferentes plataformas úteis para construir seu aplicativo. PaaS foi originalmente desenvolvido para fornecer uma arquitetura ou infraestrutura integrada aos desenvolvedores. Ele reduz a complexidade de programação de nível superior em um tempo drasticamente reduzido. A seguir está um instantâneo do PaaS fornecido pelo Google.
Software as a Service [SaaS]- Software as a Service é um negócio de licenciamento de software, em que o software é hospedado centralmente e licenciado por assinatura. O SaaS pode ser acessado principalmente por meio do navegador e é um padrão de arquitetura muito comum em muitos setores de negócios, como Gestão de Recursos Humanos (HRM), Planejamento de Recursos Empresariais (ERP), Gestão de Relacionamento com o Cliente (CRM), etc. A captura de tela a seguir mostra exemplos de diferentes SaaS fornecidos pela Oracle.
Infrastructure as a Service [IaaS]- A infraestrutura desempenha um bom papel nas indústrias de TI. Usando a computação em nuvem, algumas organizações fornecem infraestrutura virtual como seus serviços. IaaS é muito útil para trazer agilidade, economia, segurança, desempenho, produtividade, etc. no desenvolvimento de software. Amazon EC2 e Microsoft Azure são os maiores exemplos de IaaS. A imagem a seguir descreve um exemplo de AWS, onde o data center é fornecido como IaaS.
Data as a Service [DaaS]- A tecnologia da informação lida com dados e alguns dos principais líderes da indústria acreditam que os dados serão o novo sustento da sociedade. DaaS é um tipo de serviço em que os dados são compartilhados com conglomerados de negócios para pesquisa e análise. O DaaS traz simplicidade, agilidade e segurança na camada de acesso a dados. A seguir está um exemplo de nuvem de dados Oracle, que pode ser acessada ou licenciada para suas próprias necessidades de negócios.
Back End as a Service [BaaS]- BaaS também é conhecido como MBaaS, que significa back-end móvel como serviço. Nesse tipo de serviço, o back-end do aplicativo será fornecido às unidades de negócios para seus próprios empreendimentos. Todas as notificações push e serviços de redes sociais se enquadram neste tipo de serviço. Facebook e Twitter são exemplos de conhecidos provedores de serviços BaaS.
Segurança
Quando se trata de lidar com toneladas de dados de clientes, a segurança desempenha um papel importante. A questão da segurança está associada a todos os tipos de serviços disponíveis no mercado. Qualquer que seja a nuvem que você está usando - privada, pública, híbrida, etc., a segurança deve ser mantida em todos os níveis. Todo o problema de segurança pode ser subdividido amplamente nas seguintes partes -
Security issue faced by service providers - Este tipo de problema de segurança é enfrentado pelos provedores de serviços como Google, Amazon, etc. Para garantir a proteção da segurança, a verificação de antecedentes do cliente é necessária, especialmente daqueles que têm acesso direto à parte central da nuvem.
Security issue faced by consumers- A nuvem é econômica, portanto, é amplamente usada em todos os setores. Algumas organizações armazenam os detalhes do usuário em data centers de terceiros e extraem os dados sempre que necessário. Portanto, é obrigatório manter níveis de segurança de forma que quaisquer dados privados de um cliente não sejam visíveis para outros usuários.
Para evitar os problemas de segurança mencionados acima, a seguir estão alguns dos mecanismos de defesa usados pelas organizações.
Deterrent Control - Conheça sua ameaça potencial para reduzir o ataque cibernético.
Preventive Control - Manter uma política de autenticação de alto nível para acessar sua nuvem.
Detective Control - Monitore seus usuários e detecte qualquer risco potencial.
Corrective Control - Trabalhar em estreita colaboração com diferentes equipes e corrigir os problemas que surgem durante a fase de controle de detecção.
Composição de software significa a maneira de construir seu produto de software. Basicamente, trata-se de um diagrama de arquitetura de software de alto nível, onde diferentes módulos de seu software se comunicam para objetivos de negócios específicos. Neste capítulo, aprenderemos sobre diferentes padrões de composição de software amplamente usados nas organizações. No microsserviço, dividimos cada função em um processo. Cada um desses serviços será independente e de natureza completa.
A decomposição funcional desempenha um papel importante na construção de seus microsserviços. Ele fornece agilidade, flexibilidade e escalabilidade para seu aplicativo.
Padrão de agregador
O padrão de agregador é o padrão da web mais simples que pode ser implementado durante o desenvolvimento de um microsserviço. Nesse padrão de composição, um módulo da web simples atuará como um balanceador de carga, o que significa que chamará diferentes serviços de acordo com os requisitos. A seguir está um diagrama que descreve um aplicativo da web de microsserviço simples com design agregador. Como pode ser visto na imagem a seguir, o "Agregador" é responsável por chamar diferentes serviços um por um. Se precisarmos aplicar qualquer lógica de negócios sobre os resultados dos serviços A, B e C, podemos implementar a lógica de negócios no próprio agregador.
Um agregador pode ser novamente exposto como outro serviço para o mundo exterior, que pode ser consumido por outros sempre que necessário. Ao desenvolver o serviço da web de padrão agregador, precisamos ter em mente que cada um de nossos serviços A, B e C deve ter suas próprias camadas de cache e deve ser de pilha completa por natureza.
Padrão Proxy
O padrão de microsserviço proxy é uma variação do modelo de agregador. Neste modelo, usaremos o módulo proxy em vez do módulo de agregação. O serviço proxy pode chamar serviços diferentes individualmente.
No padrão Proxy, podemos construir um nível extra de segurança fornecendo uma camada proxy de despejo. Esta camada atua de forma semelhante à interface.
Padrão Acorrentado
Como o nome sugere, esse tipo de padrão de composição seguirá a estrutura da cadeia. Aqui, não usaremos nada entre o cliente e a camada de serviço. Em vez disso, permitiremos que o cliente se comunique diretamente com os serviços e todos os serviços serão encadeados de tal maneira que a saída de um serviço será a entrada do próximo serviço. A imagem a seguir mostra um microsserviço de padrão encadeado típico.
Uma das principais desvantagens dessa arquitetura é que o cliente ficará bloqueado até que todo o processo seja concluído. Portanto, é altamente recomendável manter o comprimento da corrente o mais curto possível.
Padrão de microsserviço de filial
O microsserviço de ramificação é a versão estendida do padrão agregador e do padrão de cadeia. Nesse padrão de design, o cliente pode se comunicar diretamente com o serviço. Além disso, um serviço pode se comunicar com mais de um serviço ao mesmo tempo. A seguir está a representação esquemática do microsserviço Branch.
O padrão de microsserviço de ramificação permite que o desenvolvedor configure chamadas de serviço dinamicamente. Todas as chamadas de serviço acontecerão de forma concorrente, o que significa que o serviço A pode chamar os serviços B e C simultaneamente.
Padrão de recurso compartilhado
O padrão de recursos compartilhados é, na verdade, um conglomerado de todos os tipos de padrões mencionados anteriormente. Nesse padrão, o cliente ou o balanceador de carga se comunicará diretamente com cada serviço sempre que necessário. Este é o padrão de design mais eficaz, amplamente seguido na maioria das organizações. A seguir está uma representação diagramática do padrão de design de Recursos Compartilhados.
Neste capítulo, desenvolveremos um aplicativo baseado em CRUD com arquitetura SOA. Posteriormente, nos capítulos subsequentes, dividiremos esse serviço em microsserviço e aprenderemos a diferença básica entre SOA e a arquitetura de microsserviço.
Configuração e instalação do sistema
Nesta seção, construiremos um aplicativo CRUD de amostra, que retornará um objeto JSON como uma resposta sempre que chamarmos nosso serviço. Usaremos a estrutura de Jersey para desenvolver o mesmo. A seguir estão as etapas para configurar seu ambiente de sistema local.
Desenvolvendo um aplicativo CRUD
Step 1- Usaremos o NetBeans como IDE de desenvolvimento. Baixe e instale a versão mais recente disponível no site oficial do NetBeanshttps://netbeans.org/downloads/.
Step 2- Abra seu NetBeans IDE. Vá para “Arquivo -> Novo Projeto”. A seguinte imagem aparece. Escolha “Maven” como uma categoria e selecione “Projeto do ArchType” como um projeto e clique em Avançar.
Isso fará o download de todos os arquivos jar necessários para criar seu primeiro projeto Maven e serviço da Web RESTful.
Step 3- Ao clicar no botão Avançar na etapa anterior, a seguinte captura de tela aparece. Aqui, você terá que especificar o arquétipo Maven.
Na caixa de pesquisa, procure “Jersey-archType-Webapp (2.16)” e marque a caixa de seleção “Mostrar mais antigos”.
Step 4- Depois de selecionar o mesmo, você será redirecionado para a tela seguinte. Selecione o jar preferido na lista e clique em Avançar para continuar.
Step 5- Nesta etapa, você precisa fornecer o nome do seu projeto e seu ID de grupo, bem como os detalhes do pacote. Depois de fornecer todas essas informações, clique em Concluir para continuar.
Step 6- Você concluiu a configuração do seu espaço de trabalho. O diretório do projeto terá a seguinte aparência.
Verifique sua pasta “Dependências” e você verá que o Maven baixou automaticamente todos os arquivos jar necessários para este projeto.
Step 7- Seu espaço de trabalho está configurado e você pode começar com a codificação. Vá em frente e crie quatro classes e pacotes conforme mencionado na imagem a seguir. Você pode descobrir que MyResource.java já foi criado pelo Maven, pois o Maven é inteligente o suficiente para detectar que você irá construir seu próprio serviço web.
Step 8 - Depois de concluir a etapa acima, construiremos nossa classe POJO que é UserProfile.java da seguinte maneira.
package com.tutorialspoint.userprofile.Model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class UserProfile {
private long ProId;
private String FName;
private String LName;
private String Add;
public UserProfile(){}
public UserProfile(long Proid, String Fname, String Lname,String Add) {
this.ProId = Proid;
this.FName = Fname;
this.LName = Lname;
this.Add = Add;
}
public long getProId() {
return ProId;
}
public void setProId(long ProId) {
this.ProId = ProId;
}
public String getFName() {
return FName;
}
public void setFName(String FName) {
this.FName = FName;
}
public String getLName() {
return LName;
}
public void setLName(String LName) {
this.LName = LName;
}
public String getAdd() {
return Add;
}
public void setAdd(String Add) {
this.Add = Add;
}
}
Step 9- Agora vamos criar nossa classe Database. Como isso faz parte do material de aprendizagem, não usaremos nenhum banco de dados como nosso banco de dados. Usaremos uma memória Java embutida para funcionar como nossa memória temporária. Como você pode ver no seguinte conjunto de código, usaremos o MAP como nosso banco de dados. Toda a operação do serviço web que realizarmos, trabalharemos neste MAP definido na aula.
package com.tutorialspoint.userprofile.DAO;
import com.tutorialspoint.userprofile.Model.UserProfile;
import java.util.HashMap;
import java.util.Map;
public class DatabaseClass {
private static Map<Long,UserProfile> messages = new HashMap<Long,UserProfile>();
public static Map<Long,UserProfile> getUsers() {
return messages;
// Each time this method will return entire map as an instance of database
}
}
Step 10- Agora vamos construir nossa classe de serviço. Vá em frente e copie e cole o seguinte conjunto de código na classe “ProfileService.java”. Esta é a classe em que declararemos todos os nossos métodos de serviço da web que serão expostos para o mundo exterior. Precisamos criar uma referência de nosso DatabaseClass de forma que nosso banco de dados temporário possa ser acessado nesta classe.
package com.tutorialspoint.userprofile.service;
import com.tutorialspoint.userprofile.DAO.DatabaseClass;
import com.tutorialspoint.userprofile.Model.UserProfile;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ProfileService {
private Map<Long,UserProfile> Userprofiles = DatabaseClass.getUsers();
// Creating some predefine profile and populating the same in the map
public ProfileService() {
UserProfile m1 = new UserProfile(1L,"Tutorials1","Point1","TutorialsPoint.com");
UserProfile m2 = new UserProfile(2L,"Tutorials2","Point2","TutorialsPoint.com2");
UserProfile m3 = new UserProfile(3L,"Tutorials3","Point3","TutorialsPoint.com3");
UserProfile m4 = new UserProfile(4L,"Tutorials4","Point4","TutorialsPoint.com4");
Userprofiles.put(1L, m1);
Userprofiles.put(2L, m2);
Userprofiles.put(1L, m3);
Userprofiles.put(2L, m4);
}
//Method to fetch all profile
public List<UserProfile> getAllProfile() {
List<UserProfile> list = new ArrayList<UserProfile>(Userprofiles.values());
return list;
} // Method to fetch only one profile depending on the ID provided
public UserProfile getProfile(long id) {
return Userprofiles.get(id);
} //Method to add profile
public UserProfile addProfile(UserProfile UserProfile) {
UserProfile.setProId(Userprofiles.size()+1);
Userprofiles.put(UserProfile.getProId(), UserProfile);
return UserProfile;
} //method to update Profile
public UserProfile UpdateProfile(UserProfile UserProfile) {
if(UserProfile.getProId()<=0) {
return null;
} else {
Userprofiles.put(UserProfile.getProId(), UserProfile);
return UserProfile;
}
} //method to delete profile
public void RemoveProfile(long Id) {
Userprofiles.remove(Id);
}
}
Step 11 - Nesta etapa, criaremos nossa classe Resource que será vinculada à URL e o serviço correspondente será chamado.
package com.tutorialspoint.userprofile.Resource;
import com.tutorialspoint.userprofile.Model.UserProfile;
import com.tutorialspoint.userprofile.service.ProfileService;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/Profile")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class ProfileResource {
ProfileService messageService = new ProfileService();
@GET
public List<UserProfile> getProfile() {
return messageService.getAllProfile();
}
@GET
@Path("/{ProID}")
public UserProfile getProfile(@PathParam("ProID")long Id) {
return messageService.getProfile(Id);
}
@POST
public UserProfile addProfile(UserProfile profile) {
return messageService.addProfile(profile);
}
@PUT
@Path("/{proID}")
public UserProfile UpdateProfile(@PathParam("proID")long Id,UserProfile UserProfile) {
UserProfile.setProId(Id);
return messageService.UpdateProfile(UserProfile);
}
@DELETE
@Path("/{ProID}")
public void deleteProfile(@PathParam("ProID")long Id) {
messageService.RemoveProfile(Id);
}
}
Step 12- Limpe a compilação do projeto e execute-o. Se tudo correr bem, você deve obter a seguinte saída no navegador, ao acessarhttp://localhost:8080/UserProfile/webapi/Profile” URL.
Você pode ver que diferentes entradas são preenchidas usando representação XML.
Métodos diferentes podem ser testados usando o Postman aplicando o URL do método adequado.
@GET method - A captura de tela a seguir demonstra como podemos obter o resultado desejado para a solicitação get, que retorna todos os detalhes do usuário.
@POST- A seguinte solicitação pode ser usada para testar nosso método Post. Observe como o proId foi gerado automaticamente.
@PUT- Este método atualizará as entradas. A captura de tela a seguir demonstra como Jersey obtém o perfil do URL de solicitação e atualiza a mesma resposta do perfil do usuário.
Da mesma forma, você pode verificar outros métodos disponíveis em seus serviços da web.
Na seção anterior, desenvolvemos um serviço que irá expor a funcionalidade CRUD. Agora, sempre que tentamos implementar este serviço em nosso aplicativo, precisamos criar um cliente deste aplicativo e anexá-lo ao nosso aplicativo. Neste capítulo, aprenderemos como construir essa funcionalidade usando o conceito de microsserviço. A seguir está uma representação esquemática de nosso aplicativo construído usando as etapas acima.
O ator deve ser a porta de entrada do nosso serviço. Neste caso, “ProfileResource.java” assume a responsabilidade de um ator. Esta classe irá chamar diferentes métodos para realizar diferentes operações, como adicionar, atualizar e excluir.
Decomposição do aplicativo CRUD
De acordo com o princípio básico do microsserviço, precisamos ter apenas uma tarefa de negócios para cada um dos módulos, portanto, um ator não deve ser responsável por todas as quatro funcionalidades do CRUD. Considere o exemplo a seguir, onde introduzimos algumas novas funções de forma que fique conceitualmente claro para você que Microservice é uma representação arquitetônica de SOA.
“Usuário principal” é o usuário que se comunica com o “Controlador de aplicativo” para atender às suas necessidades. “Application Controller” é aquele que apenas chama diferentes “Resource Managers” dependendo da solicitação do usuário final. “Resource Manager” faz o trabalho que deve ser feito. Vamos dar uma olhada rápida nas diferentes funções das diferentes unidades do aplicativo.
End User/Main Users - Solicitações de alguns recursos ao Controlador de Aplicativos.
Application - Recebe a solicitação e a encaminha para o Gerente de Recursos específico.
Resource Manager - Realiza o trabalho real de atualização, exclusão e adição de usuários.
Veja como a responsabilidade total de uma classe é distribuída entre as diferentes outras classes.
Neste capítulo, construiremos um aplicativo de microsserviço que consumirá diferentes serviços disponíveis. Todos nós sabemos que o microsserviço não é uma maneira econômica de construir um aplicativo, pois cada serviço que construímos será uma pilha completa por natureza. Construir um microsserviço no ambiente local exigiria uma configuração de sistema de alta tecnologia, pois você precisa ter quatro instâncias de um servidor para continuar em execução de forma que possa ser consumido em um determinado momento. Para construir nosso primeiro microsserviço, usaremos alguns dos pontos de extremidade SOA disponíveis e consumiremos o mesmo em nosso aplicativo.
Configuração e instalação do sistema
Antes de prosseguir para a fase de construção, prepare seu sistema adequadamente. Você precisaria de alguns serviços públicos da web. Você pode facilmente pesquisar isso no Google. Se você deseja consumir o serviço da web SOAP, obterá um arquivo WSDL e, a partir daí, precisará consumir o serviço da web específico. Para o serviço REST, você precisará de apenas um link para consumir o mesmo. Neste exemplo, você irá congestionar três serviços da web diferentes “SOAP”, “REST” e “customizado” em um aplicativo.
Arquitetura de Aplicativo
Você criará um aplicativo Java usando um plano de implementação de microsserviço. Você criará um serviço personalizado e a saída desse serviço funcionará como uma entrada para outros serviços.
A seguir estão as etapas a seguir para desenvolver um aplicativo de microsserviço.
Step 1: Client creation for SOAP service- Existem muitas APIs da web gratuitas disponíveis para aprender um serviço da web. Para o propósito deste tutorial, use o serviço GeoIP de “http://www.webservicex.net/.”O arquivo WSDL é fornecido no seguinte link em seu site “ webservicex.net. Para gerar o cliente a partir desse arquivo WSDL, tudo que você precisa fazer é executar o seguinte comando em seu terminal.
wsimport http://www.webservicex.net/geoipservice.asmx?WSDL
Este comando irá gerar todos os arquivos de cliente necessários em uma pasta chamada “SEI”, que tem o nome de interface de terminal de serviço.
Step 2: Create your custom web service- Siga o mesmo processo mencionado em um estágio anterior neste tutorial e crie uma API REST baseada em Maven chamada “CustomRest”. Depois de concluído, você encontrará uma classe chamada “MyResource.java”. Vá em frente e atualize esta classe usando o código a seguir.
package com.tutorialspoint.customrest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "IND|INDIA|27.7.65.215";
}
}
Quando tudo estiver concluído, vá em frente e execute este aplicativo no servidor. Você deve obter a seguinte saída no navegador.
Este é o servidor da web, que retorna um objeto de string assim que é chamado. Este é o serviço de entrada que fornece entradas que podem ser consumidas por outro aplicativo para gerar registros.
Step 3: Configure another Rest API- Nesta etapa, consuma outro serviço da web disponível em services.groupkt.com. Isso retornará um objeto JSON quando chamado.
Step 4: Create JAVA application - Crie um aplicativo Java normal selecionando “New Project” -> “JAVA project” e clique em Finish conforme mostrado na imagem a seguir.
Step 5: Add the SOAP client- Na etapa 1, você criou o arquivo do cliente para o serviço da web SOAP. Vá em frente e adicione esses arquivos do cliente ao seu projeto atual. Após a adição bem-sucedida dos arquivos do cliente, o diretório do seu aplicativo terá a seguinte aparência.
Step 6: Create your main app- Crie sua classe principal onde você consumirá todos esses três serviços da web. Clique com o botão direito no projeto de origem e crie uma nova classe chamada “MicroServiceInAction.java”. A próxima tarefa é chamar diferentes serviços da web a partir deste.
Step 7: Call your custom web service - Para isso, vá em frente e adicione o seguinte conjunto de códigos para implementar a chamada do seu próprio serviço.
try {
url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
inputToOtherService = output;
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Step 8: Consume SOAP Services- Você gerou seu arquivo de cliente, mas não sabe qual método deve ser chamado em todo o pacote? Para isso, você precisa consultar o WSDL novamente, que você usou para gerar seus arquivos de cliente. Cada arquivo WSDL deve ter uma pesquisa de tag “wsdl: service” para esta tag. Deve ser o ponto de entrada desse serviço da web. A seguir está o ponto de extremidade de serviço deste aplicativo.
Agora você precisa implementar este serviço em seu aplicativo. A seguir está o conjunto de código Java de que você precisa para implementar seu serviço da web SOAP.
GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
// Ipaddress is output of our own web service.
System.out.println("Country Name from SOAP Webserivce ---"+newGeoIP.getCountryName());
Step 9: Consume REST web service- Dois dos serviços foram consumidos até agora. Nesta etapa, outro serviço da web REST com URL customizado será consumido com a ajuda de seu serviço da web customizado. Use o seguinte conjunto de código para fazer isso.
String url1="http://services.groupkt.com/country/get/iso3code/";//customizing the Url
url1 = url1.concat(countryCode);
try {
URL url = new URL(url1);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Step 10: Consume all services - Considerando que o seu serviço web “CustomRest” está em execução e você está conectado à Internet, se tudo for concluído com sucesso, a seguir deverá ser sua aula principal consolidada.
package microserviceinaction;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;
import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;
public class MicroServiceInAction {
static URL url;
static HttpURLConnection conn;
static String output;
static String inputToOtherService;
static String countryCode;
static String ipAddress;
static String CountryName;
public static void main(String[] args) {
//consuming of your own web service
try {
url = new URL("http://localhost:8080/CustomRest/webapi/myresource");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
inputToOtherService = output;
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Fetching IP address from the String and other information
StringTokenizer st = new StringTokenizer(inputToOtherService);
countryCode = st.nextToken("|");
CountryName = st.nextToken("|");
ipAddress = st.nextToken("|");
// Call to SOAP web service with output of your web service---
// getting the location of our given IP address
String Ipaddress = ipAddress;
GeoIPService newGeoIPService = new GeoIPService();
GeoIPServiceSoap newGeoIPServiceSoap = newGeoIPService.getGeoIPServiceSoap();
GeoIP newGeoIP = newGeoIPServiceSoap.getGeoIP(Ipaddress);
System.out.println("Country Name from SOAP Webservice ---"+newGeoIP.getCountryName());
// Call to REST API --to get all the details of our country
String url1 = "http://services.groupkt.com/country/get/iso3code/"; //customizing the Url
url1 = url1.concat(countryCode);
try {
URL url = new URL(url1);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Depois de executar esse arquivo, você verá a seguinte saída no console. Você desenvolveu com sucesso seu primeiro aplicativo de microsserviço.