Freies eBook Building Cloud Apps with Microsoft Azure

Von Toni+Pohl+(Gastblogger) Autor Feed 23. July 2014 22:29
Ganz frisch gibt es ein neues kostenfreies eBook für Developer im Microsoft Press Blog downzuladen: Building Cloud Apps with Microsoft Azure von Scott Guthrie, Mark Simms, Tom Dykstra, Rick Anderson und Mike Wasson. [More]

RaspberryPi, Cloud and NodeJS Teil 5 – Linuxwochen

Von ap Autor Feed 27. June 2014 12:12
Im letzten Teil haben wir NodeJS Anwendungen auf Cloud PAAS über GIT deployed und gesehen, wie die Deployments mit Visual Studio Monaco online geändert werden können. In diesem Teil sehen wir uns an wie wir: Azure Queues mit dem Azure Service Bus anlegen Mit NodeJS Azure Queue Messages schreiben und empfangen Nachrichten automatisiert aus einer Azure Queue bearbeiten mit NodeJS WebJob Azure Queues mit Azure Service Bus erstellen Zuerst müssen wir einen neuen Azure Service Bus Namespace erstellen. Unter Linux machen wir das mit den folgenden Statements: $ azure sb namespace create lwtestsb "West Europe" Mit “namespace show” können wir uns die Service Endpunkte anzeigen lassen: $ azure sb namespace show lwtestsb In unserem Fall erhalten wir hier folgende Endpunkte für Access Control und Servicebus: acsManagementEndpoint: https://lwtestsb-sb.accesscontrol.windows.net/ data: serviceBusEndpoint: https://lwtestsb.servicebus.windows.net/ Im Webbrowser öffnen wir die Verwaltungsseite für die Service Bus Dienste. Hierzu mit dem Microsoft Konto anmelden und dann den entsprechenden Namespace (in unserem Fall “lwtestsb”) auswählen und auf die Schaltfläche “Connection Information” am unteren Rand klicken. Dort kopieren wir dann den “Default Key” mit dem wir uns später am Service Bus authentifizieren. NodeJS Azure Queue Messages schreiben und empfangen Schreiben wir nun einen einfachen NodeJS Server, und weil ich das lieber mit Visual Studio statt mit nano mache verwende ich hier die Node-Tools für Visual Studio. Wer mehr über die NodeJS-Tools für Visual Studio wissen möchte kann sich, das Node-Tools-Video auf You-Tube ansehen. Nach der Installation einfach Visual Studio 2013 starten und eine neue “Blank Windows Azure Node.js” App anlegen. Diese befindet sich unter “Other Languages/Javascript/Blank Windows Azure Node.js”. Im Projekt das Kontextmenü auf npm im Solution Explorer öffnen und “Manage npm Modules…” auswählen. Der npm Package Manager lädt daraufhin alle verfügbaren Packages (dauert etwas). Nach “azure” suchen und das Azure-Paket installieren.   Alternativ kann man die NugGet Package Manager Console in Visual Studio öffnen (Im Menü: TOOLS/NuGet Package Manager/Package Manager Console), in das Projektverzeichnis wechseln und dann das Azure Paket mit folgendem Statement installieren: PM> npm install azure <enter> Im zweiten Fall empfiehlt es sich dann auch noch die Datei package.json zu aktualisieren: 1: "dependencies": { 2: "azure": "~0.9.10" 3: } In unserer ersten Version möchten wir, dass unser NodeJS Server anhand eines URL-Parameters entweder eine Message in den Azure Servicebus sendet wird, oder eine Message aus dem Servicebus liest und ausgibt: SEND ==> http://localhost:1337/?action=send&data=Data1 RECEIVE ==> http://localhost:1337/?action=receive Zunächst laden wir die erforderlichen Module und erstellen eine Variable für die Azurebus Service Komponente. Hier müssen wir auch den Schlüssel angeben, den wir zuvor aus dem Azure Portal kopiert haben (siehe oben). var http = require('http'); var azure = require('azure');         // Import azure nodejs module   /// Create Azure Bus Service var retryOperations = new azure.ExponentialRetryPolicyFilter(); var serviceBusService = azure.createServiceBusService("lwtestsb", "<Your default access key>").withFilter(retryOperations); .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Im nächsten Schritt erstellen wir eine neue Queue, die wir “myqueue” nennen. /// Create my Demo Queue serviceBusService.createQueueIfNotExists('myqueue', function (error) { if (!error) { // Queue exists } }); Mit den Funktionen sendQueueMessage und receiveQueueMessage der Azurebus Service Komponente können neue Nachrichten in die Queue geschrieben werden, oder bestehende Nachrichten aus der Queue gelesen werden. Im Falle von receiveQueueMessage wird die Nachricht zuerst gelesen und dann für einen kurzen Zeitraum gesperrt (locked). Sobald die Nachricht abgearbeitet wurde, kann sie mit der Funktion deleteMessage gelöscht werden. Damit wird sichergestellt, dass beispielsweise bei einem Fehler, die Nachricht nicht verloren geht und von einem anderen Dienst später wieder gelesen werden kann. Die Nachricht selber besteht immer aus einem Body und benutzerdefinierten Eigenschaften: message = { body: messageText, customProperties: { testproperty: 'TestValue' } }; .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Wir schreiben zwei Hilfsmethoden SendMessage und ReceiveMessage: /// Helper to send a message function SendMessage(serviceBusService, messageText, res, callback) { var message = { body: messageText, customProperties: { testproperty: 'TestValue' } }; res.write('\n Sending message ' + messageText + ' ...'); serviceBusService.sendQueueMessage('myqueue', message, function (error) { if (!error) res.write('successfully! \n'); else res.write('failed! \n'); callback(); }); }   /// Helper to receive a message function ReceiveMessage(serviceBusService, res, callback) { serviceBusService.receiveQueueMessage('myqueue', { isPeekLock: true }, function (error, lockedMessage) { if (!error) { // Message received and locked serviceBusService.deleteMessage(lockedMessage, function (deleteError) { if (!deleteError) { res.write('Receiving: ' + lockedMessage.body); // Message deleted } callback(); }); } }); } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Zu guter Letzt implementieren wir unseren Server, der abhängig von den übergebenen URL-Parametern eine Nachricht in die Queue schickt bzw. eine Nachricht ausliest und diese ausgibt. http.createServer(function (req, res) {   res.writeHead(200, { 'Content-Type': 'text/plain' });   var uri = req.url; var action = require('url').parse(uri, true).query["action"]; // send, receive if (action === undefined) { /// Write out a short usage res.write(' Create a message with /?action=send&data=Data1  \n'); res.write(' Receive a message with /?action=receive  \n'); res.end('\n === END OF REQUEST ===\n'); } else { if (action === 'send') { /// Send data to the queue var data = require('url').parse(uri, true).query["data"]; SendMessage(serviceBusService, data, res, function () { res.end('\n === END OF REQUEST ===\n'); });   } else if (action === 'receive') { /// Read data from queue var data = ReceiveMessage(serviceBusService, res, function () { res.end('\n === END OF REQUEST ===\n'); }); } else res.end('\n === END OF REQUEST ===\n'); } }).listen(port); Mit F5 kann unsere NodeJS Anwendung gestartet werden. Im Browser können dann die entsprechenden Parameter mitgegeben werden und Nachrichten in die Queue geschrieben bzw. aus der Queue ausgelesen werden. Nachrichten automatisiert aus einer Azure Queue bearbeiten mit NodeJS WebJob Azure WebJobs sind PAAS (Platform as a Service). Wie auch bei Azure Websites muss man sich hier keine Gedanken über die darunterliegende virtuelle Maschine machen. Azure WebJobs eigenen sich für viele Aufgaben, die periodisch durchgeführt werden müssen. Zusätzlich kann man damit auch Queues oder Storages auf Nachrichten/neue Blobs überwachen und cpu-lastige Aufgaben sind im Hintergrund abwickeln. Scott Hanselmann gibt auf seinem Blog einen guten Überblick über Azure WebJobs. Um Azure Webjobs nutzen zu können, legt man zunächst eine Azure Website an. Darunter findet sich dann der Dienst (Azure WebJobs). Bevor wir jedoch einen Azure WebJob anlegen müssen wir diesen noch implementieren. In unserem Fall soll unser WebJob wieder auf NodeJS basieren. Andere unterstützte Dateitypen von Azure Webjobssind zum Beispiel: Powershell, Exe, CMD, BAT, Python,… Dazu schreiben wir eine einfache NodeJS Anwendung, die unsere Queue ausliest und die Inhalte im Log mitprotokolliert. Hierzu verwende ich wieder Visual Studio. Wir legen eine “Blank NodeJS Console Application” an. Jede Sekunde soll überprüft werden, ob sich neue Nachrichten in der Queue befinden. Wie schon zuvor müssen wir mit NPM die Azure Komponente hinzufügen (siehe oben). Danach implementieren wir app.js: var azure = require('azure');  // Import azure nodejs module npm install azure var retryOperations = new azure.ExponentialRetryPolicyFilter(); var serviceBusService = azure.createServiceBusService("lwtestsb", "<Your default acccesskey>").withFilter(retryOperations); function receive(serviceBusService) {     serviceBusService.receiveQueueMessage('myqueue', { isPeekLock: true }, function (error, lockedMessage) {         if (!error) {             // Message received and locked             serviceBusService.deleteMessage(lockedMessage, function (deleteError) {                 if (!deleteError) {                     console.log('\n Receiving: ' + lockedMessage.body);                     // Message deleted                 }                 setTimeout(receive(serviceBusService), 1000);             });         }         else {             console.log("No message");             setTimeout(receive(serviceBusService), 1000);         }     }     ); }   /// Create myQueue and start receiving serviceBusService.createQueueIfNotExists('myqueue', function (error) {     if (!error) {         console.log("Queue is there");     }     else console.log("Queue was created");     setTimeout(receive(serviceBusService), 1000); }); .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Wir erstellen eine neue ZIP-Datei “linwjdemo.zip” welche app.js und den Folder “node_modules” (Azure Komponente) enthält. Bevor wir jedoch die ZIP-Datei hochladen können müssen wir einen neuen WebJob im Azure Management Portal mit “Add a job…” anlegen. Danach wählen wir die ZIP-Datei aus und bei “How to run” geben wir “Run Continously” an. Es ist auch möglich Jobs manuell oder periodisch zu starten. Kurz danach sehen wir unseren Dienst laufen und können auf die LOG-Datei zugreifen: In der Logdatei sehen wir unsere Console-Ausgaben. In diesem Fall sind keine Nachrichten in der Queue enthalten, daher erhalten wir hier regelmäßig die Einträge: “No message”. .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Viel Spaß beim Herumprobieren Andreas Pollak Product Marketing Manager Visual Studio (Entwicklungs- und Testwerkzeuge) Leader im Magic Quadrant für ALM

