Como! Construção de tal arquitetura micro-serviços, é muito fácil!

Autor: Alexander Lukyanchikov      
Tradutor: Oopsguy
Original: dzone.com/articles/microservice-architecture-with-spring-cloud-and-do

[Nota do Editor] como usar Primavera Bota, Primavera Nuvem, Docker Netflix e algumas ferramentas de código aberto para construir uma arquitetura de micro-service. Usando Primavera Bota, exemplos de aplicação e conceitual Primavera Nuvem Docker construída para fornecer um ponto de partida para a compreensão do modelo comum arquitetura micro-service.

O código está disponível no GitHub, e é fornecido no espelho Docker Hub. Você só precisa de um comando para iniciar todo o sistema.

https://github.com/sqshq/PiggyMetrics

Eu escolhi um projeto antigo como base para este sistema, que costumava ser o back-end de um único aplicativo. Esta aplicação fornece o processamento de finanças pessoais, organizar renda sobrecarga, gestão de poupança, análise estatística e criar uma função de previsão simples.

características do serviço

A aplicação inteira em três núcleo micro serviço. Todos eles podem ser implementados independentemente da aplicação, algumas funções de negócios em torno da organização.

Serviços de conta

Ele contém lógica de entrada geral e validação do usuário: as despesas de renda / poupança e configurações de conta gravados.

Serviço de Estatística

Cálculo dos principais parâmetros estatísticos, e captura de séries temporais para cada conta. Ele contém os valores dos pontos de dados e a moeda com base período de normalização. Estes dados podem ser usados ​​para rastrear o fluxo de caixa em conta o ciclo de vida em movimento.

Serviço de notificação

Armazenando informações de contato do usuário e configurações de notificação (como lembretes e freqüência de backup). Modalidades de pessoal necessário informações de outros serviços coletar e clientes de assinatura de envio de e-mail.

Preste atenção

  • Cada serviço tem a sua própria micro banco de dados, por isso não há maneira de contornar o API para acessar diretamente dados persistentes.

  • Neste projeto, eu uso o MongoDB como o banco de dados mestre para cada serviço. Ter mais de um tipo de arquitetura de persistência (poliglota arquitetura de persistência) também é significativo.

  • Serviço de quarto (Service-a-service) a comunicação é muito simples: micro-serviços REST API usando comunicação apenas síncrona. Uma prática comum na realidade do sistema é a utilização de uma combinação de estilo interativo. Por exemplo, um pedido GET para recuperar dados de sincronização e executa assíncrona criados utilizando o método através de um intermediário de mensagem (broker) / operação de actualização, de modo a libertar o engate entre o serviço e a memória temporária de mensagens. No entanto, isso nos dá é a consistência final.

Serviços de Infraestrutura

sistemas distribuídos padrão comum, pode nos ajudar a descrever o serviço principal é como ele funciona. Primavera nuvem fornece uma ferramenta poderosa que pode melhorar o comportamento de aplicação da Primavera de inicialização para implementar esses padrões. Vou descrever brevemente:

Serviço de configuração

Primavera Nuvem de configuração é uma configuração centralizada nível de sistema distribuído de serviços de extensão. Ele utiliza o suporte actual de armazenamento local, TGI e, Subversion repositórios tais como camada de encaixe (camada repositório).

Neste projeto, eu usei o perfil nativa, ele simplesmente carrega o arquivo de configuração do classpath local. Você pode ver o diretório compartilhado em um recurso de serviço de configuração. Agora, uma notificação de pedido de serviço quando sua configuração, a resposta de volta serviço para a configuração compartilhada / notificação-service.yml e compartilhada / application.yml (compartilhado entre todas as aplicações do cliente).

uso clientes

uso apenas Sprng-nuvem-starter-config depende compilação do aplicativo Primavera de inicialização, será automaticamente configurado para realizar outras tarefas.

Agora o seu aplicativo não requer quaisquer propriedades incorporadas, só precisará fornecer bootstrap.yml ao nome e configuração de url serviço de aplicação:

spring:  
application:  
name: notification-service  
cloud:  
config:  
  uri: http://config:8888  
  fail-fast: true  

Use Primavera Nuvem Config, você pode alterar dinamicamente a configuração da aplicação

Por exemplo, EmailService feijão usado @RefreshScope comentários. Isso significa que você pode mudar o conteúdo e assunto do email, sem ter que reconstruir e aplicações de serviços de notificação reinicialização.

