Microservices für .Net Entwickler - BridgingIT...

Post on 30-May-2020

8 views 0 download

Transcript of Microservices für .Net Entwickler - BridgingIT...

Microservices für .Net Entwickler

Tobias Meier

Lead Softwarearchitekt Microsoft

Standort Nürnberg

Königtorgraben 11

90402 Nürnberg

Standort Zug/Schweiz

Baarerstraße 14

CH-6300 Zug

Standort Mannheim

N7, 5-6

68161 Mannheim

Standort Karlsruhe

Rüppurrer Straße 4

76137 Karlsruhe

Standort Stuttgart

Marienstraße 17

70178 Stuttgart

Standort München

Riesstraße 12

80992 München

Standort Frankfurt

Solmsstraße 4

60486 Frankfurt

Standort Köln

Waidmarkt 11

50676 Köln

Wir bringen Dinge zusammen

http://blog.bridging-it.de/author/Tobias.Meier Tobias.Meier@bridging-it.de @bitTobiasMeier

Agenda

Status quo

Was sind Microservices

Service Fabric Cluster

Entwickeln für Service Fabric 1

Pause: Essen

Entwickeln für Service Fabric 2

Viele reden von Microservices,

wer entwickelt bereits

Microservices ?

Monolitische Architektur

Schichten Architektur

Wächst und wächst …

Skalierung über Hardware

bzw. VMs <=> DB Locks

Microservice-Architektur

Kleine, unabhängige Services

Eigener Prozess

Leichtgewichtige Kommunikation

Unabhängige, automatisierte Installation

Verschiedene Technologien und/oder Programmiersprachen möglich

Unabhängige Datenspeicherung

Minimaler zentralisierter Managementaufwand

“In short the microservice architectural style [...] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. “

Martin Fowler, https://martinfowler.com/articles/microservices.html

Microservice = SOA Done right

= SOA + DDD + Patterns

Patterns: Autonome Services, Bounded Context, Event Driven Design, Continuous Delivery, …

„Ok, dann teilen wir unseren Monolithen in hunderte Services auf.“

Auch verteilte Anwendungen haben Nachteile …

Komplexität von verteilten Anwendungen

Gesamtanwendung hat viele Abhängigkeiten

Komplexität der Orchestrierung

Daten-Konsistenz

Höherer Entwicklungsaufwand

Kommunikation untereinander

Netzwerklatenz

Versionierung von Schnittstellen

Abwärtskompatibilität

Welche Version ist installiert ?

Testbarkeit ist schwerer

The Art of Scalability: Scale Cube

http://theartofscalability.com/

X: Horizontale Skalierung

Y: F

unktionale

Skalie

rung

Microservices in der Microsoft-Welt

Container Services: http://aka.ms/acs

Azure Functions: https://functions.azure.com/try

Service Fabric

Aufbau Service Fabric

Microservice

WebAppOwin

Microservice

WebAppAsp.Net Core

Windows Container

Guest Executable

Reliable Actor API Reliable Service API

Service Fabric

On-Premise Azure

Windows Server LinuxWindows Server Linux

Microservice

Java

Microservice

Hosted in Container

Service Fabric: Platform as a service

Microsoft nutzt Service Fabric:

Azure Core Infrastructure

Azure Sql Database

Bing Cortana

Document Db

Event Hubs

IoT-Suite

Skype for Business

Beispiel ModuleDemo der fertigen Anwendung

Service Cluster Lokal

Entwicklungs-Cluster

http://localhost:19080/

Beispielanwendung

Benutzer kann sich registrieren

Thumbnails von Fotos werden angezeigt

Fotos können hochgeladen werden.

Aktuell nur Command-Line-Interface: Benutzer wählt ein Foto aus und bewertet es.. Zusätzlich können auch Kommentare geschrieben werden.

Angedacht: Wenn ein Foto im Detail aufgerufen wird, werden alle

Kommentare angezeigt. Authentification / Authorization

Service Fabric

PhotoAward.Platform

StatelessWebApi und

Fileserver

PhotoAward.MemberManagement

Statefull Service

PhotoAward.PhotoManagement

Statefull Service

PhotoAward.Thumbnail

Stateless Service

PhotoAward.PhotoActor

Actor Service

PhotoAward.MemberActor

Actor Service

Me

mb

erA

ctor.

Inte

rfaces

Ph

oto

Acto

r.

Inte

rfaces

Thu

mb

naiil.