Cloud Computing: Top 10 Windows Azure Bücher

Von J%c3%bcrgen+Mayrb%c3%a4url+ Autor Feed 12. July 2011 15:30
Auf der Suche nach guten Büchern über Windows Azure für die bevorstehenden, langen Stunden am Strand während des Urlaubs? Mein persönlicher Favorit ist “Programming Windows Azure” aus dem O’Reilly Verlag. Eine Liste der Top 10 Windows Azure Bücher wurde von MicrosoftFeed soeben veröffentlicht. Daraus sollte doch jeder etwas nach seinem Geschmack und Interesse finden können. Für weitere Buchempfehlungen zum Thema Windows Azure sind wir auch immer sehr dankbar.

VPN in die Wolke - Azure Connect (3)– Azure Role Endpunkte hinzufügen

Von mk Autor Feed 10. January 2011 16:40
Im dritten Teil geht es um die Anbindung von Azure Roles an das Azure Connect VPN. [More]

VPN in die Wolke - Azure Connect (2)– Lokale Endpunkte hinzufügen

Von mk Autor Feed 10. January 2011 14:47
Wie kann man nun Azure Connect umsetzen? Im zweiten Teil der Serie erfahren Sie, wie Sie ihre lokalen Rechner in das Connect VPN hinzufügen können. [More]

VPN in die Wolke - Azure Connect (1)- Theorie

Von mk Autor Feed 6. January 2011 19:27
In den meisten Projekten gibt es Teile, die NICHT in Windows Azure migriert werden können oder wollen. Beispiele dafür sind:
Wie können Sie diese lokalen Computer mit Windows Azure verbinden, ohne ihnen öffentliche IP Adressen z.B. in einer DMZ zu geben?

Deshalb gibt es ein neues Service auf der Azure Plattform, das eine IPSec basierte Verbindung zwischen einem Rechner innerhalb ihres Firmennetzwerkes und AZURE herstellt – das Ganze auf OSI-Schicht 3 basierend – also transparent für ihre Software. [More]

Single-Sign on mit Facebook, Live ID, Google ID,... für die eigene Webseite mit Azure Access Control Service

Von mk Autor Feed 29. December 2010 01:45
Eigene Loginsysteme sind seit längerem schon zweite Wahl bei vielen Consumer-Webseiten. Der Grund: Die BesucherInnen wollen über Single-Sign on mit bestehenden Logindaten einsteigen, anstatt schon wieder eigene Username/Passwort Kombinationen erfinden und merken zu müssen.

In der Praxis ist diese häufige Anforderung jedoch nicht immer so leicht umsetzbar wie gedacht! Abhilfe schafft da nun das Windows Azure App Fabric Access Control Service (ACS). [More]

Cloud Computing: Azure Storage im Vergleich

