Come configurare il sito web "sito multiplo" con domini?

4

Sfondo:

Gestisco una piattaforma fronte / retro con piccole attività commerciali da un lato e utenti su un altro. Come parte del nostro prodotto, ho intenzione di presentare "siti web" come parte del prodotto.

L'idea è: un'azienda locale ha un dominio e poi voglio "trasformarlo in un sito web" basato su uno dei nostri modelli.

La mia configurazione:

Oggi abbiamo un'applicazione .NET (ASP.NET MVC) in esecuzione su un'app Web di Azure. Abbiamo anche una buona API che viene eseguita.

Questo è basato su un database SQL standard (ospitato in Azure).

La mia domanda:

Immagina di avere 100 clienti (siti Web a basso traffico) e di 100 domini personalizzati (.com).

Vogliamo dare a questi 100 clienti "lo stesso" sito web predefinito ma con i loro testi. Questi testi provengono dalla nostra API.

Come vorresti architettare e configurare questa configurazione? Vuoi far girare 100 app web? Eseguire pool più grandi nella stessa app Web? Come dovresti mappare il dominio all'app Web corretta?

La mia soluzione proposta

Essendo un po 'incapace sto pensando a questo approccio:

Crea una nuova applicazione .NET in esecuzione come app web a istanza singola. Quindi vorrei puntare il loro DNS (A-record) verso la mia applicazione, e poi in qualche modo guardare il dominio corrente ( esempio ). Sulla base del dominio, otterrei i dati basati sull'API.

Quindi probabilmente creerò una nuova app Web quando questo inizierà a riscontrare problemi di prestazioni.

La mia soluzione ha senso? Sono pazzo? Questa rottura?

(Le risposte con link ad articoli o anche a un libro sono ovviamente un'ottima risposta!).

    
posta Lars Holdgaard 25.04.2017 - 01:03
fonte

1 risposta

1

Innanzitutto, indipendentemente dal fatto che il fornitore del sito Web del cliente stia eseguendo o meno lo stesso server / app o uno specifico, i dettagli dell'implementazione delle prestazioni e l'architettura software sottostante pertinente dovrebbero facilmente supportare entrambi. Una buona architettura software supporta un'ampia gamma di architettura di sistema .

Una buona architettura software è determinata dal problema che si sta tentando di risolvere e una buona architettura del sistema è determinata dal modo in cui tale soluzione e l'hardware su cui viene eseguita vengono utilizzate nel mondo reale. Per preoccuparsi se dovrebbe essere sullo stesso server, o server diversi, senza statistiche di utilizzo, è imo, ottimizzazione prematura.

Iniziamo modellando il tuo dominio problematico per questa particolare caratteristica, questa deve essere la sua propria libreria di classi indipendente, non nella tua webapp:

public class ClientWebSite
{
    string Url;
    string CustomerId;
    string TextBlurb1;
    string TextBlurb2;
    //?maybe a reference to your already existing customer object?
    //ect
}

E anche nella sua libreria di classi

public ClientWebSiteRepository
{
      //NOTE: Just becuase we are using natural/string keys in our classes, does not mean we should not use surrogate keys in our DB!
      ClientWebSite GetWebsiteByUrl(string url);
      ClientWebSite GetWebsiteByClientId(string clientId);
      void SaveSite(ClientWebSite site);
}

Con questa struttura, possiamo facilmente utilizzare chiunque di queste tre architetture di sistema semplicemente avendo la nostra app client che fa riferimento ai nostri progetti DAL e BLL:

  1. Stessa applicazione
  2. Applicazione diversa, stesso server
  3. Applicazione diversa, server diverso

Non ti lagnerei per aver utilizzato nessuna di queste architetture di sistema, ma penso che la scommessa più sicura nella tua situazione sia iniziare con # 2, quindi passare a 3 # solo quando l'utilizzo lo richiede. Ma ancora una volta, le tue statistiche di utilizzo sono l'unica cosa che può determinare questo di sicuro.

L'applicazione client di fronte, con tutti i record DNS dei client che puntano ad essa sarebbe simile a questa:

class ClientWebSiteController
{
     Action Index()
     {
         var model = new ClientWebsiteRequestModel():
         model.url = request.URL;
         return Index(model);
     }

     Action Index(ClientWebsiteRequestModel model)
     {
          var viewModel = new ClientWebsiteViewModel();
          var website = siteRepo.GetClientWebsiteByUrl(model.url);
          viewModel.blurb1 = website.blurb1;
          viewModel.companyName = customerRepo.get(website.CustomerId).CompanyName;
          return View("ClientWebsite", viewModel);              
     }
}
    
risposta data 26.04.2017 - 20:00
fonte