Inte

rfaces

Me

mb

erM

anagem

en

t.

Inte

rfaces

Ph

oto

Man

agem

en

t.

Inte

rfaces

Ports: 8200, 8443

Co

nso

le.C

lien

tP

ho

toA

ward

Ap

p(A

ngu

lar2)

API-Gateway

Service Cluster On Azure

https://github.com/Microsoft/azure-docs/blob/master/articles/service-fabric/service-

fabric-cluster-creation-via-portal.md

Vorbereitungen

Evtl. Ressourcengruppe

erstellen

Evtl. Key Vault anlegen

Zertifikat eintragen

Durchführung

Service Fabric Wizard starten

Vorbereitungen: Key Vault

LoginPS C:\> Login-AzureRmAccount

Key Vault anlegen PS C:\> New-AzureRmKeyVault -VaultName 'westeuropeVault' -

ResourceGroupName 'servicefabricdemo' -Location 'Westeurope' –EnabledForDeployment

Vault Name : westeuropevault

Resource Group Name : servicefabricdemo

Location : Westeurope

Resource ID : /subscriptions/00000000-0000-0000-0000-

000000000000/resourceGroups/servicefabricdemo

/providers/Microsoft.KeyVault/vaults/westeuropevault

Vault URI : https://westeuropevault.vault.azure.net

Tenant ID : 11111111-1111-1111-1111-111111111111

Vorbereitungen: Testzertifikat hinzufügen

Download Hilfsskripte: https://github.com/ChackDan/Service-Fabric/tree/master/Scripts/ServiceFabricRPHelpers

ImportPS C:\> Import-Module "C:\Projekte\Service-Fabric-

master\Scripts\ServiceFabricRPHelpers\ServiceFabricRPH

Testzertifikat erzeugenPS C:\> Invoke-AddCertToKeyVault -SubscriptionId

$SubID -ResourceGroupName "servicefabricdemo" -Location "westeurope"

-VaultName "mywesteuropevault"

-CertificateName "bitdemophotoappcertificate1"

-CreateSelfSignedCertificate

-DnsName "bitdemophotoawardapp.westeurope.cloudapp.azure.com"

-OutputPath "c:\Certificates"

Vorbereitungen: Testzertifikat hinzugefügt

Name : CertificateThumbprint

Value : 885BE4B2E6F80FD32A022E5087B2EAE5311FDEB8

Name : SourceVault

Value : /subscriptions/00000000-0000-0000-0000-

000000000000/resourceGroups/servicefabricdemo/providers/Microsoft.KeyVau

lt/vaults/westeuropevault

Name : CertificateURL

Value :

https://westeuropevault.vault.azure.net:443/secrets/bitdemophotoappcertif

icate1/22223333222222221111222211112222

Service Fabric Cluster anlegen (1 / 5)

Service Fabric Cluster anlegen (2 / 5)

Service Fabric Cluster anlegen (3 / 5)

Service Fabric Cluster anlegen (4 / 5)

Service Fabric Cluster anlegen (5 / 5)

Stateless Service

Zustandsloser Service

Typisches Modell für heutige Webanwendungen

Daten können extern gehalten werden Sql Datenbank

DocumentDB

Azure Storage

Reliable Service API

Stateless oder Statefull Service

Naming Service

Zugriff auf Service Fabric APIs

Modelle zum Data-Upgrade

Zuverlässigkeit

Reliability

Verfügbarkeit

Availability

Skalierbarkeit

Scalability

Beständigkeit

Consistency

Visual Studio immer als Admin starten

Beispiel ModuleHello World

Web API ProjektRNDemo

Lokales Cluster

Statefull Service

Zustand bleibt auch nach Neustart erhalten

Synchronisation über Replicas

StateManager

Reliable Collection

Transaktionen

Beispiel ModuleStatefull Service

Reliable Collectionsusing (var tx = StateManager.CreateTransaction()){

var members = await StateManager.GetOrAddAsync<IReliableDictionary<string,Person>>("members");

await members.AddOrUpdateAsync(tx, person.Email, person, (key, p) => person);

person.Email = person.Email.ToUpper();

await tx.CommitAsync();}

ToUpper() wird NICHT übernommen

Reliable Collectionsusing (var tx = StateManager.CreateTransaction()){

var members = await StateManager.GetOrAddAsync<IReliableDictionary<string,Person>>("members");

person.Email = person.Email.ToUpper();

await members.AddOrUpdateAsync(tx, person.Email, person, (key, p) => person);

await tx.CommitAsync();}

