Aplicações MultiTenant no ASP.NET Core 2.0 utilizando o SaaSKit

Nesse artigo vamos ver o que é uma Arquitetura MultiTenant e como aplicar no .Net Core, lembrando que a arquitetura MultiTenant não é exclusividade do .Net

Multi-Tenant ou também chamado de Multitenancy, significa dizer que uma única aplicação Web pode responder a diversos clientes de uma forma que aparenta que eles estão falando com diferentes aplicações, ou seja, diversos clientes acessando o mesmo host, porém isso é transparente para o usuário que esta usando o sistema.

Os diferentes interfaces dos aplicativo são chamados de Tenants (inquilinos), porque conceitualmente eles vivem no mesmo espaço, no caso a aplicação WEB e podem ser endereçados individualmente. Isso significa dizer que todas minhas aplicações estarão hospedadas em único e no mesmo servidor, mas cada um terá seu endereço, no caso sua url.

Ou seja, TENANT -> CLIENTES

Fazendo uma analogia, por exemplo uma cidade em que temos as casas, cada casa tem seu endereço e não temos acesso aos pertences da casa do vizinho, porém compartilhamos recursos da cidade como ruas, parques e calçadas.

À esquerda temos um exemplo de um único cliente, cada um com seu serviço e seu banco dados. Ao meio, temos diversos clientes acessando um único serviço, exemplificando a arquitetura MultiTenant. À direita, mais um exemplo de MultiTenant, nessa figura, temos 3 clientes acessando um único serviço e um único banco de dados.

A ideia principal de uma aplicação MultiTenant é garantir o isolamento de implementação, de dados e de customização.

  • Isolamento dos dados.
  • Ser flexível.
  • Solução escalável.

Vantagens do MultiTenant no SaaS

  • Reduz os custos de investimento a longo prazo.
  • Atualizações simples.
  • Fácil customização.
  • Maximização do uso de recursos.
  • Infinitos Clientes.
  • Dependendo da implementação da arquitetura, uma manutenção serve para todos os clientes.
  • Escalabilidade

Desvantagens do MultiTenant no SaaS

  • Mais Complexo.
  • Menos Flexível em alguns casos.
  • Se o servidor cair, todos os clientes cairão.

Como começar?

Instalar o SaasKit.Multitenancy via nuget:

  • Install-Package SaasKit.Multitenancy -Version 1.1.4 (ou outra versão, avaliar no link a última versão do pacote)

Criar um arquivo AppTenant.cs

Essa classe representa os nossos tenants, onde a propriedade Name é o nome do tenant (ex: abc) e o HostNames são os hosts (ex: abc.com, xyz.com)

Após essa etapa, criar o arquivo AppTenantResolver.cs

Das linhas 11 a 21, crio uma lista com meus Tenants que serão utilizados, essa lista poderia vir de um banco de dados. Essa classe implementa a interface ITenantResolver que é do pacote SaaSKit e portanto precisamos implementar o método ResolveAsync que fará a captação do host. Nas linhas 27 e 28 captamos pelo host qual é meu Tenant. Retornando assim o cliente que fez a chamada do serviço.

Feito isso, precisamos alterar nossa Program.cs para ficar dessa maneira

Percebam a linha 12, estou utilizando o Kestrel e na linha 14 adiciono minhas urls que serão aceitas pela aplicação.

Agora temos que alterar nosso arquivo de Startup.cs para ficar da seguinte maneira

Percebam a linha 17 onde adiciono via AddMultitenancy os objetos que representam os tenants (AppTenant) e o objeto Resolver que implementa a interface do SaaSKit (AppTenantResolver). E a linha 33 que adiciono no pipeline a utilização do MultiTenant

Agora precisamo alterar nossa Controller para receber o tenant via GET, no caso do exemplo, fiz a alteração na HomeController.cs

Percebam a linha 9 que adiciono uma propriedade privada AppTenant e no parâmetro do construtor eu recebo via injeção de dependência o meu Tenant, com isso podemos buscar as configurações específicas do Tenant no banco de dados por exemplo.

Agora devemos alterar nossa View, para o exemplo alterei no _Layout.cshtml, mas vocês podem alterar como acharem melhor

Percebam a linha 1 que eu injeto o Tenant que veio da minha Controller. Das linhas 21 a 37, muda a cor de fundo conforme meu Tenant, se Tenant 1, cor de fundo verde claro se não cor de fundo azul claro

E por fim, devemos alterar o arquivo launchSettings.json que esta na pasta Properties

Finalmente Adiciono um configuração para iniciar o projeto da linhas 18 a 24

Iniciado a aplicação, agora esta escutando os dois hosts configurados conforme figura abaixo:

Então, acessando o localhost:6001 temos o Tenant 1 com fundo verde

E acessando o localhost:6002 temos o Tenant 2 com fundo azul

O código completo esta no meu GitHub, para quem quiser conhecer mais.

Segue Slides da minha apresentação no Visual Studio Summit 2018 sobre o tema.

Valeu e até a próxima