Author: Andrey Zhukov, .NET Team Leader, DataArt
In this article, I described my own successful experience of migrating a real project from one cloud platform to another. Of course, this is not the only possible way. But I think here you can find tips that will make life easier for everyone who is just about to make such a transition. However, you will need to consider the specifics of your project and use common sense.
, : Azure -> GCP
(Azure) (Google Cloud Platform). Node.js full-stack typescript-. ASP.NET MVC , . GCP.
, , GCP
ASP.NET MVC-, MS SQL . Azure App Services.
— Web Portal — , Razor, TypeScript, JavaScript, Knockout Bootstrap. . , Azure: Azure Service Bus, Azure Blobs, Azure Tables storage, Azure Queue storage. - , . . GCP . , Azure Cache for Redis. Azure WebJob, Azure Service Bus. , , .
Azure WebJobs - . — , , Hangfire, IHostedService Microsoft.
— Web API — ASP.NET WEB API. MS SQL . , , . .
, : , , ASP.NET MVC . . , , , . .
, ASP.NET MVC ASP.NET Core 3.1, WebJob c .NET Framework .NET Core, Linux. Windows GCP , . , Azure, - Azure WebJob, , GCP, . . Azure App Services. Docker. - .
, : , .
, . . Smoke tests.
, , , . . . , , , .
: , . , - . , , . , , , , , . . , , .
Azure GCP-, cloud-agnostic-. .
, - , . . , . . – , , .
Web Portal c ASP.NET MVC ASP.NET Core
1.1. Web Portal Azure , .
1.2. Web Portal .NET Core.
1.3. .
1.4. Merge Web Portal , .
1.5. Web Portal.
1.6. Web Portal, Azure.
Web API c ASP.NET MVC ASP.NET Core
2.1. E2E Web API.
2.2. Web API Azure , .
2.3. Web API.
2.4. Web API .NET Core.
2.5. Web API .
2.6. Merge Web API , .
2.7. Web API.
2.8. Web API, Azure.
Azure
3.1. Web Portal Azure.
GCP
4.1. Web Portal GCP.
4.2. Web Portal .
4.3. .
4.4. Web API GCP.
4.5. Web API .
4.6. prod-.
4.7. Web Portal Web API prod GCP.
, , , .
.NET Framework -> .NET Core
.Net Framework .Net Core Microsoft ASP.NET ASP.NET Core.
-Web- :
NuGet- Visual Studio 2019;
;
App.config XML settings.json .
NuGet- Azure SDK , . , .NET Core , . Azure Service Bus WebJobs SDK. Azure Service Bus , WebJob , SDK.
C ASP.NET MVC ASP.NET Core . Web-. ASP.NET Core , . ASP.NET Core , ASP.NET MVC . , , ASP.NET MVC ASP.NET Core.
ASP.NET Core ASP.NET MVC .
( NuGet-, . ).
Web.config appsettings.json .
Dependency injection .NET Core , Asp.NET MVC .
StaticFiles middleware : , , JavaScript-, CSS- . .
app.UseStaticFiles(); // wwwroot
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "Scripts")),
RequestPath = "/Scripts"
});
wwwroot
.
6. bundleconfig.json JavaScript CSS- . JavaScript CSS:
<link rel="stylesheet" href="~/bundles/Content.css" asp-append-version="true" />
<script src="~/bundles/modernizr.js" asp-append-version="true"></script>
asp-append-version="true"
, (bundles) , . . wwwroot
( ).
7. UnhadledExceptions: ASP.NET Core , , .
8. : ASP.NET Core Serilog. , , -, structured logging c .
9. Session — , , .
10. Routing: , templates, - .
11. JSON-: ASP.NET Core System.Text.Json Newtonsoft.Json. Microsoft , , , , , Newtonsoft.Json . , Newtonsoft.Json. , , Web API , , , . Newtonsoft.Json .
12. Typescript 2.3. , Node.js, Microsoft.TypeScript.MSBuild, tsconfig.json, (Definitions) Knockout, - //@ts-ignore
.
13. HTTPS . , HttpsOnly, .
14. , body , URL , HTTP Headers HttpContext , . . API ASP.NET MVC. , binding (Actions) (Controllers).
15. Swagger c Swashbuckle.AspNetCore.Swagger.
16. Authentication .
, . , .
Azure?
ASP.NET Core Azure-. , , - GCP. .
Azure Service Bus Redis Pub/Sub. , , , RabbitMQ. , , Redis . — . , , . , Redis Pub/Sub , .
Azure Blobs GCP Blobs. , - : GCP Blobs . CSV. Google Google Cloud operations suite, Stackdriver.
Azure Table Storage Web Portal. , . Microsoft, . . ILogger. , Serilog. GCP Stackdriver.
- GCP, Azure. , , , : IBlobService, IRequestLogger, ILogReader. Serilog. , Web Portal, , Azure Table Storage, Serilog.Sinks.AzureTableStorage.KeyGenerator.IKeyGenerator. GCP Google Cloud operations Log Router Sinks, BigQuery, .
Azure WebJobs?
Azure WebJobs Azure App Services on Windows. , Azure WebJobs SDK. SDK . :
static async Task Main(string[] args)
{
….
var builder = new HostBuilder();
...
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
...
}
Dependency Injection
public class RedisPubSubMessageProcessor : Microsoft.Extensions.Hosting.IHostedService
{
...
public async Task StartAsync(CancellationToken cancellationToken)
...
public async Task StopAsync(CancellationToken cancellationToken)
...
}
.NET Core . Azure WebJob SDK, Azure WebJob. Linux Docker- Kubernetes, .
. , . , . , Microsoft. , , . Web API . Azure- , .
, , .
Docker
Docker . Dockerfile Visual Studio. , , Web Portal, Web API, WebJob ( ). Dockerfile Microsoft — Dockerfile Web Portal Node.js. build TypeScript.
RUN apt-get update && \
apt-get -y install curl gnupg && \
curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
apt-get -y install nodejs
Azure App Services -> GKE
.NET Core- GCP, :
App Engine Flex.
Kubernetes Engine.
Compute Engine.
Google Kubernetes Engine (GKE). (Linux). GKE, , , . , . - .
GCP, MS SQL Server, Cloud SQL Google.
Web Portal , Smoke-. . , Prod, , , Product Owner. QA-, , , . , . Puppeteer-, - . CICD. - - - .
Web API, , . Postman, CICD Newman. Swagger, . . IIS (Internet Information Services), . . , , Postman- . , , Staging, Prod, Dev.
, . , . Web API , , , .
Azure MS SQL -> GCP Managed MS SQL
MS SQL Managed Azure GCP Cloud SQL , . :
(Azure : Database data storage /
Used space 181GB).
.
Azure GCP Cloud SQL.
, . Azure SQL bacpac, backup . 6 bacpac 154 backup. GCP Cloud backup, , MS SQL bacpac backup . Microsoft SQL Server Management Studio, MS SQL Server . , . Azure SQL prod , . - , . SSD- 1 .
Azure App Services GCP Kubernetes CICD, Feature Branch deployments, Blue/Green deployment. Kubernetes , Github Actions. Iac (Infrastructure-as-Code) Pulumi.
. — .