Von mk Autor Feed 27. October 2010 12:02
Unser Azure MVP Rainer Stropek hat auf seinem Blog ein interessantes Tutorial veröffentlicht, in dem er  die unterschiedlichen STORAGE Mechanismen von Windows Azure vergleicht: Queues SQL Azure Blob Storage Table Storage Was sind die Vorteil und Nachteile der jeweiligen Technologien? Rainer erklärt es in Video und Blog Form. Text & Sample Video   knom

Cloud Computing Tutorial #17 – Abschluss der Serie

Von Mario+Meir-Huber Autor Feed 20. July 2010 22:34
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ Dies ist das letzte Post der Serie “Cloud Computing”. Dies bedeutet jedoch nicht, das keine Post zu diesem Thema mehr erscheinen werden. Weitere Posts sind jedoch nicht mehr aufbauend. Ich werde mich verstärkt um das Thema Cloud Computing widmen. Abschließend möchte ich noch mit einem häufig vorkommenden Vorurteil aufräumen. In vielen Gesprächen wurde festgehalten, das die Cloud primär ein Einsparungspotential mit sich bringt. Daher wirkt sich Cloud Computing stark auf die Finanzen aus. Dies ist jedoch nur ein kleiner Vorteil, welcher durch die Cloud entsteht. Vielmehr deckt die Cloud viele Bereiche ab. Wollen wir mal mit einem zentralem Bereich in Unternehmen beginnen: der Strategie. Hier hat die Cloud auch sehr viel gutes zu bieten. Viele Unternehmen haben große IT-Abteilungen. Damit müssen sich die Unternehmen Kompetenz in einem Bereich aufbauen, welcher oft nichts mit deren Kerngeschäft zu tun hat. Mal ehrlich, was will ein Pharmaunternehmen mit einer spezialisierten Dokumentenmanagement-IT? Durch Outsourcing kann sich das Unternehmen verstärkt auf deren Kernbereich konzentrieren. Cloud Computing bietet auch eine wesentlich höhere Flexibilität – wenn ein kleines Unternehmen in der Touristikbranche stark skaliert, so hinkt die IT eventuell oft nach. Server können nicht rechtzeitig beschafft und in stand gesetzt werden, Personal ist oft kaum vorhanden, … Über dies hinaus transferiert das Unternehmen auch das Risiko. Über so genannte Service Level Agreements wird vereinbart, was der Cloud-Anbieter zu leisten hat. Wird dies nicht eingehalten, so gibt es in vielen Fällen Geld zurück (hierfür wird keine Gewähr seitens der Verfasser gegeben). Auch für Unternehmen, welche Rechenzentren und Server erbauen bzw. Verkaufen haben viele Vorteile. Die Bauweise der Rechenzentren wird standardisiert und somit kostengünstiger. Ein weiterer Vorteil besteht in der Leistung des Anbieters. Zum einem sind die Leistungen, wie bereits vorher erwähnt, klar durch SLAs (Service Level Agreements) definiert. Ein weiterer Vorteil ist, das das anbietende Unternehmen eine hohe Kompetenz in diesem Bereich aufbauen kann – eine Kompetenz, welche bei on-premise nur teilweise erreicht werden kann. Wird mehr Leistung im Unternehmen benötigt, kann diese schnell und einfach abgerufen werden. Dies ist bei on-premise Lösungen nur sehr schwer bist gar nicht lösbar. Auch hinsichtlich der Personalengpässe ergeben sich Vorteile für Unternehmen, welche auf Cloud Computing Lösungen setzen. Die Personalprobleme, welche in der IT vorherrschen, können mittelfristig gelöst werden. Durch Cloud Computing wird deutlich weniger Personal in IT-Fachabteilungen benötigt. Das Personal wird bei Dienstleistungsunternehmen sitzen, selten jedoch im Unternehmen. Hier noch einmal die Zusammenfassung der letzten Artikel: Titel Link Cloud Computing Begriffe http://www.codefest.at/post/2009/12/09/1-Cloud-Computing-IaaS-PaaS-SaaS-Co-Begriffe-verstehen.aspx Überblick über die Microsoft Cloud Plattform http://www.codefest.at/post/2010/01/08/2-Die-Microsoft-Cloud-Plattform-Ein-Uberblick.aspx Vorteile von Cloud Computing http://www.codefest.at/post/2010/01/08/3-Warum-Cloud-Computing-Was-bringts-(Teil-1).aspx Vorteile von Cloud Computing #2 http://www.codefest.at/post/2010/01/08/4-Warum-Cloud-Computing-Was-bringts-(Teil-2).aspx Vorbereitung und Testen der Entwicklermaschine für Windows Azure http://www.codefest.at/post/2010/01/09/5-Vorbereitung-und-Testen-der-Entwicklermaschine-fur-Windows-Azure.aspx Überblick über die Windows Azure Plattform http://www.codefest.at/post/2010/01/11/6-e28093-Die-Windows-Azure-Services-Plattform-im-Uberblick.aspx Überblick über SQL Azure http://www.codefest.at/post/2010/01/15/7-e28093-SQL-Azure-im-Uberblick.aspx Was ist Microsoft PinPoint? http://www.codefest.at/post/2010/01/21/Cloud-Computing-Tutorial-8-e28093-Was-ist-Microsoft-PinPoint.aspx Microsoft Codename “Dallas” http://www.codefest.at/post/2010/01/31/Cloud-Computing-Tutorial-9-e28093-Microsoft-Codename-e2809cDallase2809d.aspx Nachlese MSDN Briefing http://www.codefest.at/post/2010/02/10/Cloud-Computing-Tutorial-10-e28093-MSDN-Briefing-vom-2612010.aspx Windows Azure Storage #1 http://www.codefest.at/post/2010/02/11/Cloud-Computing-Tutorial-11-e28093-Windows-Azure-Storage-Teil-1.aspx Windows Azure SDK Tools http://www.codefest.at/post/2010/02/17/Cloud-Computing-Tutorial-12-e28093-Grundlegendes-zu-den-SDK-Tools.aspx Windows Azure Storage #2 http://www.codefest.at/post/2010/02/25/Cloud-Computing-Tutorial-11-e28093-Windows-Azure-Storage-Teil-2.aspx Windows Azure Storage #3 http://www.codefest.at/post/2010/02/26/Cloud-Computing-Tutorial-14-e28093-Windows-Azure-Storage-Teil-3.aspx Windows Azure Storage #4 http://www.codefest.at/post/2010/03/22/Cloud-Computing-Tutorial-15-e28093-Windows-Azure-Storage-Teil-4.aspx Was kostet Cloud Computing http://www.codefest.at/post/2010/05/18/Cloud-Computing-Tutorial-16-e28093-Was-kostet-es.aspx Im diesem Sinne, Viel Spass mit SaaS, PaaS und IaaS,   Mario Meir-Huber Web: www.codeforce.at Twitter: www.twitter.com/mario_mh

