NopCommerce: migratie van .NET Core 2.2 naar .NET Core 3.1

31 augustus 2020 om 16:00 by ParTech Media - Post a comment

NopCommerce is overgezet van .NET Core 2.2 naar .NET Core 3.1. .NET Core 3.1 wordt officieel ondersteund tot december 2022, hierdoor is vandaag de dag migratie een populair onderwerp. Het is het waard om een project over te zetten naar .NET Core 3.1 wanneer je volledig voordeel wilt halen uit het ge-upgrade framework en bij wilt blijven met technologische innovaties en groeiende wereldwijde trends.

Voor het snelgroeiende eCommerce project is het noodzakelijk om veel aandacht te besteden aan systeem prestaties en veiligheid. In de eerste .NET Core 3.0 review werd aangekondigd dat de nieuwe versie van het framework veel sneller en productiever zou worden. De volgende .NET Core 3.1 features brengen nopCommerce op een nieuw level van schaalbaarheid, prestatie en veiligheid:

  1. Tiered compilation zorgt voor een verkorte opstarttijd.
  2. Nieuwe ingebouwde high-performance en low-memory support voor JSON.
  3. De endpoint routing geïntroduceerd in .NET Core 2.2 is verbeterd. Het grootste voordeel is dat de route nu bepaald wordt vóór het uitvoeren van de middleware.

Wat is nieuw in .NET Core 3.1?

Verschillende .NET Core 3.1 innovaties worden gebruikt in nopCommerce. Het gebruik van deze .NET Core 3.1 innovaties levert verschillende voordelen op.

Generic Host

In .NET Core 2.1 is Generic Host een toevoeging op de Web Host. Het zorgt ervoor dat je tools zoals dependency injection (DI) en logging abstractions kunt gebruiken. .NET Core 3 benadrukt de betere compatibiliteit met Generic Host, zodat je nu de updated Generic Host Builder kunt gebruiken in plaats van Web Host Builder. Dit maakt het mogelijk om elke soort applicatie te maken, van console applicaties en WPF tot web applicaties, op dezelfde basic hosting paradigma met dezelfde gemeenschappelijke abstracties. Het is nog steeds mogelijk om Web Host Builder te gebruiken maar sommige soorten zijn verouderd in ASP.NET Core 3.1 en kunnen vervangen worden in de volgende versie.

Global.json

Het idee en de mogelijkheid om gebruik te maken van deze feature bestond al in de .NET Core 2.0 versie, maar de mogelijkheden waren niet volledig. Het was alleen mogelijk om de versie van de SDK te specificeren die je applicatie gebruikt. De flexibelere SDK versiebeheer werd alleen beschikbaar in .NET Core 3.0 met de introductie van policies als allowPrerelease en rollForward. Je kunt nu de versie specificeren waarvan je gemakkelijk de applicatie kan bouwen. Dit kan zonder elke keer global.json te veranderen nadat de volgende patch is gereleased. Op deze manier kun je het bereik in functionaliteit dat je nodig hebt definiëren op basis van je voorwaarden. Het geeft je ook een garantie dat gebruikers van jouw applicatie het precies draaien op die SDK assemblies die je gebruikt hebt en niet de laatste versie die geïnstalleerd is op hun server.

ASP.NET Core Module V2

Voorafgaand aan .NET Core 2.2 hostte IIS een .NET Core app door het uitvoeren van een Kestrel instantie en het standaard doorsturen van verzoeken van IIS naar Kestrel. Eigenlijk diende IIS als een proxy. Dit werkt wel, maar is langzaam door de dubbele aanroep van IIS naar Kestrel terwijl het verzoek verwerkt wordt. Deze methode heet «OutOfProcess».

.NET Core 2.2 heeft het nieuwe “InProcess” hosting model geïntroduceerd. In plaats van het doorsturen van verzoeken naar Kestrel handelt IIS deze verzoeken intern af. Dit maakt het verwerken van verzoeken veel sneller omdat je het verzoek niet hoeft door te sturen naar Kestrel. Echter, dit was een optionele functie en werd niet standaard gebruikt. In .NET Core 3.1 is de in-process hosting model al standaard geconfigureerd, dit verbetert de doorvoer van ASP.NET Core verzoeken in IIS significant. Tijdens het testen is een toename van de systeemprestatie gemeten, dit met een grote hoeveelheid verzoeken.

Endpoint Routing

In .NET Core 2.1 werd de routing gedaan in Middleware (ASP.NET Core MVC middleware) aan het einde van de HTTP requests. Dit betekent dat de informatie over de route, zoals welke controller action uitgevoerd moet worden, niet beschikbaar was voor de middleware dat het request verwerkte vóór de MVC middleware. Toen .NET Core 2.2 uit was werd een nieuw endpoint-based routing systeem geïntroduceerd. Dit routing concept richt zich op de hiervoor genoemde aspecten.

Endpoint Routing is nu anders gebouwd in .NET Core 3.1. De routing fase is gescheiden van de call naar het endpoint. Nu zijn er twee tussenliggende middlewares:

  • EndpointRoutingMiddleware: dit bepaald welke endpoint opgeroepen wordt voor elk pad van het URL verzoek en dient uiteindelijk als een routing.
  • EndpointMiddleware: roept de endpoint op.

C# 8.0 syntactic sugar

In aanvulling op de .NET Core zelf is een nieuwe versie van C# 8.0 released. Er zijn veel updates, sommige hiervan zijn redelijk globaal, andere hebben betrekking op kleine schoonheidsverbeteringen die de ontwikkelaars voorzien van “syntactic sugar”.

Performance verbeteringen

Na het upgraden van de nopCommerce applicatie zijn er een flink aantal performance tests uitgevoerd om de verschillen tussen .NET Core 2.2 en .NET Core 3.1 te meten.

Na de upgrade bleek dat de applicatie ongeveer 20% sneller draait, gemiddeld 12,7% meer requests per tijdseenheid kan verwerken en het geheugengebruik beter is geworden waardoor de applicatie minder geheugen gebruikt.

Bekijk voor meer informatie de website van nopCommerce: https://www.nopcommerce.com/en/migration-from-net-core-22-to-net-core-31-nopcommerce-experience?utm_source=newsletter&utm_medium=email&utm_content=core31_migration&utm_campaign=community_news