Cvičení – refaktorování služby v rámci monolitu na mikroslužbu
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. Pojďme upravit aplikaci tak, aby přesunula službu zpracování balíčků do mikroslužby.
Přepracuj aplikaci
Než nasadíme aktualizovanou aplikaci, podívejme se, jak se aktualizovala. Monolitická aplikace má službu pro zpracování balíčků PackageProcessor.cs. Po analýze výkonu aplikace byla tato služba identifikována jako kritický bod výkonu. S tím, jak zákazníci zvyšují poptávku po dodávkách dronů, je tato služba silně zatížená, zatímco zpracovává plánování a logistiku dodávek dronů. 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 podrobněji na provedené změny.
Doručování dronem před
Třída PackageProcessor zpracovává základní funkce zpracování balíčku v PackageProcessor.cs souboru. V tomto příkladu provádí určitou práci, která je náročná na prostředky. Skutečný scénář může zahrnovat výpočet doby doručení a tras doručení a aktualizaci zdrojů dat s využitím těchto informací.
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 });
}
}
S rostoucími požadavky na tuto službu se zvyšuje využití prostředků a je omezeno na fyzické prostředky přidělené monolitické aplikaci. Pokud je tato služba nasazena ve službě Azure App Service, můžeme ji škálovat vertikálně i horizontálně. V ideálním případě chcete, aby se tento intenzivně využívaný prostředek škáloval nezávisle pro optimalizaci výkonu a nákladů. V tomto scénáři použijeme k tomu Azure Functions.
Doručování pomocí dronů po nějaké události
Pojďme se podívat na kód aplikace DroneDelivery-after, než ho nasadíme. Vidíte, že PackageProcessor třída byla změněna na třídu PackageServiceCaller. Stále implementuje rozhraní IPackageProcessor, ale místo toho provádí volání HTTP 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. Jeho kód najdete v 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 pro zbývající kód aplikace optimalizovaný pro zbytek aplikace můžete ponechat. Služba balíčků škáluje kapacitu, protože do systému přicházejí další žádosti o doručování pomocí dronů.
Teď aplikaci nasadím znovu. Nejprve nasadíme refaktorovanou službu ve službě 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)"Pojďme sestavit kód pro funkční aplikaci a zazipovat jej.
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 pro doručování pomocí dronů
Teď, když naše služba běží na Azure Functions, musíme aplikaci pro drony nasměrovat na tuto funkční aplikaci.
Nejdřív potřebujeme získat přístupový kód aplikace funkcí, abychom ho mohli úspěšně volat z aplikace. Spusťte následující příkazy pro načtení tohoto kódu. V dalších krocích zobrazíte název a kód funkční aplikace pro použití.
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.jsonV editoru kódu nahraďte hodnoty
PackageServiceUriaPackageServiceFunctionCode. VPackageServiceUrinahraďte<FunctionName>názvem vaší funkční aplikace.V
PackageServiceFunctionCodenahraďte<FunctionCode>kódem funkce, který jste získali. 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.zipPo 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 Odeslat žádosti. Tato akce odešle požadavky z monolitické aplikace do mikroslužby, která běží ve funkci Azure.
První pokus může poskytnout podobné výsledky monolitické aplikaci. Aktualizujte stránku a po zobrazení výzvy znovu odešlete požadavek. Tento krok proveďte několikrát a měli byste vidět 100 zpráv odeslaných za 1 sekundu.
Počáteční pokus byl pomalejší, zatímco se funkční aplikace 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.
Tato část architektury se teď dá škálovat téměř neomezeně, ale stále poskytuje stejný výkon. Přesunutím kódu aplikace do mikroslužby jsme vylepšili výkon o 5 až 10krát. Vzhledem k tomu, že společnost Fabrikam má pro tuto službu vyhrazený vývojový tým, může také iterovat tuto mikroslužbu a využívat výhody vyšší flexibility a vydávání funkcí.