Cloud Computing Tutorial #16 – Was kostet es?

Von Mario+Meir-Huber Autor Feed 18. May 2010 20:57
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ Bis jetzt haben wir uns primär auf die technischen Seiten des Cloud Computing beschränkt. Wir haben in 15 Beiträgen über die Hintergründe, APIs und Architekturen für die Cloud gesprochen. Nun wollen wir uns einmal überlegen, was die wirtschaftlichen Hintergründe für Cloud Computing sind. Hier stellt sich vor allem die Frage, wann Cloud Computing Sinn macht und wann man eher auf traditionelle Angebote setzen soll. Die Frage ist hierbei jedoch, welche Kosten in der Wolke nun tatsächlich anfallen. Um Kosten auszurechnen, muss man zuerst zwischen einigen verschiedenen Anwendungsszenarien unterscheiden. Cloud Plattformen können einige verschiedene Auslastungen haben. Dies wäre zum einem die Auslastung für ein gewisses Intervall. Als Beispiel kann man eine Seite für ein Event nennen. Hierbei kommt die Auslastung auf dessen Höhepunkt kurz vor dem Event. Nach dem Event nimmt diese wieder ab oder ist überhaupt nicht mehr vorhanden. Je nach Event kann die Auslastung 2 Monate vor dem eigentlichen Event starten. Ferner kann diese Auslastung auch nur auf wenige Tage begrenzt sein. Dies kann bei komplexen Berechnungen der Fall sein. Hierbei spricht man von einer zeitlich begrenzten Auslastung über das Jahr weg. Des weiteren können Anwendungen so genannte Auslastungsspitzen haben. Diese wiederum können in zwei verschiedenen Bereichen auftreten. Diese sind entweder vorhersehbar oder unvorhersehbar. Vorhersehbare Auslastungen könnten beispielsweise stärkere Zugriffe auf ein Unternehmensinternes Portal sein. Diese könnten während den Hauptarbeitszeiten auftreten. Beispielsweise zwischen 8 und 17h. Schwieriger wird es nun jedoch bei unvorhersehbaren Zugriffen. Hierbei kann tagelang kaum ein Zugriff erfolgen, dann jedoch sehr häufige Zugriffe. Dies kann im Prinzip bei allen Plattformen auftreten. Der Nachteil bei Belastungsspitzen ist, das man für diese vorbereitet sein muss. Damit man auf solche Belastungen reagieren kann, muss ausreichend Serverkapazität vorhanden sein. Dies kostet natürlich einiges. Eine weitere Auslastungsform ist die ein stetiges Wachstum. Hierbei kann eine Plattform entweder Linear oder auch exponentiell wachsen. Dies ist beispielsweise bei Plattformen wie Facebook oder Twitter der Fall. Die Popularität dieser Dienste ist schier unmöglich gewachsen. Besonders Facebook hat sich zu Beginn sehr schwer getan, Geld für den Ausbau der Infrastrukturen aufzutreiben. Server-Hardware ist sehr teuer und muss natürlich auch irgendwie finanziert werden. Durch Cloud Computing hat man es sehr einfach, zu skalieren. Teure Serverhardware ist nicht notwendig. Twitter, welches Beispielsweise in der Cloud läuft, hat es hier sehr einfach, verglichen mit Facebook. Abhängig davon kann man nun entscheiden, ob man “Cloud-ready” ist. In den nächsten Posts werden wir uns die Kosten der Plattform Windows Azure mal wesentlich genauer ansehen, damit es klar wird wie man diese auch korrekt abschätzt. Ferner werden die Kosten mit traditionellen Plattformen verglichen. Mario Meir-Huber Web: www.meirhuber.de Twitter: www.twitter.com/mario_mh

Cloud Computing Tutorial - Vorbereitung und Testen der Entwicklermaschine für Windows Azure (Aktualisiert)

