Sdílet prostřednictvím


Začínáme se Reliable Services v Javě

Tento článek vysvětluje základy služby Azure Service Fabric Reliable Services a provede vás vytvořením a nasazením jednoduché aplikace Reliable Service napsané v Javě.

Na této stránce najdete školicí video, které ukazuje, jak vytvořit bezstavovou službu Reliable Service:

Instalace a nastavení

Než začnete, ujistěte se, že máte na počítači nastavené vývojové prostředí Service Fabric. Pokud ho potřebujete nastavit, přejděte na Začínáme na Macu nebo začněte pracovat s Linuxem.

Základní koncepty

Pokud chcete začít se službou Reliable Services, stačí pochopit jen několik základních konceptů:

  • Typ služby: Toto je implementace služby. Je definována třídou, kterou napíšete, která rozšiřuje StatelessService a všechny ostatní kódy nebo závislosti použité v ní spolu s názvem a číslem verze.
  • Pojmenovaná instance služby: Chcete-li spustit službu, vytvoříte pojmenované instance typu služby, podobně jako vytváříte instance objektů typu třídy. Instance služby jsou ve skutečnosti instance objektů vaší třídy služby, kterou píšete.
  • Hostitel služby: Pojmenované instance služby, které vytvoříte, musí běžet uvnitř hostitele. Hostitel služby je jen proces, ve kterém se můžou spouštět instance vaší služby.
  • Registrace služby: Registrace spojuje všechno dohromady. Typ služby musí být zaregistrovaný v modulu runtime Service Fabric v hostiteli služby, aby služba Service Fabric mohla vytvářet instance, které se mají spustit.

Vytvoření bezstavové služby

Začněte vytvořením aplikace Service Fabric. Sada Service Fabric SDK pro Linux obsahuje generátor Yeoman, který poskytuje generování uživatelského rozhraní pro aplikaci Service Fabric se bezstavovou službou. Začněte spuštěním následujícího příkazu Yeoman:

$ yo azuresfjava

Postupujte podle pokynů k vytvoření spolehlivé bezstavové služby. Pro účely tohoto kurzu pojmenujte aplikaci HelloWorldApplication a službu HelloWorld. Výsledek obsahuje adresáře pro a HelloWorldApplication HelloWorld.

HelloWorldApplication/
├── build.gradle
├── HelloWorld
│   ├── build.gradle
│   └── src
│       └── statelessservice
│           ├── HelloWorldServiceHost.java
│           └── HelloWorldService.java
├── HelloWorldApplication
│   ├── ApplicationManifest.xml
│   └── HelloWorldPkg
│       ├── Code
│       │   ├── entryPoint.sh
│       │   └── _readme.txt
│       ├── Config
│       │   └── _readme.txt
│       ├── Data
│       │   └── _readme.txt
│       └── ServiceManifest.xml
├── install.sh
├── settings.gradle
└── uninstall.sh

Registrace služby

Typy služeb musí být zaregistrované v modulu runtime Service Fabric. Typ služby je definován v ServiceManifest.xml a vaše třída služby, která implementuje StatelessService. Registrace služby se provádí v hlavním vstupním bodu procesu. V tomto příkladu je HelloWorldServiceHost.javahlavním vstupním bodem procesu:

public static void main(String[] args) throws Exception {
    try {
        ServiceRuntime.registerStatelessServiceAsync("HelloWorldType", (context) -> new HelloWorldService(), Duration.ofSeconds(10));
        logger.log(Level.INFO, "Registered stateless service type HelloWorldType.");
        Thread.sleep(Long.MAX_VALUE);
    }
    catch (Exception ex) {
        logger.log(Level.SEVERE, "Exception in registration:", ex);
        throw ex;
    }
}

Implementace služby

Otevřete HelloWorldApplication/HelloWorld/src/statelessservice/HelloWorldService.java. Tato třída definuje typ služby a může spustit libovolný kód. Rozhraní API služby poskytuje dva vstupní body pro váš kód:

  • Metoda otevřeného vstupního bodu, která se nazývá runAsync(), kde můžete začít spouštět jakékoli úlohy, včetně dlouhotrvajících výpočetních úloh.
@Override
protected CompletableFuture<?> runAsync(CancellationToken cancellationToken) {
    ...
}
  • Vstupní bod komunikace, kde můžete připojit komunikační zásobník podle svého výběru. Tady můžete začít přijímat žádosti od uživatelů a dalších služeb.
@Override
protected List<ServiceInstanceListener> createServiceInstanceListeners() {
    ...
}

Tento kurz se zaměřuje na metodu vstupního runAsync() bodu. Tady můžete okamžitě začít spouštět svůj kód.

RunAsync

