Övning – Distribuera en N-nivåarkitektur
Kom ihåg vårt scenario om att migrera ett program från en lokal plats till Azure. Hur kan den arkitekturen se ut? Din organisation har ett icke-kritiskt program som är en bra kandidat att testa. Det är ett program som skrivits för att lösa det vanliga problemet med att välja lunch.
Tänk på när du gick ut och åt lunch med vänner eller kollegor senast. Var det enkelt att fatta ett beslut, eller ägnar du mycket tid åt att försöka ta reda på vad alla egentligen menade när de sa "jag gillar allt?" Nu ska vi distribuera ett program som bygger på en arkitektur med tre nivåer som kan hjälpa dig att lösa problemet. Det här programmet gör att du kan komma med lunchförslag och alla kan rösta på det alternativ som de föredrar.
Vi har skapat en mall för programmet som distribuerar varje nivå som Azure-resurser och därefter distribuerar den faktiska koden. Detta är ett ASP.NET Core MVC-program som distribueras på Linux-servrar, men arkitekturformatet kan användas oavsett underliggande OS-plattformar eller SDK.
Här är en övergripande visualisering av vad som distribuerats med den här mallen.
Använda en N-nivåarkitektur
Kör följande kommando för att starta distributionen. Kommandot
az deployment group createstartar en distribution i din resursgrupp i begränsat läge med hjälp av den mallfil och de parametrar som vi anger. Vi anger också en slumpmässig, 32 tecken lång sträng som genereras från kommandothead /dev/urandom | tr -dc A-Za-z0-9 | head -c 32som lösenordsparameter.Distributionen tar cirka 5 minuter att slutföra.
az deployment group create \ --resource-group <rgn>[sandbox resource group name]</rgn> \ --template-uri https://raw.githubusercontent.com/MicrosoftDocs/mslearn-n-tier-architecture/master/Deployment/azuredeploy.json \ --parameters password="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)"
Visa distribuerade resurser och testa programmet
När distributionen är klar testar du programmet. Kör följande kommando, som returnerar appens URL.
az deployment group show \
--output table \
--resource-group <rgn>[sandbox resource group name]</rgn> \
--name azuredeploy \
--query properties.outputs.webSiteUrl
Öppna en webbläsare och besök webbplatsen. Du ser en ruta där du kan lägga till matalternativ. När ett alternativ har lagts till lägger du till en röst när du väljer det.

Tre nivåer av ”Vad blir det till lunch?”
Det här programmet har en avsiktligt minimalistisk komplexitet. Det är ett roligt program men det visar ändå upp en arkitektur med tre nivåer. Mallen skapar två virtuella datorer (VM), en Azure SQL-databas och de resurser som behövs för att stödja dessa resurser, till exempel diskar, nätverkskort och virtuella nätverk. Den distribuerar också koden för att köra programmet på de olika nivåerna. Det virtuella nätverket som vi har distribuerat har två undernät, ett för presentationsnivån och ett för programnivån, vilket ger en säkerhetsgräns för varje nivå.
Vi har också tillämpat taggar i resurserna som en del av distributionen för att reflektera den nivå som resursen stöder (tier:presentation, tier:application, tier:data). Taggar är en metod för att tillämpa metadata på Azure-resurser, och i det här fallet gör de att vi enkelt kan filtrera resurserna för varje nivå.
Vi ska titta närmare på de olika nivåerna. Här är en detaljerad visualisering av de resurser som vi just distribuerade.
Presentationsnivå
Kör följande kommando för att visa en lista över resurserna på presentationsnivån.
az resource list --tag tier=presentation --output table
I den arkitektur med tre nivåer som vi har använt representerar detta presentationsnivån. Koden som ansvarar för webbgränssnittet har distribuerats på den här nivån, den presenterar användargränssnittet och hanterar användarbegäranden direkt. Den här nivån behandlar bara presentationen av webbplatsen för användaren. Den har ingen direkt åtkomst till data och omfattar ingen affärslogik.
Vi har distribuerat en webbserver med namnet demo-web-vm som kör den webbplats vi vill få tillgång till. Servern har ett nätverksgränssnitt, demo-web-vm-nic, med en offentlig IP-adress, demo-web-vm-nic-pip, kopplad till den. Detta är den IP-adress som vi hämtade tidigare. Servern har även en nätverkssäkerhetsgrupp, demo-web-nsg, som endast tillåter inkommande trafik från internet (HTTP-trafik) på port 80. Detta begränsar åtkomsten till endast webbplatsen och förhindrar åtkomst via onödiga portar som kan användas på ett skadligt sätt. Den här nivån kommunicerar med presentationsnivån via HTTP för att slutföra användarens begäran.
Programnivå
Kör följande kommando för att få en lista med resurser på programnivån.
az resource list --tag tier=application --output table
Programnivån har distribuerats på en virtuell dator med namnet demo-biz-vm som kör affärslogiken. Den har även ett nätverksgränssnitt, demo-biz-vm-nic, men detta nätverksgränssnitt har bara en privat IP-adress, vilket inte ger någon mekanism för direkt inkommande anslutning till servern. Den har även en nätverkssäkerhetsgrupp, demo-biz-nsg, som endast tillåter åtkomst från presentationsnivåns undernät.
Den här nivån fungerar som överföringskanal för programmets dataåtkomst. Koden som exponerar API:et som anropas av presentationsnivån distribueras på den här servern. Inga data lagras här, och användarna har ingen direkt åtkomst till den här servern. Den här nivån kommunicerar med datanivån via T-SQL-kommandon för att få åtkomst till data och slutföra användarnas förfrågningar.
Det finns ett enkelt exempel på affärslogik som ingår i programmet på den här nivån. Det finns validering av lunchförslagen på serversidan, där de jämförs med en lista med godkända värden. Om du försöker lägga till något som inte finns på listan accepteras det inte, och ett meddelande returneras med de lunchalternativ som gäller.
Datanivå
Kör följande kommando för att få en lista med resurser på datanivån.
az resource list --tag tier=data --output table
Datanivån är en Azure SQL Database-server, demo-dbserver-abc123 (vi lägger till en slumpmässig sträng till servernamnet för att det ska bli globalt unikt). På den här servern lagras data för programmet i en databas med namnet demo-sqldb. Den här nivån av programmet handlar enbart om lagring av data och tillhandahåller en metod för att komma åt dem, i det här fallet via T-SQL, så körs programmet mot databasen. Vi hanterar ingen affärslogik på den här nivån och presenterar inte heller data för användaren.
På den här nivån exponeras anslutningar på port 1433 via en VNet-tjänstslutpunkt. VNet-tjänstslutpunkter är en mekanism för att ansluta PaaS-tjänster (till exempel Azure SQL Database) till ett undernät och begränsa anslutningen till endast resurserna i det undernätet.
Det här är också ett exempel på hur du använder PaaS-tjänster i stället för virtuella IaaS-datorer (infrastruktur som en tjänst) för att köra en nivå av ett program. N-nivåprogram betraktas ofta som VM-baserade program, men detta är inte ett krav. Med PaaS-tjänster i stället för virtuella datorer kan du sänka kostnaderna, öka säkerheten och minska administrationskraven.
Behöver du hjälp? Se vår felsökningsguide eller ge feedback genom att rapportera ett problem.