Von ms Autor Feed 23. April 2010 12:58
In den ersten Teilen des Tutorials haben wir uns einen Überblick über die Möglichkeiten der Microsoft Cloud-Plattform und der Windows Azure Services Plattform verschafft. Nun ist es an der Zeit, die ersten praktischen Schritte zu beginnen. Als erstes nehmen wir uns die Vorbereitung der Entwickler-Maschine vor. Die Entwicklermaschine können Sie ohne zusätzlich anfallende Kosten vorbereiten. Sämtliche Werkzeuge und SDKs für Windows Azure funktionieren neben den kommerziellen Versionen auch mit den frei Verfügbaren Entwicklungswerkzeugen von Microsoft. Nachfolgende Schritt-für-Schritt Anleitung hilft bei der Einrichtung einer Entwicklungsmaschine zur Entwicklung von Cloud-Anwendungen für die Windows Azure Plattform! 1. Einrichten des Betriebssystems Sie benötigen Windows 7, Windows Server 2008 oder Windows Vista inklusive Service Pack 1 als Basisbetriebssystem. Installieren Sie eines dieser Betriebssysteme auf Ihrem Rechner (bei Vista nicht auf das Service Pack 1 vergessen). 2. Installation von IIS 7.0 (Web Server) Für die Entwicklung muss der Windows-eigene Web- und Application-Server IIS 7.x installiert sein. Sie können IIS über die Systemsteuerung unter dem Punkt "Turn Windows features on or off" installieren - siehe nachfolgende Screenshots. Stellen Sie sicher, dass die Feature-Liste genauso wie in nachfolgender Abbildung unter dem Punkt Internet Information Services dargestellt ausgewählt ist. Wichtig dabei ist, auch die WCF-Activation unter dem Punkt "Microsoft .NET Framework 3.5.1" nicht zu vergessen. Diese wird benötigt, um ordnungsgemäß WCF-Services in der Development Fabric laufen lassen zu können. 3. Installation von Visual Studio 2008 oder Visual Studio 2010 Zum Entwickeln benötigen Sie eine Entwicklungsumgebung. Wir empfehlen die Verwendung von Visual Studio 2010 Professional Edition oder höher zur Entwicklung von Cloud Anwendungen. Selbstverständlich können Sie für einfachere Anwendungen auch die frei verfügbare Visual Web Developer 2010 Express Edition verwenden. Auch die ältere Version von Visual Studio, Visual Studio 2008 inkl. SP1 wird für die Entwicklung von Cloud-Anwendungen mit Windows Azure unterstützt. Haben Sie eine der Vollversionen von Visual Studio 2008 installiert, vergessen Sie nicht auf das Visual Studio 2008 Service Pack 1. 4. Installation von SQL Server 2005 Express Edition oder höher - Empfohlen SQL Server 2008 R2 Um den Azure-Storage auf der lokalen Entwickler-Maschine simulieren zu können, benötigen Sie zur Entwicklung von Azure-Anwendungen den SQL Server in der frei verfügbaren Express Edition. Unterstützt werden alle Versionen ab dem SQL Server 2005. Wir empfehlen jedoch, die neueste Version des SQL Severs (2008) zu installieren. Am Besten, Sie installieren Sich SQL Server 2008 R2 inklusive den Management Tools zu SQL Server 2008 R2. 5. [optional] Nur für Visual Studio 2008 nötig - Installation einiger Hotfixes Verwenden Sie Visual Studio 2008 als Entwicklungsumgebung, empfehlen wir die Installation nachfolgender Hotfixes um einige kleine, aber lästige Fehler in der IDE auszubessern und die Stabilität zu verbessern. Für Visual Studio 2010 sind diese Hotfixes nicht erforderlich. Hotfix für den Visual Studio 2008 SP1 Debugger [nicht benötigt auf Windows 7 oder neuer] Hotfix zur Verbesserung der Visual Studio Stabilität [nur benötigt wenn CGI verwendet wird; z.B. mit PHP oder C++] Hotfix für das FastCGI-Modul von IIS 7.0 6. Installation des Windows Azure SDK und der Windows Azure Tools für Visual Studio Haben Sie alle Voraussetzungen installiert, dann ist es endlich soweit. Sie können die Tools und den SDK für Windows Azure installieren. Sie finden den Windows Azure SDK und die Tools hier als frei verfügbaren Download. Mit diesem wird die gesamte Dokumentation für Azure als auch neue Projektvorlagen für Visual Studio installiert. Außerdem wird eine sogenannte Development Fabric und ein Development Storage installiert. Diese simulieren die Windows Azure Umgebung auf ihrer lokalen Entwicklermaschine für die Entwicklung und für lokales Debugging. 7. [optional] Installation des Windows Azure AppFabric SDK Wenn Sie die Windows Azure AppFabric verwenden möchten, um verschiedene Cloud- und On-Premise-Systeme zu verbinden und zu integrieren, so empfehlen wir auch die Installation des AppFabric SDK. Den AppFabric SDK finden Sie hier zum Download - dieser installiert neuen WCF-Bindings und Behaviors sowie Dokumentation, sodass Sie die Azure AppFabric nutzen können. 8. Einrichtung des lokalen Development Storage Bevor Sie nun mit der Entwicklung starten können, müssen Sie den lokalen Development Storage konfigurieren. Visual Studio versucht dies zwar beim ersten Start eines Projektes automatisch, kann den Vorgang allerdings nicht abschließen, wenn sie keine Standardkonfiguration auf Ihrer Entwicklermaschine haben (z.B. eine andere Version von SQL Server außer SQL Server Express Edition). Daher ziehen wir eine manuelle Konfiguration des Development Storage Accounts vor. Der Development Storage wird mit dem Werkzeug dsinit.exe im Verzeichnis <system-drive>:\Program Files\Windows Azure SDK\v1.0\bin\devstore eingerichtet. Standardmäßig verwendet dsinit.exe jenen SQL Server mit dem Instanznamen SQLEXPRESS. Dieser wird standardmäßig für SQL Server Express Edition vergeben. Haben sie also die Express Edition installiert, reicht der gewöhnliche Aufruf von dsinit.exe in einem Visual Studio 2008 Command Prompt wie nachfolgende Abbildung zeigt: Haben Sie einen SQL Server unter einem anderen Instanznamen installiert, so müssen Sie den Schalter /sqlinstance:<ihr-instanzname> beim Aufruf von dsinit.exe verwenden. Meist haben Entwickler eine Developer Edition der Vollversion des SQL Severs installiert. In diesem Falle ist bei einer Standardinstallation kein Instanzname vergeben. Dann muss der Aufruf wie folgt lauten: dsinit.exe /sqlinstance:. (der Punkt hier ist kein Fehler;)). 9. Anlegen eines Testprojektes Endlich kann es losgehen - starten Sie Visual Studio als Administrator, wählen Sie aus dem Menü "File - New - Project" aus und selektieren Sie aus der Kategorie Cloud Service den einzig verfügbaren Eintrag Windows Azure Cloud Service wie nachfolgend dargestellt. Im nächsten Dialog müssen Sie auswählen, welche Anwendungsrollen in ihrem Projekt enthalten sein sollen. Wir möchten lediglich testen, ob unsere Konfiguration auch funktioniert. Daher fügen Sie im nachfolgenden Dialog eine ASP.NET Web Role (genauere Erklärungen dazu folgen in den nächsten Posts des Tutorials) zu Ihrer Solution hinzu (Auswahl links, Hinzufügen über die Pfeil-Buttons in der Mitte): Fügen Sie in dem erscheinenden Code ein paar HTML-Tags ein wie z.B. ein Header-Tag. Die Inhalte spielen im Moment keine Rolle, da wir lediglich die Konfiguration testen möchten. Ein Header-Tag in der Default.aspx Page des angelegten Projektes reicht vollkommen aus. 10. Testen des angelegten Projektes Kompilieren und straten Sie nun die Lösung durch Drücken der Taste F5. Ist alles korrekt konfiguriert, so startet Visual Studio automatisch den Development Storage und die Development Fabric. Damit wird eine Mini-Azure-Umgebung auf Ihrer Entwicklungsmaschine simuliert - Zugriff auf diese Simulationsumgebung haben Sie über entsprechende Symbole im System-Tray wie nachfolgend dargestellt. Mit einem Doppelklick öffnet sich eine einfache Management-Console für diese Simulationsumgebung mit Darstellung aller simulierten Instanzen (mehr dazu in den nächsten Tutorial-Einträgen). Öffnet sich ein Browser und sehen Sie in diesem erfolgreich ihre Anwendung dargestellt, so ist alles korrekt installiert und konfiguriert und sie können mit den richtigen Projekten loslegen! Liebe Grüße Mario Szpuszta http://www.mszcool.at/blog

Cloud Computing Tutorial #15 – Windows Azure Storage Teil 4