ToUpper() wird übernommen

Tipp: Objekte sollten Immutable sein

Private Setter

System.Collections.Immutable

https://www.nuget.org/packages/System.Collections.Immutable

Immutable Collection[DataContract]public sealed class PersonData{public PersonData(string name, IEnumerable<string> emails){this.Name = name;Emails = (emails== null) ? ImmutableList<string>.Empty :emails.ToImmutableList();

}[DataMember] public readonly string Name;[DataMember] public IEnumerable<string> Emails { get; private set; }

[OnDeserialized]private void OnDeserialized(StreamingContext context){Emails = Emails.ToImmutableList();

}}

Reliable Actors

Actor: Lifecycle

Automatisch erzeugt

Können manuell explizit gelöscht werden

Akteuere können „schlafen gelegt“ werden

Knoten 1

Reliable Actors

Partition 1

Partition 2

Partition 3

Knoten 2

Partition 1

Partition 2

Partition 3

Actor Proxy

Knoten 3

Partition 1

Partition 2

Partition 3

Client (Statefull Service, weitere Actor, …)

Actor erzeugen

var data = …

var photoActorId = ActorId.CreateRandom();

var client = this._actorClientFactory.CreateClient(photoActorId);

await client.SetPhoto(data, CancellationToken.None);

await tx.CommitAsync();

Actor löschen

var svc = (IActorService) this.ActorService;

await svc.DeleteActorAsync(this.Id, cancellationToken);

Beispiel ModuleActor-Service

Backup and Restore

Ableitung vom Actor Service

Methode BackupAsync aufrufen

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-platform

https://github.com/Microsoft/azure-docs/blob/master/articles/service-fabric/service-fabric-reliable-services-backup-restore.md

Actor: Timer

Wrapper um .Net Timer

RegisterTimer

Nach Beendigung des Callbacks startet das nächste Zeitfenster

Unregister Timer

„Schlafen gelegte“ Actors erhalten keinen Timeraufruf

Actor: Reminder

Reminders werden auch zu bestimmten Zeitpunkten ausgelöst

Sie werden IMMER ausgelöst

public class ToDoListActor : Actor, IPhotoAwardActor, IRemindable{

public Task ReceiveReminderAsync(string name, byte[] context, TimeSpan dueTime, TimeSpan period){

if (name("Abgabetermin")){

int amountToPay = BitConverter.ToInt32(context, 0);System.Console.WriteLine("Please pay your cell phone bill of ${0}!", amountToPay);

}return Task.FromResult(true);

}}

Beispiel ModuleDemo: Statefull Actor

Dependency Injection und Unit Tests

Asp WebApi kann Dependency Injection verwenden

In sonstigen Services nicht benötigt!

Mock-Klassen für StateManager, ReliableCollections,

Transaktionen u.ä. manuell schreiben

Beispiel ModuleDemo: Unit Testing

Update

Application Version erhöhen

Code Version erhöhen

Evtl. Data Version erhöhen

Continuous Delivery

TFS 2017 und TFS Online Eigene ServiceFabric Tasks für Build

und Release:

Versionsnummer setzen

Deployment

1. Endpunkt im TFS definieren

2. Continous Delivery erzeugen …

3. Build Template bearbeiten

3. Build Template bearbeiten (Ergebnis)

4. Release Template

Vertrag§1. Service 1 §1.1. Schnittstelle§1.2. Daten

Microservices für .Net Entwickler

Service Fabric bietet leistungsfähige

Plattform mit Z-Scale

Alles hat seinen Preis

Continous Delivery von Anfang an

Clustererstellung skripten

Clusterplanung ist komplex

Microservices für .Net Entwickler

Out of Scope

Authentication und Authorization

Partitionierung der Daten

Backup / Restore

Docker

Understanding Azure –a guide vor developers

http://aka.ms/adg

Service Fabric SDK

http://aka.ms/ServiceFabricSDK

Beispiele von Microsoft

http://aka.ms/ServiceFabricSamples

Case Studies

https://blogs.msdn.microsoft.com/azureservicefabric/

tag/case-study/

Beispielanwendung

http://blog.bridging-it.de/author/Tobias.Meier

Vielen Dank

Email: Tobias.Meier@bridging-it.de Twitter: @bITTobiasMeier

Blog: http://blog.bridging-it.de/author/Tobias.Meier