Platforma volá tuto metodu, když je instance služby umístěna a připravena ke spuštění. U bezstavové služby to znamená, že při otevření instance služby. Token zrušení se poskytuje ke koordinaci, kdy je potřeba uzavřít instanci služby. V Service Fabric může k tomuto otevřenému/zavření instance služby dojít mnohokrát po celou dobu životnosti služby jako celku. K tomu může dojít z různých důvodů, mezi které patří:

  • Systém přesune instance služby pro vyrovnávání prostředků.
  • V kódu dochází k chybám.
  • Aplikace nebo systém se upgraduje.
  • Základní hardware má výpadek.

Tuto orchestraci spravuje Service Fabric, aby byla vaše služba vysoce dostupná a správně vyvážená.

runAsync() by nemělo být synchronně blokované. Vaše implementace runAsync by měla vrátit CompletableFuture, aby modul runtime mohl pokračovat. Pokud vaše úloha potřebuje implementovat dlouhotrvající úlohu, která by se měla provést uvnitř completableFuture.

Zrušení

Zrušení úlohy je spolupráce orchestrovaná poskytnutým tokenem zrušení. Systém čeká na dokončení úkolu (úspěšným dokončením, zrušením nebo chybou), než se přesune dál. Je důležité respektovat token zrušení, dokončit veškerou práci a co nejrychleji ukončit runAsync() , když systém požádá o zrušení. Následující příklad ukazuje, jak zpracovat událost zrušení:

@Override
protected CompletableFuture<?> runAsync(CancellationToken cancellationToken) {

    // TODO: Replace the following sample code with your own logic
    // or remove this runAsync override if it's not needed in your service.

    return CompletableFuture.runAsync(() -> {
        long iterations = 0;
        while(true)
        {
        cancellationToken.throwIfCancellationRequested();
        logger.log(Level.INFO, "Working-{0}", ++iterations);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex){}
        }
    });
}

V tomto příkladu bezstavové služby je počet uložen v místní proměnné. Vzhledem k tomu, že se jedná o bezstavovou službu, existuje hodnota uložená pouze pro aktuální životní cyklus instance služby. Když se služba přesune nebo restartuje, hodnota se ztratí.

Vytvoření stavové služby

Service Fabric zavádí nový druh služby, který je stavový. Stavová služba může spolehlivě udržovat stav v rámci samotné služby společně s kódem, který ji používá. Service Fabric má stav vysoce dostupný, aniž by bylo nutné zachovat stav v externím úložišti.

Pokud chcete převést hodnotu čítače z bezstavové na vysoce dostupnou a trvalou, i když se služba přesune nebo restartuje, potřebujete stavovou službu.

Ve stejném adresáři jako aplikace HelloWorld můžete přidat novou službu spuštěním yo azuresfjava:AddService příkazu. Zvolte "Reliable Stateful Service" pro vaši architekturu a pojmenujte službu "HelloWorldStateful".

Vaše aplikace by teď měla mít dvě služby: bezstavovou službu HelloWorld a stavovou službu HelloWorldStateful.

Stavová služba má stejné vstupní body jako bezstavová služba. Hlavním rozdílem je dostupnost poskytovatele stavu, který dokáže spolehlivě ukládat stav. Service Fabric se dodává s implementací zprostředkovatele stavu s názvem Reliable Collections, která umožňuje vytvářet replikované datové struktury prostřednictvím Správce spolehlivého stavu. Stavová spolehlivá služba ve výchozím nastavení používá tohoto zprostředkovatele stavu.

Otevřete HelloWorldStateful.java v HelloWorldStateful –> src, která obsahuje následující metodu RunAsync:

@Override
protected CompletableFuture<?> runAsync(CancellationToken cancellationToken) {
    Transaction tx = stateManager.createTransaction();
    return this.stateManager.<String, Long>getOrAddReliableHashMapAsync("myHashMap").thenCompose((map) -> {
        return map.computeAsync(tx, "counter", (k, v) -> {
            if (v == null)
                return 1L;
            else
                return ++v;
            }, Duration.ofSeconds(4), cancellationToken)
                .thenCompose((r) -> tx.commitAsync())
                .whenComplete((r, e) -> {
            try {
                tx.close();
            } catch (Exception e) {
                logger.log(Level.SEVERE, e.getMessage());
            }
        });
    });
}

RunAsync

RunAsync() funguje podobně ve stavových a bezstavových službách. Ve stavové službě však platforma provádí další práci vaším jménem před spuštěním RunAsync(). Tato práce může zahrnovat zajištění připravenosti správce spolehlivého stavu a spolehlivých kolekcí.

Spolehlivé kolekce a Správce spolehlivého stavu

ReliableHashMap<String,Long> map = this.stateManager.<String, Long>getOrAddReliableHashMapAsync("myHashMap")

ReliableHashMap je implementace slovníku, kterou můžete použít k spolehlivému ukládání stavu ve službě. Pomocí Service Fabric a Reliable HashMap můžete data ukládat přímo ve službě bez nutnosti externího trvalého úložiště. Spolehlivé hodnoty HashMap umožňují vysokou dostupnost dat. Service Fabric toho dosahuje vytvořením a správou více replik vaší služby za vás. Poskytuje také rozhraní API, které abstrahuje složitost správy těchto replik a jejich přechodů stavu.