Von Mario+Meir-Huber Autor Feed 22. March 2010 21:58
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ Nachdem wir uns nun bereits um den Zugriff auf den Tabellen Storage und jenen der Blobs gekümmert haben, wird es nun Zeit eine fertige Plattform zu erstellen. Hierfür wollen wir zuerst eine Datenquelle für das Projekt erstellen. Diese hat als Typ die DataSource von “FotoAlbumService.FotoAlbumDataSource”. Die Anzeige geschieht über eine DataList, wo zwei Labels für den Namen und der Beschreibung des Albums dienen.  <asp:ObjectDataSource ID="albumData" runat="server" TypeName="FotoAlbumService.FotoAlbumDataSource" SelectMethod="Albums" /> <asp:DataList ID="DataList1" runat="server" DataSourceID="albumData"> <ItemTemplate> <h1> <asp:Label ID="AlbumNameLabel" runat="server" Text='<%# Eval("AlbumName") %>' /> </h1> <br /> Description<br /> <asp:Label ID="AlbumDescriptionLabel" runat="server" Text='<%# Eval("AlbumDescription") %>' /> <p /> </ItemTemplate> </asp:DataList> Als nächstes wird der Upload für die Datei, welche an die Seite gesendet wurde, gestartet. Wichtig ist dann auch noch, das die Datenquelle wieder gebunden werden muss.  protected void Page_Load(object sender, EventArgs e) {     string album = string.Empty;     if(Request.QueryString.AllKeys.Contains("albumId"))     {         BtnAdd.PostBackUrl = "Uploader.aspx?albumId="+ Request.QueryString["albumId"];     }     if (Page.IsPostBack)     {         if (ImageAdder.HasFile && Request.QueryString.AllKeys.Contains("albumId"))         {             FotoAlbumService.FotoAlbumDataSource source = new FotoAlbumService.FotoAlbumDataSource();             album = source.AddImage(ImageAdder.FileName, Request.QueryString["albumId"],                 ImageAdder.PostedFile.ContentType, ImageAdder.FileContent);             source.Insert(new ImageEntity()             {                 Album = Request.QueryString["albumId"],                 Description = TxtDesc.Text,                 FotoName = TxtName.Text,                 Link = album             });             imageList.DataBind();         }     } } Damit man neue Alben erstellt, müssen diese über einen Namen und einer Beschreibung verfügen. Hierfür werden zwei Textfelder und ein Button eingefügt. <div> <table> <tr> <td>Name</td> <td> <asp:TextBox ID="TxtName" runat="server" Width="300px"></asp:TextBox> </td> </tr> <tr> <td>Description</td> <td> <asp:TextBox ID="TxtDescription" runat="server" Width="300px"></asp:TextBox> </td> </tr> <tr> <td></td> <td> <asp:Button ID="Button1" runat="server" Text="Create" /></td> </tr> </table> </div> In der Page_Load der Seite, welche für das Erstellen des Albums notwendig ist, wird noch ein Code eingefügt, welcher eine neue Entität für das Album erstellt. Ferner muss noch der Blob-Container für das Album erstellt werden.   protected void Page_Load(object sender, EventArgs e) { FotoAlbumDataSource source; FotoalbumEntity entity; if (Page.IsPostBack) { source = new FotoAlbumDataSource(); entity = new FotoalbumEntity() { AlbumDescription = TxtName.Text, AlbumName = TxtDescription.Text }; source.CreateAlbum(entity); source.CreatePublicBlob(entity.RowKey); Response.Redirect("Uploader.aspx?albumId=" + entity.RowKey); } } Schlussendlich soll die Übersichtsseite für für die Alben so aussehen: Auf dieser Seite kann man neue Alben erstellen: Hier fügt man ein neues Bild im Album ein: Diese Seite ist die Album-Übersichtsseite. Ich werde in den nächsten Tagen das ganze Sample noch aus SkyDrive veröffentlichen. Viele Grüße aus New York, Mario Meir-Huber Web: www.meirhuber.de Twitter: www.twitter.com/mario_mh

Cloud Computing Tutorial #14 – Windows Azure Storage Teil 3

Von Mario+Meir-Huber Autor Feed 26. February 2010 09:00
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ In diesem Teil wollen wir uns um das Datenmodell kümmern, welches auch in ASP.NET als Datenquelle mit Datenbindung verwendet werden kann. Zu Beginn müssen wir in die “WebRole.cs” Code in die “OnStart”-Methode einfügen. Dies ist notwendig, damit die Konfigurationseinstellungen gelesen werden. Der Hintergrund ist nämlich das der Windows Azure Storage Client auch mit anderen Projekttypen zusammen arbeiten kann. Hierfür wird folgende Region eingefügt: #region Role Definition CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) => { configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)); RoleEnvironment.Changed += (sender, arg) => { if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>().Any ((change) => (change.ConfigurationSettingName == configName))) { if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName))) { RoleEnvironment.RequestRecycle(); } } }; }); #endregion Nun erstellen wir eine neue Klasse vom Typ “FotoAlbumDataSource”. Als erster werden die beiden Datenkontexte, “ImagesContext” und “FotoalbumContext” angelegt. Ferner wird auch noch ein “CloudStorageAccount” und ein “CloudBlobClient” benötigt. Im Konstruktor wird der “CloudStorageAccount” aus der Konfiguration geladen. Diese wurde bereits in einem früheren Post angelegt und trägt den Namen “DevStore”. Nun generiert man sich den CloudBlobClient, die Kontexte und erstellt den TableClient. Mit den TableClient werden nun die Tabellen erstellt, sofern diese noch nicht vorhanden sind. public class FotoAlbumDataSource { private ImagesContext imagesContext = null; private FotoalbumContext albumContext = null; private CloudBlobClient blobClient = null; private CloudStorageAccount account = null; public FotoAlbumDataSource() { account = CloudStorageAccount.FromConfigurationSetting("DevStore"); blobClient = account.CreateCloudBlobClient(); imagesContext = new ImagesContext(account.TableEndpoint.ToString(), account.Credentials); albumContext = new FotoalbumContext(account.TableEndpoint.ToString(), account.Credentials); CloudTableClient client = account.CreateCloudTableClient(); client.CreateTableIfNotExist(ImagesContext.TableName); client.CreateTableIfNotExist(FotoalbumContext.TableName); } Nun ist es auch notwendig, das Bilder in einem Container upgeloaded werden können. Hierfür erstellen wir eine Methode “CreatePublicBlob”. Hierbei wird ein neuer Container im Blob Storage mit einem bestimmten Namen erstellt. Zu Beginn fragen wir diesen Container ab und erstellen diesen, sofern der Container nicht bereits vorhanden ist. Danach werden noch die Zugriffseinstellungen mittels “BlobContainerPersmissions” gesetzt. Hierbei wird “PublicAccess” gewählt. Diese Regeln werden dann dem Container zugewiesen. public void CreatePublicBlob(string name) { CloudBlobContainer blobContainer = blobClient.GetContainerReference(name); blobContainer.CreateIfNotExist(); BlobContainerPermissions permissions = new BlobContainerPermissions(); permissions.PublicAccess = BlobContainerPublicAccessType.Container; blobContainer.SetPermissions(permissions); } In weiterer Folge soll es auch möglich sein, Bilder in einem Container einzufügen. Hierfür brauchen wir eine Funktion, welche den Dateinamen, den Container, den Content-Type und den Stream bekommt. Zu beginn erstellen wir einen neuen Dateinamen mithilfe einer GUID, damit der selbe Dateiname nicht öfter vorkommen kann. Dann wird dem Container der Stream mit der Methode “UploadFromStream” eingefügt. Ferner müssen auch noch die Properties gesetzt werden. Als Rückgabewert verwenden wir nun den Pfad der Datei. public string AddImage(string fileName, string blobContainer, string contentType, Stream content) { string ext = Path.GetExtension(fileName); string filename = Guid.NewGuid().ToString() + ext; CloudBlobContainer container = blobClient.GetContainerReference(blobContainer); CloudBlob blob = container.GetBlobReference(filename); blob.UploadFromStream(content); blob.Properties.ContentType = contentType; blob.SetProperties(); return string.Format("{0}/{1}/{2}", account.BlobEndpoint.AbsoluteUri, blobContainer, filename); } Damit man auch Daten aus der Datenquelle abfragen kann, erstellen wir eine Funktion welche einen Select auf die Images ausführt. Hierbei müssen diese jedoch den Album-Key haben, damit diese auch tatsächlich zum Album gehören. doch ist hier Vorsicht geboten, wenn man die “Where”-Funktion verwendet. Wurde die Tabelle nämlich noch nicht benutzt, so würde hier eine Exception geworfen, da “Album” für die Entität nicht bekannt ist. Daher muss vorher überprüft werden, ob sich Entitäten in der Tabelle befinden. Dies geschieht mit einer Hilfsmethode “ContainsImages”, wo das erste Element der Tabelle abgefragt wird. Wenn dieses null ist, wird false zurück geliefert und es kann kein Vergleich erstellt werden. public IEnumerable<ImageEntity> Select(string key) { CloudTableQuery<ImageEntity> result; if (ContainsImages()) { result = (from r in imagesContext.Fotos where r.Album == key select r).AsTableServiceQuery<ImageEntity>(); } else { result = (from c in imagesContext.Fotos select c).AsTableServiceQuery<ImageEntity>(); } return result.Execute(); } private bool ContainsImages() { ImageEntity ent = imagesContext.Fotos.FirstOrDefault(); return ent != null; } Nun sollen noch die Alben abgefragt werden. Dies gestaltet sich wesentlich einfacher als die vorherige Methode. Hierbei werden alle Entitäten aus der Tabelle “Albums” abgefragt. public IEnumerable<FotoalbumEntity> Albums() { var results = (from c in albumContext.Albums select c).AsTableServiceQuery<FotoalbumEntity>(); return results.Execute(); } Der Vollständigkeit halber sollen auch noch Methoden fürs Löschen, Einfügen und erstellen von Alben angegeben werden. Hier muss man die Entität “attachen” und dann die Aktion auf jene durchführen. Wichtig ist auch noch, dies am Ende zu speichern. public void Delete(ImageEntity item) { imagesContext.AttachTo(ImagesContext.TableName, item, "*"); imagesContext.DeleteObject(item); imagesContext.SaveChanges(); } public void Insert(ImageEntity item) { imagesContext.AddObject(ImagesContext.TableName, item); imagesContext.SaveChanges(); } public void CreateAlbum(FotoalbumEntity album) { albumContext.AddObject(FotoalbumContext.TableName, album); albumContext.SaveChanges(); } Im nächsten Schritt können wir uns auch bereits der ASP.NET Seite widmen.   Mario Meir-Huber Web: www.meirhuber.de Twitter: www.twitter.com/mario_mh

