Microsserviços ASP.NET Core: aplicativos que serão responsáveis por uma única fatia "vertical" de uma arquitetura geral de aplicativo/serviço.
Por que os microsserviços do ASP.NET Core?
Há muitos opiniões e recomendações sobre o que são microsserviços, quando usar microsserviços em vez de um monólito e muito mais.
Microsserviços pic.twitter.com/3xYWUgP2QW
- David Neal 🥓🥑 (@reverentgeek) 10 de julho de 2017
Este artigo não abordará essas questões em sua totalidade. Em vez disso, tentaremos apenas caminhar antes de voar.
Vamos considerar que estamos explorando arquitetura de microsserviçose queremos aproveitar a persistência poliglota para usar um banco de dados NoSQL (Couchbase) para um caso de uso específico. Para o nosso projeto, vamos analisar um Banco de dados por serviço e usar o Docker (docker-compose) para gerenciar o banco de dados para o ASP.NET Core Microservices prova de conceito.
Esta postagem do blog usará o Couchbase Server, mas você também pode aplicar os conceitos básicos aqui aos outros bancos de dados em sua arquitetura de microsserviços.
Estou usando ASP.NET Core porque é uma estrutura de código aberto e multiplataforma. Além disso, Visual Studio (embora não seja obrigatório) nos fornecerá algumas ferramentas úteis para trabalhar com o Docker e o docker-compose. Mas, novamente, você pode aplicar os conceitos básicos aqui a qualquer estrutura da Web ou linguagem de programação de sua escolha.
Etapa 1: Criar uma nova solução
Usarei o Visual Studio para esta postagem do blog, mas você pode obter o mesmo efeito (talvez com um pouco mais de trabalho) no Visual Studio Code ou na linha de comando antiga.
Crie um novo projeto ASP.NET Core. Chamei o meu de HelloMicroservice (e o O código-fonte completo está disponível no GitHub para sua referência.
Para meu microsserviço ASP.NET Core, também tomei essas decisões no Visual Studio:
- Aplicativo Web MVC (gera algum HTML básico para fins de exibição, mas você poderia usar um projeto de API com a mesma facilidade)
- ASP.NET Core 3 (o ASP.NET Core mais recente no momento em que este artigo foi escrito)
- Configurar para HTTPS (não é estritamente necessário, mas é uma boa ideia)
- Habilitar o suporte ao Docker
Neste ponto, você deve ter um projeto ASP.NET Core muito básico. Em seguida, adicionaremos alguma orquestração e um banco de dados.
Etapa 2: Adicionar suporte ao docker-compose
Clique com o botão direito do mouse no projetoe clique em "Add" (Adicionar) e depois em "Container Orchestrator Support" (Suporte ao Orquestrador de Contêineres).
Lembre-se de que o único objetivo deste projeto é iniciar o desenvolvimento de uma prova de conceito para microsserviços ASP.NET Core. É mais fácil lidar com o Docker-compose do que com o Kubernetes para o desenvolvimento de máquinas locais. É por isso que estou escolhendo a opção "Docker Compose", mesmo que, eventualmente, eu queira implantação para o Kubernetes.
Também escolhi o Linux, porque é nele que espero implantar mais tarde.
Depois de concluir essa etapa, um item "docker-compose" será adicionado à sua solução.
Se você der uma olhada no arquivo docker-compose.yml, verá que ele tem um definido nele: hellomicroservice
. Observe também que o "Docker Compose" agora aparece na barra de ferramentas do Visual Studio.
Nesse ponto, você pode pressionar CTRL+F5 para executar. O Visual Studio usará o Docker Compose para criar uma imagem de seu projeto e executá-la no Docker. Seu navegador deve abrir automaticamente e você verá a tela padrão de "Bem-vindo"
Estamos progredindo. A próxima coisa que precisamos fazer é executar um banco de dados com o docker-compose e fazer com que nosso aplicativo ASP.NET Core se comunique com o banco de dados. Quando essas próximas etapas forem concluídas, teremos o shell mínimo básico do ASP.NET Core Microservices.
Etapa 3: Adicionar orquestração de banco de dados ao docker-compose
O Couchbase faz imagens de contêineres oficiais disponíveis no Docker Hub. Para usar essas imagens, vamos adicionar outro serviço em serviços:
no arquivo docker-compose.yml:
1 2 3 4 5 6 7 |
serviços: couchbase: imagem: couchbase:empresa-6.0.3 volumes: - "./couchbase:/opt/couchbase/var" # pasta local onde os dados do couchbase estão armazenados portos: - "8091:8091" # Permite acesso local à UI de gerenciamento |
Os princípios básicos do que você precisa são:
couchbase:
Isso inicia uma definição de serviço chamada "couchbase" (você pode dar outro nome, se quiser)imagem: couchbase:enterprise-6.0.3
A imagem a ser usada para esse serviço. É sempre uma boa ideia ser explícito e usar uma tag como essa, caso contrário, o padrão pode ser a imagem "mais recente", o que não é necessariamente o que você deseja.portos:
Isso define quais números de porta devem ser expostos externo do Docker. Estou expondo apenas 8091, porque esse é o número da porta da interface do usuário do Couchbase (consulte também: Requisitos de rede e firewall)
O volumes:
não é estritamente necessário. No entanto, o uso de um volume significa que, mesmo quando a imagem do couchbase parar de ser executada, os arquivos de dados em /opt/couchbase/var
será salvo no computador host (o sistema de arquivos do seu computador) e poderá ser montado novamente na próxima vez que você executar a imagem. Isso significa que todos os dados que você colocar no couchbase ainda estarão lá na próxima vez que você executar a imagem.
Se você pressionar CTRL+F5 para executar o aplicativo, o Docker Compose iniciará a orquestração, incluindo ambos o serviço de atendimento ao cliente e a imagem do couchbase. Elas não têm nada a ver uma com a outra (ainda), a não ser o fato de estarem sendo executadas lado a lado dentro do Docker. Se você abrir uma linha de comando e executar docker ps
você verá algo parecido com isto:
1 2 3 4 5 |
PS C:\JANELAS\sistema32> doca ps IMAGEM COMANDO CRIADO STATUS PORTOS NOMES hellomicroservice:dev "tail -f..." 8 min… Para cima 8… 0.0.0.0... dockercompose1524…56534_hellomicroservice_1 couchbase:empresa-6.0.3 "/entryp'¦" 8 min… Para cima 8… 8092-8096... dockercompose1524…56534_couchbase_1 PS C:\JANELAS\sistema32> |
(Reduzi bastante o texto acima para que as informações relevantes coubessem na largura desta postagem do blog).
Etapa 4: Alterações de configuração
Como usei o estoque couchbase:enterprise-6.0.3
Imagem do Docker, ainda preciso abrir a interface do usuário do Couchbase (http://localhost:8091) e configurar o cluster manualmente. Consulte as "próximas etapas" no final para ver algumas opções de automatização.
Há muitos documentação para orientá-lo nesse processoPortanto, não vou repetir isso aqui. Observarei que estou usando as credenciais "Administrador" e "senha". Também usei criou um balde chamado hellomicroservice.
Depois de criar o bucket, a próxima etapa é fazer com que o aplicativo ASP.NET Core se comunique com o banco de dados. Abra o docker-compose.yml e atualize a variável hellomicroservices:
definição para:
1 2 3 4 5 6 7 8 9 10 |
hellomicroservice: imagem: ${REGISTRO DE DOCKER-}hellomicroservice construir: contexto: . arquivo de encaixe: HelloMicroservice/Dockerfile ambiente: Servidores do Couchbase__0: http://couchbase:8091/ # Referência ao nome do serviço "couchbase" na linha 4 depende_de: - couchbase # Referência ao nome do serviço "couchbase" na linha 4 comando: ["./wait-for-it.sh", "http://couchbase:8091"] |
Vamos detalhar cada uma dessas partes:
ambiente:
Isso diz ao docker-compose para criar variáveis de ambiente.Servidores do Couchbase__0
O nome de uma variável de ambiente. A nomenclatura aqui é importante. Isso corresponderá ao appsettings.json posteriormente.http://couchbase:8091/
A URL de que o ASP.NET Core precisará para se conectar ao serviço couchbase. Se você nomeou o serviço com algo diferente de "couchbase", use esse nome aqui também.depende_de
É assim que o docker-compose saberá em que ordem iniciar os serviços.comando
Um comando a ser executado quando o serviço for iniciado.
Neste exemplo, estou usando wait-for-it.sh
O script de inicialização do Couchbase Server, um script que aguardará a disponibilidade do host/porta fornecido. Na imagem padrão do Docker do Couchbase Server, levará alguns segundos para que o Couchbase Server seja realmente iniciado, portanto, esse script aguardará até que isso aconteça para prosseguir.
Por fim, para fazer com que o projeto ASP.NET Core se comunique com o Couchbase, usei o comando Extensão de injeção de dependência do NuGet:
1 |
serviços.AddCouchbase(Configuração.GetSection("Couchbase")); |
A configuração será extraída do arquivo appsettings.json por padrão. NO ENTANTOLembre-se de que uma variável de ambiente de Servidores do Couchbase__0
é definido em docker-compose.yml. O ASP.NET Core examinará as variáveis de ambiente e substituirá as configurações de aplicativos usando esses valores. Portanto, não importa realmente o que valor está em appsettings.json (ou appsettings.Development.json) para "Servers":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Registro": { "LogLevel": { "Padrão": "Depurar", "Sistema": "Informações", "Microsoft": "Informações" } }, "Couchbase" : { "Nome de usuário": "Administrador", "Senha": "senha", "Servidores" : ["http://thiswillbeoverwritten"] } } |
No entanto, o nome de usuário/senha ainda são lidos nas configurações de aplicativos.
Etapa 5: Usando o banco de dados
Por fim, vamos nos certificar de que o aplicativo ASP.NET Core seja capaz de se comunicar com o banco de dados. Eu adicionei um Inserir
e Obter
para o HomeController
Índice
método:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
público IActionResult Índice() { var id = Guia.NovoGuia().ToString(); _bucket.Inserir(novo Documento<dinâmico> { Id = id, Conteúdo = novo { Olá = "microsserviço", foo = Caminho.GetRandomFileName() } }); var doc = _bucket.Obter<dinâmico>(id); retorno Ver(doc); } |
Algumas alterações correspondentes à exibição em Index.cshtml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@modelo Couchbase.IOperationResult<dinâmico> @{ Exibir dados["Título"] = "Página inicial"; } <div classe="text-center"> <h1 classe="display-4">Bem-vindo</h1> <p>Aprender sobre <a href="https://docs.microsoft.com/aspnet/core">construção Web aplicativos com ASP.NET Núcleo</a>.</p> </div> <p>Criado a novo documento:</p> <ul> <li>ID: @Modelo.Id</li> <li>Documento: @Modelo.Valor</li> </ul> |
Agora, temos os fundamentos do ASP.NET Core Microservices instalados. Pressione CTRL+F5 para executar o serviço. Quando o navegador abrir, você verá algo parecido com isto:
Se, em vez disso, você vir uma mensagem de erro, verifique se configurou o Couchbase Server corretamente, se criou um bucket com o nome correto, se usou as credenciais de login corretas em appsettings.json e se o docker-compose.yml corresponde aos exemplos acima.
Próximas etapas
Agora você pode desenvolver seus microsserviços ASP.NET Core. Como desenvolvedor, a imagem do Docker do seu aplicativo ASP.NET Core será sua entrega. Dependendo de onde/como sua organização planeja implantar, as próximas etapas variam muito.
Isso é apenas o começo, mas aqui estão mais algumas coisas que você deve explorar:
Volumes. Feche completamente o Visual Studio. Após alguns segundos, as imagens do Docker desaparecerão (tente docker ps
novamente para verificar isso). Agora, abra o Visual Studio e pressione CTRL+F5 novamente. Como usamos um volume, os dados que você armazenou no Couchbase ainda devem estar lá. Se é isso que você deseja para o desenvolvimento, está tudo certo.
Automação. Se preferir que os dados sejam apagados e regenerados todas as vezes, você precisará criar uma imagem personalizada do Docker. Você também pode dar uma olhada no excelente projeto couchbasefakeitque inclui várias ferramentas, variáveis, scripts, etc., para inicializar o Couchbase Server e preenchê-lo com índices e dados falsos. Você pode ver um exemplo disso em um A ideia que Brant Burnett compartilhou comigo.
Kubernetes. Se você planeja implantar o Couchbase Server (ou mesmo qualquer banco de dados) em contêineres, provavelmente vai querer dar uma olhada no Kubernetes e no Operadores de Kubernetesque facilitam muito o gerenciamento de bancos de dados em clusters do Kubernetes. Muitos fornecedores de bancos de dados criaram operadores Kubernetes, e o Couchbase foi o primeiro fornecedor de NoSQL a lançar um Operador autônomo de Kubernetes.
Agradecimentos especiais
Esta postagem do blog não teria sido possível sem a enorme ajuda da Comunidade Couchbase.
Agradecimentos a Brant Burnett por compartilhar comigo o processo de desenvolvimento de microsserviços de sua empresa.
Agradeço a Calvin Allen por ter trabalhado nesse processo comigo em minha Transmissão de codificação ao vivo na Twitch e para apresentando-me ao wait-for-it.