Ankstesni straipsniai
Įvadas į Windows Azure – 1 dalis (Pagrindinės sąvokos)
Įvadas į Windows Azure – 2 dalis (Windows Azure Hello World ASP.NET puslapio kūrimas)
Įvadas į Windows Azure – 3 dalis (lokalios objektinės Windows Azure saugyklos konfigūravimas)
Įvadas į Windows Azure – 4 dalis (lokalios BLOB saugyklos panaudojimas)
Įvadas į Windows Azure – 5 dalis (lokalios BLOB saugyklos perkėlimas į Windows Azure)
Įvadas į Windows Azure – 6 dalis (esybių lentelių saugyklos panaudojimas)
PASTABA: šis straipsnis yra identiškas 6 dalyje aprašytam puslapiui, bet vietoje BLOB saugyklos naudojamas virtualus diskas.
Vasarį mėnesį atsinaujinus Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010), tapo prieinamas ir naujas objektinės saugyklos tipas – X-Drive (debesų diskas). Šioje dalyje aš pateiksiu ASP.NET puslapį, kuriame galima pridėti naują failą į diską, atvaizduoti esamus failus, juos parsisiųsti bei ištrinti. Kaip ir 6 dalyje, visos operacijos su Windows Azure yra apvilktos į repozitorijaus (angl. repository) projektavimo šabloną.
X-Drive pagrindai
X-Drive (arba tiesiog debesų diskas (angl. cloud disk)) – tai naujas Windows Azure objektinių saugyklų tipas (šalia eilių, esybių lentelių ir BLOBų). Pagrindinis debesų disko privalumas – jis leidžia dirbti tu BLOB saugyklomis naudojant standartinį .NET System.IO API. Iš techninės pusės jis realizuotas kaip virtualus diskas, patalpintas nurodytoje objektinėje BLOB saugykloje ir susietas su tam tikra Windows Azure disko raide (pav., X:). Naujasis CloudDrive API leidžia ne tik kurti tokius virtualius diskus, bet ir atlikti jiems standartines operacijas Mount (prijungti diską) ir Unmount (atjungti diską).
Kaip žinia, objektinės saugyklos yra globalios, t.y. nepriklauso nuo konkrečios Windows Azure virtualios mašinos. Tai reiškia, kad standartinės operacijos su objektinėmis saugyklomis nėra ypač greitos. Vienintelis paspartinimo būdas – lokalios saugyklos panaudojimas (lokali saugykla yra individuali kiekvienai Windows Azure virtualiai mašinai). CloudDrive moka pasinaudoti lokalia saugykla kaip įrašymo/skaitymo operacijų buferiu (tarpine atmintimi).
Vienas didžiausių X-Drive privalumu – nuo šiol įmanoma pakankamai nesunkiai paimti egzistuojantį virtualų diską (VHD formatu) ir tiesiog jį su visais duomenimis perkelti į debesis.
Paruošiamieji darbai
Prieš pradedant, aš primygtinai rekomenduoju perskaityti ankstesnius straipsnius, tam kad mokėti sukurti Windows Azure ASP.NET puslapį, sukonfigūruoti lokalią objektinę Windows Azure saugyklą bei dirbti su objektine BLOB saugykla.
Už pagrindą aš pasiėmiau 2 dalyje aprašytą „Hello World“ Windows Azure ASP.NET aplikaciją. Kadangi darbui su X-Drive reikalinga BLOB objektinė saugykla, mums reikia nurodyti Windows Azure prisijungimo duomenis. HelloWorldCloud projekte reikia nueiti į nustatymus ir pridėti naują prisijungimo eilutę, kurią aš pavadinau StorageConnectionString:
Atkreipkite dėmesį, kad laikinai mes naudojame ne realius Windows Azure prisijungimo duomenis, bet lokalią saugyklą. Nors tarpinės atminties panaudojimas su debesų diskais nėra būtinas, išsamumo dėlei šiame pavyzdyje aš parodysiu kaip ja pasinaudoti. Tam reikia nueiti į kortelę Local Storage ir pridėti naują lokalią saugyklą (pavadinau DiskCacheLocalStorage):
Kitas svarbus momentas – Web rolės klasės aprašymas. Kadangi Windows Azure BLOB saugykla nepriklauso nuo .NET vykdymo aplinkos (skaitykit nuo Microsoft.WindowsAzure.ServiceRuntime), reikia HelloWorldWeb projekte sukurti Web rolės klasę ir joje nusakyti kaip reaguoti į konfigūracijos failo pakeitimus. WebRole klasė nesiskiria nuo pateiktos 6 dalyje.
Puslapio sukūrimas
Kadangi mes operuojame standartine System.IO vardų sritimi, jokių papildomų klasių apibrėžti nereikia ir galima pereiti prie repozitorijaus interfeiso aprašo su visomis mums reikalingomis operacijomis:
public interface IXDriveFileRepository
{
IEnumerable<FileInfo> List();
byte[] Get(string fileName);
void Insert(string fileName, byte[] file);
void Delete(string fileName);
}
Aptarkime kiekvieno metodo paskirtį:
- metodas List skirtas pateikti diske saugomų failų metaduomenų sąrašą (System.IO.FileInfo)
- metodas Get gauna nurodytą failą
- metodas Insert įrašo failą į diską
- metodas Delete ištrina nurodytą failą iš disko
Nesigilinant į IXDriveFileRepository realizaciją, pateiksiu Web puslapio kodą:
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="XDrive.aspx.cs" Inherits="HelloWorldWeb.XDrive" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Failų sąrašas</title>
</head>
<body>
<form id="form" runat="server">
<h1>Failai</h1>
Pridėti naują
<asp:FileUpload ID="FileUpload" runat="server" />
<asp:Button runat="server" Text="Pridėti" OnClick="UploadFile" />
<asp:ListView ID="Files" runat="server">
<LayoutTemplate>
<ul>
<li id="itemPlaceHolder" runat="server" />
</ul>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:LinkButton runat="server" Text='<%# Eval("Name") %>'
OnCommand="DownloadFile" CommandArgument='<%# Eval("Name") %>' />
<asp:LinkButton ID="Name" runat="server" Text="[x]"
OnCommand="DeleteFile" CommandArgument='<%# Eval("Name") %>' />
</li>
</ItemTemplate>
</asp:ListView>
</form>
</body>
</html>
Kaip matote, puslapyje tėra failo pridėjimo elementas bei sąrašas jau pridėtų failų su galimybe ištrinti. Failų pavadinimas yra atvaizduojamas kaip nuoroda, kad galima būtų jį parsisiųsti paprastu paspaudimu. C# pusė atrodo taip:
public partial class XDrive : Page
{
private readonly IXDriveFileRepository repository =
new XDriveFileRepository(
"drives",
100,
"test.vhd",
"DiskCacheLocalStorage",
"StorageConnectionString");
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ListFiles();
}
}
protected void UploadFile(object sender, EventArgs e)
{
if (FileUpload.HasFile)
{
var fileName = FileUpload.PostedFile.FileName;
var file = FileUpload.FileBytes;
repository.Insert(fileName, file);
ListFiles();
}
}
protected void DownloadFile(object sender, CommandEventArgs e)
{
var fileName = e.CommandArgument.ToString();
var file = repository.Get(fileName);
Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(file);
Response.End();
}
protected void DeleteFile(object sender, CommandEventArgs e)
{
var fileName = e.CommandArgument.ToString();
repository.Delete(fileName);
ListFiles();
}
private void ListFiles()
{
Files.DataSource = repository.List();
Files.DataBind();
}
}
Repozitorijaus dėka, šis ASP.NET puslapis neturi jokio supratimo apie Windows Azure panaudojimą. XDriveFileRepository konstruktorius bus aprašytas vėliau.
XDriveFileRepository įgyvendinimas
Žemiau pateikta XDriveFileRepository realizacija reikalauja nuorodų į tokias bibliotekas:
- Microsoft.WindowsAzure.CloudDrive
- Microsoft.WindowsAzure.ServiceRuntime
- Microsoft.WindowsAzure.StorageClient
- System.Data.Services.Client
Atskirai norėtųsi paminėti XDriveFileRepository konstruktorių: jis priima net penkis argumentus:
- drives – BLOB konteinerio pavadinimas kuriame bus saugoma virtualaus disko informacija
- 100 – debesų disko dydis megabaitais
- test.vhd – virtualaus disko failo pavadinimas
- DiskCacheLocalStorage – lokalios saugyklos, naudojamos kaip disko tarpinė atmintis, pavadinimas iš mūsų konfigūracijos failo
- StorageConnectionString – prisijungimo prie Windows Azure saugyklos eilutės pavadinimas iš mūsų konfigūracijos failo
Kitus paaiškinimus parašiau kaip komentarus:
public class XDriveFileRepository : IXDriveFileRepository, IDisposable
{
private readonly CloudDrive drive;
private readonly string driveLetter;
public XDriveFileRepository(string container,
int diskSize,
string diskFileName,
string diskCacheStorageName,
string connectionString)
{
// inicializuojame disko tarpinę atmintį spartesnei prieigai prie duomenų
var localDiskCache = RoleEnvironment.GetLocalResource(diskCacheStorageName);
CloudDrive.InitializeCache(localDiskCache.RootPath, localDiskCache.MaximumSizeInMegabytes);
// aprašome mūsų BLOB klientą
var storageAccount = CloudStorageAccount.FromConfigurationSetting(connectionString);
var blobClient = storageAccount.CreateCloudBlobClient();
// pagal nurodytą vardą gauname egzistuojantį konteinerį arba sukuriame naują
var blobContainer = blobClient.GetContainerReference(container);
blobContainer.CreateIfNotExist();
// sukuriame naują diską
var driveUri = blobClient.GetPageBlobReference(diskFileName).Uri.ToString();
drive = storageAccount.CreateCloudDrive(driveUri);
try
{
drive.Create(diskSize);
}
catch (CloudDriveException e)
{
// klaida įvyksta net kai viskas gerai, bet diskas jau egzistuoja
}
driveLetter = drive.Mount(localDiskCache.MaximumSizeInMegabytes, DriveMountOptions.None);
}
public void Dispose()
{
drive.Unmount();
}
public IEnumerable<FileInfo> List()
{
var dirInfo = new DirectoryInfo(driveLetter);
return dirInfo.GetFiles();
}
public byte[] Get(string fileName)
{
var path = GetFullPath(fileName);
return File.ReadAllBytes(path);
}
public void Insert(string fileName, byte[] file)
{
var path = GetFullPath(fileName);
File.WriteAllBytes(path, file);
}
public void Delete(string fileName)
{
var path = GetFullPath(fileName);
File.Delete(path);
}
private string GetFullPath(string fileName)
{
return Path.Combine(driveLetter, fileName);
}
}
BLOB saugyklos sukūrimas
Iki šiol BLOB saugyklos testavimui mes naudojome taip vadinamą „Development Storage“. Norėdami išpublikuoti mūsų Windows Azure aplikaciją į debesis, pirma reikia sukurti saugyklą Windows Azure portale, tai detaliai aprašyta 5 dalyje.
Kitoje dalyje…
Nors aš žadėjau, kad jau šioje dalyje mes išnagrinėsime eiles (angl. queues), nusprendžiau pirma aprašyti X-Drive naujovę, nes ji glaudžiai susijusi su BLOB objektine saugykla. Eiles aptarsime kitoje dalyje…
Rodyk draugams
Naujausi komentarai