Cloud Computing Tutorial #13 – Windows Azure Storage Teil II

Von Mario+Meir-Huber Autor Feed 25. February 2010 20:31
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ Dies ist nun der Folgepost zu der Windows Azure Storage Einführung, welche ich bereits letzte Woche geschrieben habe. Nun wollen wir eine kleine Anwendung mithilfe des Table Storages und des Blob Storages schreiben. Hierfür erstellen wir uns eine Fotoalbum-Engine. Damit wir los legen können brauchen wir zu allererst ein neues Windows Azure Projekt. Hier fügen wir eine ASP.NET Rolle ein. Nun sind 2 Projekte im Explorer zu erkennen: Das erste Projekt (idealerweise mit dem Namen “PictureAlbum”) ist hierbei für die Service Einstellungen und die Service Definitionen zuständig. Das zweite Projekt ist die eigentliche Website. Hierbei gibt es jedoch zusätzlich noch die WebRole.cs. diese werden wir in einem späteren Post noch ansehen. Zu beginn benötigen wir gleich mal die WebRole1 im Ordner “Roles”. Dieser Ordner befindet sich im Projekt “CloudService1”. Da wir mit der lokalen Datenbank arbeiten wollen, müssen wir hier einige Einstellungen treffen. Durch Rechtsklick auf “WebRole1” können wir hierbei zu den Einstellungen gelangen. Hier wählen wir den Tag “Settings” aus und erstellen ein neues “Setting”. Dieses bezeichnen wir nun mit dem Namen “DevStore” und geben als Typ “Connection String” an. Nun müssen wir nur noch auf den neu erscheinenden Button klicken und die Standardeinstellung bestätigen. Damit ist die Development Storage verwendbar. Dies ist in Abbildung 2 und 3 ersichtlich.   Wenn dies erfolgreich durchgeführt wurde, können wir uns an die Erstellung der Entitäten machen. Eine Entität stellt hierbei eine einzelne Zeile in der Datenbank dar. Zu beginn wollen wir uns eine Entität für die Fotoalben erstellen. Entitäten erben stets von “TableServiceEntity”. Wir erstellen 2 Konstruktoren. Der erste, welche keine Paramter hat ruft den 2. Konstruktor auf. Dieser hat als Parameter den partitonKey und den rowKey. Beide Werte sorgen dafür das der Datensatz eindeutig ist. Wenn keine Daten geben sind, verwenden wir das Datum als PartionKey (man könnte auch eine Guid oder eine Kombination aus Guid und Datum verwenden). Jedoch soll die Partitionierung eher zusammenhängend sein. Dies erreichen wir durch das Datum. Als Rowkey verwenden wir einen Guid. Nun werden auch noch zwei Eigenschaften benötigt. Diese sind der Name des Albums und dessen Beschreibung. public class FotoalbumEntity : TableServiceEntity { public FotoalbumEntity() : this(DateTime.Now.ToShortDateString(), Guid.NewGuid().ToString()) { } public FotoalbumEntity(string partitionKey, string rowKey) : base(partitionKey, rowKey) { } public string AlbumName { get; set; } public string AlbumDescription { get; set; } } Nun wollen wir eine weitere Entität für die Bilder erstellen. Hier werden sämtliche Bilder angegeben, welche einem Album zugeordnet sind. Es wäre an sich nicht notwendig, die Bilder einzeln anzugeben da man über Blobs Metadaten verwenden kann. Jedoch wollen wir in diesem Beispiel vorerst die Tabellen für alles verwenden. Im ImageEntity brauchen nun das Album, den Namen des Fotos, die Beschreibung und den Link dafür. HINWEIS: Die “Verlinkung” auf das Album könnte man sich an sich auch sparen indem man als PartitionKey das den RowKey des Albums verwendet public class ImageEntity : TableServiceEntity {      public ImageEntity()          : this(DateTime.Now.ToShortDateString(), Guid.NewGuid().ToString())      {      }      public ImageEntity(string partitionKey, string rowKey)          : base(partitionKey, rowKey)      {      }      public string Album { get; set; }      public string FotoName { get; set; }      public string Description { get; set; }      public string Link { get; set; } } Nun wollen wir den Datenkontext entwickeln. Hierfür benötigen wir zu erst den Verweis auf “System.Data.Services.Client”. Im TableServiceContext werden unter anderem die Queries erstellt. Die Klasse “ImagesContext” (diese ist für die einzelnen Images zuständig) erbt hierbei von “TableServiceContext”. Im Konstruktor übergeben wir die Adresse des Storage Accounts und die Storage Credentials an die Basisklasse. Ferner benötigen wir auch noch eine Bezeichnung für unsere Tabelle. Hierbei verwenden wir “Pictures”. Um LinQ-Abfragen auf die Bilder durchführen zu können, erstellen wir einen Getter auf die Images. Dieser ist vom Typ “IQueryable<ImageEntity>” und ruft die Funktion “CreateQuery” auf. Ferner wird auch noch ein statischer getter auf den Tabellennamen benötigt. public class ImagesContext : TableServiceContext { private const string tableName = "Pictures"; public ImagesContext(string baseAdress, StorageCredentials credentials) : base(baseAdress, credentials) { } public IQueryable<ImageEntity> Fotos { get { return CreateQuery<ImageEntity>(tableName); } } public static string TableName { get { return tableName; } } } Und genau das selbe führen wir nun auch für den FotoalbumContext aus. Hierbei wird das jedoch auf “Albums” ausgeführt. public class FotoalbumContext : TableServiceContext { private const string tableName = "Albums"; public FotoalbumContext(string baseAdress, StorageCredentials credentials) : base(baseAdress, credentials) { } public IQueryable<FotoalbumEntity> Albums { get { return CreateQuery<FotoalbumEntity>(tableName); } } public static string TableName { get { return tableName; } } } Im nächsten Post werden wir dann eine Datenquelle erstellen, welche wir auch in ASP.NET einfach verwenden können. Mario Meir-Huber Web: www.meirhuber.de Twitter: www.twitter.com/mario_mh

