Cvičení – refaktoring služby z jednoho bloku do mikroslužby
Když teď společnost Fabrikam analyzuje svou aplikaci, je připravená zahájit proces refaktoringu pro přesun služeb z monolitické architektury do mikroslužeb. Upravíme aplikaci tak, aby se služba zpracování balíčků převedla na mikroslužbu.
Refaktoring aplikace
Před nasazením aktualizované aplikace se podíváme na to, jak byla aktualizována. Monolitická aplikace používá službu pro zpracování balíčků PackageProcessor.cs. Po analýze výkonu aplikace byla tato služba identifikována jako kritický bod s vlivem na výkon. Poptávka zákazníků na dodávky pomocí dronů se zvyšuje, a proto se tato služba při zpracovávání plánování a logistiky pro dodávky pomocí dronů silně přetěžuje. Vyhrazený tým tuto službu plně spravuje, takže jeho přesun do mikroslužby pomáhá s výkonem a poskytuje vylepšenou flexibilitu vývoje.
Podívejme se blíže na změny, které jsme provedli.
Doručování pomocí dronů dříve
Třída PackageProcessor
zpracovává základní funkce zpracování balíčků v souboru PackageProcessor.cs . V tomto příkladu provádí určitou práci, která je náročná na prostředky. Scénář z reálného světa může zahrnovat výpočty dob doručení, trasy doručení a aktualizace zdrojů dat těmito informacemi.
public class PackageProcessor : IPackageProcessor
{
public Task<PackageGen> CreatePackageAsync(PackageInfo packageInfo)
{
//Uses common data store e.g. SQL Azure tables
Utility.DoWork(100);
return Task.FromResult(new PackageGen { Id = packageInfo.PackageId });
}
}
Při nárůstu žádostí o tuto službu se zvyšuje využití prostředků, které je však omezeno na fyzické prostředky přidělené monolitické aplikaci. Pokud je tato služba nasazená ve službě Aplikace Azure, můžeme ji vertikálně navýšit nebo rozšířit. V ideálním případě chcete, aby se tento silně používaný prostředek škálovat nezávisle na optimalizaci výkonu a nákladů. Právě k tomu v tomto scénáři použijeme Azure Functions.
Doručování pomocí dronů po provedení změn
Pojďme se podívat na kód aplikace DroneDelivery , než ho nasadíme. Vidíte, že se PackageProcessor
třída změnila na PackageServiceCaller
třídu. Nadále se implementuje rozhraní IPackageProcessor, ale volání HTTP se provádí do mikroslužby.
public class PackageServiceCaller : IPackageProcessor
{
private readonly HttpClient httpClient;
public static string FunctionCode { get; set; }
public PackageServiceCaller(HttpClient httpClient)
{
this.httpClient = httpClient;
}
public async Task<PackageGen> CreatePackageAsync(PackageInfo packageInfo)
{
var result = await httpClient.PutAsJsonAsync($"{packageInfo.PackageId}?code={FunctionCode}", packageInfo);
result.EnsureSuccessStatusCode();
return new PackageGen { Id = packageInfo.PackageId };
}
}
Mikroslužba se nasadí do funkce Azure. Její kód lze najít v souboru PackageServiceFunction.cs a obsahuje následující kód.
public static class PackageServiceFunction
{
[FunctionName("PackageServiceFunction")]
public static Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "put", Route = "packages/{id}")] HttpRequest req,
string id, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
//Uses common data store e.g. SQL Azure tables
Utility.DoWork(100);
return Task.FromResult((IActionResult)new CreatedResult("http://example.com", null));
}
}
Když tento kód vložíte do služby Azure Functions, může se tato služba škálovat nezávisle na nárůstu uživatelského zatížení. Služby můžete pro zbývající kód zachovat optimalizované pro zbytek aplikace. U služby balíčků je možné při nárůstu žádostí o doručování pomocí dronů v systému provést horizontální navýšení kapacity.
Teď aplikaci nasadím znovu. Nejdřív nasadíme refaktorovanou službu do funkce Azure Functions. Pak nasadíme refaktorovanou aplikaci ve službě App Service a nasměrujeme ji na funkci.
Nasazení aplikace funkcí
Spuštěním následujícího příkazu nastavte proměnné prostředí, které odkazují na naše služby.
APPSERVICENAME="$(az webapp list \ --resource-group "<rgn>[sandbox resource group]</rgn>" \ --query '[].name' \ --output tsv)" FUNCTIONAPPNAME="$(az functionapp list \ --resource-group "<rgn>[sandbox resource group]</rgn>" \ --query '[].name' \ --output tsv)"
Sestavíme kód aplikace pro aplikaci funkcí a zazipujeme ho.
cd ~/mslearn-microservices-architecture/src/after dotnet build ./PackageService/PackageService.csproj -c Release cd PackageService/bin/Release/netcoreapp2.2 zip -r PackageService.zip .
Spuštěním následujícího příkazu odešlete kód do aplikace funkcí.
az functionapp deployment source config-zip \ --resource-group "<rgn>[sandbox resource group]</rgn>" \ --name $FUNCTIONAPPNAME \ --src PackageService.zip
Nasazení aktualizované aplikace DroneDelivery
Teď, když je služba spuštěná ve funkci Azure Functions, musíme aplikaci pro drony nasměrovat na tuto aplikaci funkcí.
Nejdřív musíme získat přístupový kód pro tuto aplikaci funkcí, abychom ji mohli úspěšně volat z aplikace. Tento kód načtete spuštěním následujících příkazů. Zobrazí se název aplikace funkcí a kód, které použijete v dalších krocích.
RESOURCEGROUPID=$(az group show \ --resource-group "<rgn>[sandbox resource group]</rgn>" \ --query id \ --output tsv) FUNCTIONCODE=$(az rest \ --method post \ --query default \ --output tsv \ --uri "https://management.azure.com$RESOURCEGROUPID/providers/Microsoft.Web/sites/$FUNCTIONAPPNAME/functions/PackageServiceFunction/listKeys?api-version=2018-02-01") echo "FunctionName - $FUNCTIONAPPNAME" echo "FunctionCode - $FUNCTIONCODE"
Spuštěním následujících příkazů v Azure Cloud Shellu otevřete appsettings.json v editoru kódu.
cd ~/mslearn-microservices-architecture/src/after code ./DroneDelivery-after/appsettings.json
V editoru kódu nahraďte hodnoty
PackageServiceUri
aPackageServiceFunctionCode
. VPackageServiceUri
nahraďte<FunctionName>
názvem vaší aplikace funkcí.V
PackageServiceFunctionCode
nahraďte<FunctionCode>
kódem funkce, který jste načetli. Soubor appsettings.json by měl vypadat podobně jako v tomto příkladu:{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "PackageServiceUri": "https://packageservicefunction-abc.azurewebsites.net/api/packages/", "PackageServiceFunctionCode": "SvrbiyhjXJUdTPXrkcUtY6bQaUf7OXQjWvnM0Gq63hFUhbH2vn6qYA==" }
Stisknutím ctrl+S soubor uložte a stisknutím Ctrl+Q zavřete editor kódu.
Spuštěním následujícího příkazu nasaďte aktualizovanou aplikaci do služby App Service.
zip -r DroneDelivery-after.zip . -x \*/obj/\* \*/bin/\* az webapp deploy \ --resource-group "<rgn>[sandbox resource group]</rgn>" \ --name $APPSERVICENAME \ --src-path DroneDelivery-after.zip
Po opětovném nasazení webu aktualizujte stránku. Teď by se měl aktualizovat.
Testování výkonu nové architektury
Teď, když je služba s omezenými prostředky přesunuta do mikroslužby, která běží ve službě Azure Functions, se podíváme, jak tato změna ovlivnila výkon aplikace.
Na domovské stránce webu vyberte Send Requests (Odeslat žádosti). Tím se žádosti odešlou z monolitické aplikace do mikroslužby, která se spouští ve funkci Azure Functions.
První pokus může poskytnout podobné výsledky jako v monolitické aplikaci. Aktualizujte stránku, a pokud se zobrazí výzva, odešlete žádost znovu. Tento krok několikrát zopakujte. Mělo by se zobrazit 100 messages sent in 1 second (100 zpráv odeslaných za 1 sekundu).
Úvodní pokus byl pomalejší, protože aplikace funkcí se spouštěla. Po jeho zprovoznění byla doba odezvy lepší než v případě, že byl tento kód spuštěný v monolitické architektuře.
U této součásti architektury lze teď kapacitu horizontálně rozšiřovat při stejném výkonu téměř neomezeně. Přesunutím kódu aplikace do mikroslužby jsme vylepšili výkon o 5 až 10krát. Společnost Fabrikam má pro tuto službu vyhrazený vývojový tým, takže může provádět iterace také v této mikroslužbě a využívat výhody vyšší flexibility a vydávání funkcí.