Spolehlivé kolekce můžou ukládat libovolný typ Javy, včetně vlastních typů, s několika upozorněními:

  • Service Fabric zpřístupňuje váš stav tak, že replikuje stav mezi uzly a Reliable HashMap ukládá data na místní disk na jednotlivých replikách. To znamená, že vše, co je uloženo v Reliable HashMaps, musí být serializovatelné.

  • Objekty se replikují pro zajištění vysoké dostupnosti při potvrzení transakcí do Reliable HashMaps. Objekty uložené v Reliable HashMap se uchovávají v místní paměti ve vaší službě. To znamená, že máte místní odkaz na objekt.

    Je důležité, abyste neztlumily místní instance těchto objektů bez provedení operace aktualizace spolehlivé kolekce v transakci. Důvodem je to, že změny místních instancí objektů se nebudou replikovat automaticky. Objekt musíte znovu vložit do slovníku nebo použít některou z aktualizačních metod ve slovníku.

Správce spolehlivého stavu spravuje spolehlivé hashmapy za vás. Správce spolehlivého stavu můžete kdykoli a na libovolném místě ve vaší službě požádat o spolehlivou kolekci podle názvu. Správce spolehlivého stavu zajišťuje, že získáte odkaz zpět. Nedoporučujeme ukládat odkazy na spolehlivé instance kolekce v proměnných nebo vlastnostech členů třídy. Je třeba věnovat zvláštní pozornost tomu, aby byl odkaz nastaven na instanci vždy v životním cyklu služby. Správce spolehlivého stavu tuto práci zpracovává za vás a je optimalizovaný pro opakované návštěvy.

Transakční a asynchronní operace

return map.computeAsync(tx, "counter", (k, v) -> {
    if (v == null)
        return 1L;
    else
        return ++v;
    }, Duration.ofSeconds(4), cancellationToken)
        .thenCompose((r) -> tx.commitAsync())
        .whenComplete((r, e) -> {
    try {
        tx.close();
    } catch (Exception e) {
        logger.log(Level.SEVERE, e.getMessage());
    }
});

Operace s Reliable HashMaps jsou asynchronní. Důvodem je to, že operace zápisu se spolehlivými kolekcemi provádějí vstupně-výstupní operace pro replikaci a zachování dat na disk.

Spolehlivé operace HashMap jsou transakční, takže můžete zachovat konzistentní stav napříč několika spolehlivými objekty HashMap a operacemi. Můžete například získat pracovní položku z jednoho Spolehlivého slovníku, provést operaci s ním a uložit výsledek do jiné Reliable HashMap, a to vše v rámci jedné transakce. Jedná se o atomické operace a zaručuje, že buď celá operace bude úspěšná, nebo se celá operace vrátí zpět. Pokud dojde k chybě po vyřazení položky z fronty, ale před uložením výsledku se celá transakce vrátí zpět a položka zůstane ve frontě ke zpracování.

Sestavení aplikace

Generování uživatelského rozhraní Yeoman obsahuje skript gradle pro sestavení aplikace a skriptů Bash pro nasazení a odebrání aplikace. Pokud chcete aplikaci spustit, nejprve sestavte aplikaci pomocí gradle:

$ gradle

Tím se vytvoří balíček aplikace Service Fabric, který je možné nasadit pomocí Service Fabric CLI.

Nasazení aplikace

Jakmile je aplikace sestavená, můžete ji nasadit do místního clusteru.

  1. Připojte se k místnímu clusteru služby Service Fabric.

    sfctl cluster select --endpoint http://localhost:19080
    
  2. Spuštěním instalačního skriptu, který je součástí šablony, zkopírujte balíček aplikace do úložiště imagí clusteru, zaregistrujte typ aplikace a vytvořte její instanci.

    ./install.sh
    

Nasazení sestavené aplikace je stejné jako u všech ostatních aplikací Service Fabric. Podrobné pokyny najdete v dokumentaci s popisem správy aplikace Service Fabric pomocí Service Fabric CLI.

Parametry těchto příkazů najdete v generovaných manifestech uvnitř balíčku aplikace.

Jakmile je aplikace nasazená, otevřete prohlížeč a přejděte k nástroji Service Fabric Explorer na adrese http://localhost:19080/Explorer. Pak rozbalte uzel Aplikace a všimněte si, že už obsahuje položku pro váš typ aplikace a další položku pro první instanci tohoto typu.

Důležité

Pokud chcete aplikaci nasadit do zabezpečeného clusteru s Linuxem v Azure, musíte nakonfigurovat certifikát pro ověření aplikace pomocí modulu runtime Service Fabric. Tím umožníte službám Reliable Services komunikovat s podkladovými rozhraními API modulu runtime Service Fabric. Další informace najdete v tématu Konfigurace aplikace Reliable Services pro spouštění v clusterech s Linuxem.

Další kroky