Cloud Computing Tutorial #12 – Grundlegendes zu den SDK Tools

Von Mario+Meir-Huber Autor Feed 17. February 2010 00:34
„Dieser Blog Post ist Teil der Serie „Cloud Computing mit Windows Azure“, alle bisher erschienenen Artikel finden Sie im ersten Posting der Serie!“ Mit dem Windows Azure SDK kann man Anwendungen für Windows Azure entwickeln. Hierfür gibt es verschiedene Anwendungstypen, welche erstellt werden können. Will man Windows Azure Anwendungen in Visual Studio erstellen, so müssen die Windows Azure Tools for Visual Studio installiert sein. Mit dem SDK kommen auch verschiedene Tools mit. Diese sind die Development Fabric und die Development Storage. Erstere ist für das verwalten der Rollen zuständig und simuliert eine Windows Azure Umgebung am lokalen Rechner. Mit der Development Fabric kann man die eigenen Anwendungen debuggen bevor man diese live schaltet. Die Development Storage ist nun für das speichern der Daten zuständig. Wenn wir uns zurück errinnern, gibt es drei verschiedene Möglichkeiten: Blobs, Tables und Queues. Für den Development Account ist eine SQL Server oder SQL Server Express Installation notwendig. Windows Azure erfordert eine Anmeldung am Storage Account. Hierfür ist der Account Name und der Account Key für den Windows Azure Development Storage Account notwendig. Diese sind: Account name: devstoreaccount1 Account key: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw== Für jede mögliche Speicherart (Blob, Queue, Tabelle) gibt es nun einen gewissen Endpunkt. Dies ist eine URI in einem definierten Format. Zu Beginn kommt entweder http oder https, gefolgt von dem Kontonamen und dem Servicenamen. Danach kommt „.core.windows.net/“ gefolgt von dem Ressourcen-Pfad. Einfach dargestellt sieht dies folgendermaßen aus: <http|https>://<accountname>.<servicename>.core.windows.net/<ressourcenpfad> Hierbei ist der „accountname“ der Name des eigenen Services, „servicename“ entweder „blob“, „queue“ oder „table“. Der Ressourcenpfad ist auch wieder unterschiedlich, je nach Verwendungszweck. Bei einem Fotoalbum könnte das folgendermaßen aussehen: http://photostore.blob.core.windows.net/brasil/carnaval.jpg Diese Endpunkte müssen wir für die Development Storage jedoch nicht per Hand eingeben. Im nächsten Posting werden wir sehen wie das einfach konfiguriert werden kann. Wenn man nun ein neues Windows Azure Service erstellt und dieses startet, so werden die Development Fabric und Development Storage gestartet. Im Systray wird nun ein bläuliches Windows Zeichen angezeigt, mit wessen Hilfe man zu den Management Tools der Storage und Fabric kommt. In der Development Storage kann man die einzelnen Services deaktivieren, neustarten oder beenden. In der Development Fabric UI hat man die Möglichkeit, die einzelnen Rollen zu überwachen. Das SDK ist nun in drei Hauptbereiche gegliedert: Diagnostics kümmert sich hierbei um die Rollendiagnose. Dies ist vor allem bei Abstürzen, Memory Leaks und so weiter wichtig. Hierfür gibt es zwei wichtige Namespaces: Microsoft.WindowsAzure.Diagnostics und Microsoft.WindowsAzure.Diagnostics.Management. Im Namespace „Microsoft.WindowsAzure“ befinden sich allgemeine Klassen für den Storage Account und die Credentials (welche für die Verbindung notwendig sind). Storage deckt im SDK die Blobs, Tabellen und Queues ab. Hierfür sind zwei Namespaces wichtig: Microsoft.WindowsAzure.StorageClient und Microsoft.WindowsAzure.StorageClient.Protocol. ServiceRuntime ist nun für die Rollen und die Umgebung dessen zuständig. Hier befinden sich Klassen wie „RoleEntryPoint“ und „RoleEnvironment“. Nun sind auch die wichtigsten Grundlagen für die Arbeit mit dem Client geklärt und wir können uns im nächsten Post !!!ENDLICH!!! an den Quellcode wagen :) Mario Meir-Huber Web: www.meirhuber.de Twitter: www.twitter.com/mario_mh

 
    Build2016
    Developer Events

Aktuelle Downloads

Azure Free Trial
 
Visual Studio Downloads
 
Windows Azure Free Trial
Instagram
CodeFest.at on Facebook

Datenschutz & Cookies · Nutzungsbedingungen · Impressum · Markenzeichen
© 2013 Microsoft. Alle Rechte vorbehalten · BlogEngine.NET 2.7.0.0 · Diese Website wird für Microsoft von atwork gehostet.
powered by atwork