Em primeiro lugar, mudar os atributos necessários para o servidor de configuração. Em seguida, a notificação solicitação de atualização do serviço: -H onda "Authorization: Bearer # símbolo #" -XPOST http://127.0.0.1:8000/notifications/refresh.

Você também pode usar webhook para automatizar esse processo.

http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_push_notifications_and_spring_cloud_bus

Preste atenção

  • atualização dinâmica, existem algumas restrições. @RefreshScope não trabalhar em conjunto e classe @Configuraion, e não age sobre o método @Scheduled.

  • fail-fast propriedade significa que se a aplicação de configuração de inicialização da Primavera não pode se conectar ao serviço, não será iniciado imediatamente. Quando você iniciar o aplicativo todos juntos, o que é muito útil.

  • As seguintes dicas de segurança importantes

Serviço autorizado

Em parte responsável pela autorização é totalmente extraído para um servidor separado que fornece serviço de token OAuth2 a recursos de back-end. servidor de autorização para autorização e de segurança entre os usuários dentro das comunicações máquina perímetro.

Neste projeto, eu uso as credenciais de senha como o tipo de autorização (porque ele é usado apenas por aplicação UI local) e credenciais do cliente como um serviço do tipo autorizado micro-autorizada de autorização do usuário.

Primavera Cloud Security fornece anotação conveniente e auto-configuração de modo que possa ser facilmente implementado no lado do servidor ou cliente. Você pode encontrar mais informações no documento, e verificar os detalhes de configuração no código do servidor de autorização.

código do servidor de autorização: https: //github.com/sqshq/PiggyMetrics/tree/master/auth-service/src/main/java/com/piggymetrics/auth

Do ponto de vista do cliente, tudo é exatamente o mesmo que com a autorização tradicional baseado em sessão. Você pode recuperar o objeto principal do pedido, verifique a função de usuário e outra de controle de acesso à base de expressão e @PreAuthorize conteúdo de anotação.

PiggyMetrics cada cliente (serviços de conta, serviços estatísticos, serviços de notificação, eo navegador) tem um alcance: o servidor para serviços de back-office para a exibição UI browser. Assim, podemos evitar controlador de proteção de acesso externo, por exemplo:

@PreAuthorize("#oauth2.hasScope('server')")  
@RequestMapping(value = "accounts/{name}", method = RequestMethod.GET)  
public List<DataPoint> getStatisticsByAccountName(@PathVariable String name) {  
return statisticsService.findByAccountName(name);  
}   

gateway API

Como você pode ver, há três serviços principais. Eles estão expostos à API cliente externo. Em sistemas reais, esse número pode crescer muito rapidamente, e todo o sistema vai se tornar muito complicado. Na verdade, processar uma página complexa pode envolver centenas de serviço.

Em teoria, o cliente pode enviar diretamente a solicitação diretamente para cada micro-serviços. Mas esta é a maneira que os desafios e limitações, se você precisa saber os endereços de todos os endpoints foram executados solicitação http para cada pedaço de informação, a fusão irá resultar para o cliente. Outro problema é que este não é um protocolo de web-friendly só pode ser utilizado no back-end.

Normalmente, uma abordagem melhor é usar o gateway API. É o único ponto de entrada do sistema, para por via solicitações ao serviço de back-end apropriado ou para processar o pedido chamando uma pluralidade de serviços de back-end e resultados de polimerização. Além disso, ele pode ser usado para autenticação, percepções, testes de estresse, canário test (teste canário), serviços de migração e transformar ativamente a gestão processamento de resposta estática.

resultados de polimerização: http: //techblog.netflix.com/2013/01/optimizing-netflix-api.html

Tal serviço Netflix open source uma vantagem, agora com a Nuvem Primavera, podemos usar uma anotação @EnabledZuulProxy para habilitá-lo. Neste projeto, eu usei armazenar conteúdo estático Zuul (aplicações de interface do usuário), eo pedido é encaminhado para os micro-serviços apropriados. O que se segue baseia-se em um prefixo simples (à base de prefixo) o encaminhamento do serviço de configuração notificação:

zuul:  
routes:  
notification-service:  
    path: /notifications/**  
    serviceId: notification-service  
    stripPrefix: false  

Isto significa que todos os pedidos para notificação / será encaminhado para o início do serviço de notificação. Como você pode ver, não há endereços codificados. Zuul mecanismo de descoberta de serviço usado para localizar e notificar os disjuntores instância de serviço e balanceamento de carga, como descrito abaixo.

service Discovery

Outro padrão arquitetônico comum é descoberta serviço. Ele permite a detecção automática da posição de uma instância de serviço de rede, desde o fracasso de extensão e atualização automática, pode ser atribuído dinamicamente endereço.

A parte fundamental da descoberta serviço está registrado. Eu uso Netflix Eureka realizar este projeto, quando o cliente é responsável por determinar a instância de serviço pode usar (servidor registo de utilização) localização multi-plataforma e de carga pedidos de equilíbrio, cliente Eureka é um bom exemplo de descoberta padrão.

Use Primavera de inicialização, você pode usar primavera-nuvem-starter-eureka-servidor dependente, @ notas EnabledEurekaServer e configuração simples para facilmente construir registro de propriedade Eureka (Eureka Registry).

anotações Use @EnabledDiscoveryClient e bootstrap.yml com o nome do aplicativo para ativar o suporte ao cliente:

spring:  
application:  
name: notification-service  

Agora, quando o aplicativo é iniciado, ele irá registrar com o servidor Eureka e fornecer metadados, como o host ea porta indicador de saúde URL, casa e assim por diante. Eureka receber mensagens de pulsação de cada instância subordinada de um serviço. Se o batimento cardíaco não excede a programação configurada, os exemplos suprimida a partir do registo.

Além disso, Eureka também oferece uma interface simples, você pode controlar o número de instâncias em execução de serviço e disponível através dela: http: // localhost: 8761

balanceamento de carga, disjuntores e cliente HTTP

Netflix OSS fornece outro conjunto de ferramentas grandes.

Fita

Ribbon é um balanceador de carga do cliente, HTTP pode ser bem controlada e comportamento do cliente TCP. Em comparação com balanceadores de carga tradicionais, cada chamadas de linha não precisa de um salto extra - você pode contactar directamente o serviço desejado.

Constatou-se serviços de Primavera nuvem são integrados e pode ser fora da caixa. cliente Eureka oferece uma lista dinâmica de servidores disponíveis, fita pode, assim, equilibrar entre eles.

hystrix

Hystrix é um modo de execução do interruptor de circuito, o que pode ser controlado pelas falhas de rede de acesso e atrasar dependente. A ideia central é a de parar as falhas em cascata em um ambiente distribuído com um grande número de micro serviço. Isso ajuda a falhar rapidamente e recuperar o mais rápido possível - em um sistema tolerante a falhas de auto-cura é muito importante.

Além do controle do disjuntor, MAMMALIA, em uso, você pode adicionar um método de backup em caso de falha do comando principal, que será chamado para obter os valores padrão.

Além disso, Hystrix gerar os resultados de cada comando e latência métricas, podemos usá-lo para monitorar o comportamento do sistema.

Fingir

Feign é um cliente HTTP declarativa, uma integração perfeita com a fita e Hystrix. Na verdade, por uma dependência e @EnabledFeignClients-spring-nuvem-starter fingir anotações, você pode usar um conjunto de balanceamento de carga, disjuntores e HTTP clientes, e vem com uma configuração padrão razoável.

O seguinte são exemplos de serviços de conta:

@FeignClient(name = "statistics-service")  
public interface StatisticsServiceClient {  
@RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)  
void updateStatistics(@PathVariable("accountName") String accountName, Account account);  
}   
  • Tudo que você precisa é uma interface

  • Você pode compartilhar seção @RequestMapping entre o método de controlador Spring MVC e finge

  • Os exemplo especifica acima apenas o serviço obrigatório ID - Estatísticas de serviço, graças a Eureka descoberta automática (mas, aparentemente, você pode usar uma URL específica para o acesso de qualquer recurso).

dashboard monitoramento

Nesta configuração projecto, Hystrix cada micro-serviços através da mola Nuvem autocarro (via AMQP corretor) vai empurrar o índice de turbina. Monitoramento projeto usando apenas uma pequena turbina de aplicação Primavera Boot and Hystrix painel.

Vamos olhar para o comportamento do sistema sob carga: serviço de estatísticas de chamadas de serviços Conta Response e uma mudança no seu atraso analógico. Response limite de tempo limite definido para 1 segundo.

Análise log

registro centralizado é muito útil quando se tenta encontrar o problema em um ambiente distribuído. ElasticSearch, Logstash e Kibana pilha de tecnologia permite pesquisar e analisar facilmente seus dados de logs, utilização e atividade da rede. Em outro projeto eu ter sido configuração Docker pronto.

segurança

configuração de segurança avançada está além do escopo deste projeto conceitual. A fim de forma mais realista simular sistema real, considere o uso de HTTPS e criptografia de conteúdo JCE propriedades armazenamento de chaves com a senha micro-serviço e configurar o servidor (para mais detalhes, consulte a documentação).

Automação de infra-estrutura

A implantação de micro-serviços muito mais complexa do que o processo para implantar uma única aplicação, porque eles são interdependentes. conjunto de base foi totalmente automatizado é muito importante. Podemos receber os seguintes benefícios por meio de entrega contínua:

  • A qualquer momento a publicação de recursos do software.

  • Qualquer edifício pode eventualmente se tornar uma liberação.

  • Construção de uma peça de trabalho (artefato) uma vez implantado, na medida do necessário.

Este é um fluxo de trabalho de entrega contínua simples, implementada neste projeto:

Nesta configuração, Travis CI para cada Git sucesso empurrar para criar a tag de imagem. Portanto, cada micro serviço Docker Hub sobre o mais recente, haverá um espelho, mas uma imagem de espelho do Git mais velho apresentadas utilizando a marca hash. Se necessário, você pode facilmente implantar qualquer um deles, e rapidamente revertida.

Como executar tudo?

É realmente simples, eu recomendo que você experimentá-lo. Lembre-se que você vai querer começar 8 aplicativo Primavera Bota, quatro instância MongoDB e RabbitMQ. Certifique-se de que não há 4GB de memória em sua máquina. Pode serviços sempre importantes através das operações de gateway, registro, configuração de autenticação e centro de serviços conta.

antes de executar

  • Instalação e Docker Docker Compose.

  • Configuração variável de ambiente: CONFIG_SERVICE_PASSWORD, NOTIFICATION_SERVICE_PASSWORD, STATISTICS_SERVICE_PASSWORD, ACCOUNT_SERVICE_PASSWORD, MONGODB_PASSWORD

Modo de produção

Neste modo, todas as últimas espelhos são puxados a partir do Docker Hub. Cópia estivador-compose.yml e executar estivador-compor-se -d pode ser.

modelo de desenvolvimento

Se você quer construir sua própria imagem (por exemplo, algumas modificações no código), você precisa clonar todo o armazém (repositório) e usar Mavne construir artefatos (artefato). Em seguida, execute o -f estivador-compor janela de encaixe-compose.yml -f estivador-compose.dev.yml-se -d

janela de encaixe-compose.dev.yml herdado janela de encaixe-compose.yml, vem com uma configuração adicional, o espelho pode ser construído no local, e expostos a todas as portas do recipiente, a fim de facilitar o desenvolvimento.

endpoints importantes (Endpoint)

  • localhost: 80 - O portal

  • localhost: 8761 - painel Eureka

  • localhost: 9000 - painel Hystrix

  • localhost: 8989 - fluxo de Turbine (fonte dashboard Hystrix)

  • localhost: 15672 - Gestão RabbitMQ

Preste atenção

Todos os aplicativos Primavera Bota precisa executar o servidor de configuração para começar. Graças à Bota de Primavera fail-fast propriedade e estivador-compsoe o reinício: sempre opções, podemos começar a todos os recipientes simultaneamente. Isto significa que todos dependem do recipiente tentará reiniciar até que o servidor de configuração instalado e funcionando até agora.

Além disso, os mecanismos de descoberta de serviço levar algum tempo depois de todas as aplicações começar. No exemplo anterior, o servidor Eureka e do cliente em seu cache local tem o mesmo metadados, serviços não estão disponíveis para qualquer descoberta cliente, pode demorar três batidas. O intervalo de pulsação padrão de 30 segundos.

Publicado 50 artigos originais · Louvor obteve 1.706 · Visualizações 2,22 milhões +

Acho que você gosta

Origin blog.csdn.net/zl1zl2zl3/article/details/105301323
Recomendado
Clasificación