forked from v.moiseev/distributed-computing
Compare commits
5 Commits
mikhailov-
...
mikhailov-
| Author | SHA1 | Date | |
|---|---|---|---|
| f46f267f25 | |||
| ed040a4f05 | |||
| 3fc54b31fb | |||
| e7d7ea67d1 | |||
| a875ab9c91 |
72
tasks/mikhailov-ys/Lab_3/README.md
Normal file
72
tasks/mikhailov-ys/Lab_3/README.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# Отчет по лабораторной работе №3
|
||||
|
||||
Выполнил студент Михайлов Юрий гр. ИСЭбд-41 .
|
||||
|
||||
## REST API, Gateway и синхронный обмен между микросервисами
|
||||
|
||||
## Создание микросервисов
|
||||
|
||||
1. С помощью команды `dotnet new web -n worker-1` в терминале создали первый микросервис.
|
||||
2. Добавил решение `dotnet new sln`. Связал решение и проект командой `dotnet sln worker-1.sln add worker-1.csproj` повторил для 2-ого микросервиса.
|
||||
3. Добавил библиотеку Swagger и OpenAi в проекты и запустил с помощью команды `dotnet run`.
|
||||
|
||||
Протестированный микросервис:
|
||||

|
||||
|
||||
|
||||
## Реализация синхронного обмена.
|
||||
Реализован код, который вызывет сихронно данные из соседнего микросервиса.
|
||||
|
||||
```cs
|
||||
app.MapGet("/Сities/", async () =>
|
||||
{
|
||||
var httpClient = new HttpClient();
|
||||
var secondWorkerResponse = await httpClient.GetStringAsync("http://worker-1:8080/");
|
||||
return secondWorkerResponse.ToArray();
|
||||
})
|
||||
.WithName("GetCountries")
|
||||
.WithOpenApi();
|
||||
```
|
||||
|
||||
## Реализация gateway при помощи nginx
|
||||
|
||||
Добавил nginx.conf:
|
||||
|
||||
```conf
|
||||
server {
|
||||
listen 8080;
|
||||
listen [::]:8080;
|
||||
server_name localhost;
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
location /worker-1/ {
|
||||
proxy_pass http://worker-1:8080/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Prefix /worker-1;
|
||||
}
|
||||
location /worker-2/ {
|
||||
proxy_pass http://worker-2:8080/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Prefix /worker-2;
|
||||
}
|
||||
}
|
||||
```
|
||||
Результат после команды `docker-compose up`:
|
||||
|
||||
Docker desktop:
|
||||

|
||||
|
||||
index.html на gateway-1:
|
||||

|
||||
|
||||
worker-1:
|
||||

|
||||
|
||||
worker-2:
|
||||

|
||||
15
tasks/mikhailov-ys/Lab_3/docker-compose.yml
Normal file
15
tasks/mikhailov-ys/Lab_3/docker-compose.yml
Normal file
@@ -0,0 +1,15 @@
|
||||
version: "3.1"
|
||||
services:
|
||||
worker-1:
|
||||
build: ./worker-1
|
||||
worker-2:
|
||||
build: ./worker-2
|
||||
depends_on:
|
||||
- worker-1
|
||||
gateway:
|
||||
image: nginx:latest
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- ./static:/usr/share/nginx/html:ro
|
||||
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
26
tasks/mikhailov-ys/Lab_3/nginx.conf
Normal file
26
tasks/mikhailov-ys/Lab_3/nginx.conf
Normal file
@@ -0,0 +1,26 @@
|
||||
server {
|
||||
listen 8080;
|
||||
listen [::]:8080;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
location /worker-1/ {
|
||||
proxy_pass http://worker-1:8080/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Prefix /worker-1;
|
||||
}
|
||||
|
||||
location /worker-2/ {
|
||||
proxy_pass http://worker-2:8080/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Prefix /worker-2;
|
||||
}
|
||||
}
|
||||
BIN
tasks/mikhailov-ys/Lab_3/picture/1.png
Normal file
BIN
tasks/mikhailov-ys/Lab_3/picture/1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
BIN
tasks/mikhailov-ys/Lab_3/picture/3.png
Normal file
BIN
tasks/mikhailov-ys/Lab_3/picture/3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 103 KiB |
BIN
tasks/mikhailov-ys/Lab_3/picture/4.png
Normal file
BIN
tasks/mikhailov-ys/Lab_3/picture/4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
BIN
tasks/mikhailov-ys/Lab_3/picture/5.png
Normal file
BIN
tasks/mikhailov-ys/Lab_3/picture/5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
BIN
tasks/mikhailov-ys/Lab_3/picture/6.png
Normal file
BIN
tasks/mikhailov-ys/Lab_3/picture/6.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
13
tasks/mikhailov-ys/Lab_3/static/index.html
Normal file
13
tasks/mikhailov-ys/Lab_3/static/index.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Тестовое приложение для л/р 3</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>Выполнил студент гр. ИСЭбд-41. Михайлов Юрий</p>
|
||||
<p><a href="/worker-1/">Отправить запрос к worker-1</a></p>
|
||||
<p><a href="/worker-2/">Отправить запрос к worker-2</a></p>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
tasks/mikhailov-ys/Lab_3/worker-1/.vs/worker-1/v17/.futdcache.v2
Normal file
BIN
tasks/mikhailov-ys/Lab_3/worker-1/.vs/worker-1/v17/.futdcache.v2
Normal file
Binary file not shown.
BIN
tasks/mikhailov-ys/Lab_3/worker-1/.vs/worker-1/v17/.suo
Normal file
BIN
tasks/mikhailov-ys/Lab_3/worker-1/.vs/worker-1/v17/.suo
Normal file
Binary file not shown.
11
tasks/mikhailov-ys/Lab_3/worker-1/Dockerfile
Normal file
11
tasks/mikhailov-ys/Lab_3/worker-1/Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
|
||||
WORKDIR /app
|
||||
|
||||
COPY . ./
|
||||
RUN dotnet restore
|
||||
RUN dotnet publish -c Release -o out
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0
|
||||
WORKDIR /app
|
||||
COPY --from=build-env /app/out .
|
||||
ENTRYPOINT ["dotnet", "worker-1.dll"]
|
||||
118
tasks/mikhailov-ys/Lab_3/worker-1/Program.cs
Normal file
118
tasks/mikhailov-ys/Lab_3/worker-1/Program.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
List<Countries > countries = new()
|
||||
{
|
||||
new Countries () { Uuid= Guid.Parse("6a1b4a72-5669-41fe-8d5b-106dc86f58bd"), Name = "Russia", Area = "1222" },
|
||||
new Countries () { Uuid= Guid.Parse("464bbdb8-39c0-4644-b9c0-3df1c484ea7e"), Name = "USA", Area = "0" },
|
||||
new Countries () { Uuid= Guid.Parse("f8692bea-b7e6-4164-b564-a921f16c35c9"), Name = "Germany", Area = "1" },
|
||||
|
||||
};
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.MapGet("/", () =>
|
||||
{
|
||||
return countries.Select(r => new CountrieEntityDto()
|
||||
{
|
||||
Uuid = r.Uuid,
|
||||
Name = r.Name,
|
||||
Area = r.Area,
|
||||
|
||||
});
|
||||
})
|
||||
.WithName("GetCountries")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapGet("/{uuid}", (Guid uuid) =>
|
||||
{
|
||||
var countrie = countries.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (countrie == null)
|
||||
return Results.NotFound();
|
||||
return Results.Json(new CountrieEntityDto()
|
||||
{
|
||||
Uuid = countrie.Uuid,
|
||||
Name = countrie.Name,
|
||||
Area = countrie.Area,
|
||||
|
||||
});
|
||||
})
|
||||
.WithName("GetCountrieByGUID")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapPost("/{name}/{area}", (string name, string area) =>
|
||||
{
|
||||
Guid NewGuid = Guid.NewGuid();
|
||||
countries.Add(new Countries() { Uuid = NewGuid, Name = (string)name, Area = (string)area});
|
||||
|
||||
var countrie = countries.FirstOrDefault(r => r.Uuid == NewGuid);
|
||||
if (countrie == null)
|
||||
return Results.NotFound();
|
||||
return Results.Json(new CountrieEntityDto()
|
||||
{
|
||||
Uuid = countrie.Uuid,
|
||||
Name = countrie.Name,
|
||||
Area = countrie.Area,
|
||||
|
||||
});
|
||||
})
|
||||
.WithName("PostCountrie")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapPatch("/{uuid}/{name}/{area}", (Guid uuid, string ?name, string ?area) =>
|
||||
{
|
||||
var countrie = countries.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (countrie == null)
|
||||
return Results.NotFound();
|
||||
if (name != null) countrie.Name = name;
|
||||
if (area != ",") countrie.Area = area;
|
||||
|
||||
|
||||
return Results.Json(new CountrieEntityDto()
|
||||
{
|
||||
Uuid = countrie.Uuid,
|
||||
Name = countrie.Name,
|
||||
Area = countrie.Area,
|
||||
|
||||
});
|
||||
})
|
||||
.WithName("UpdateCountrie")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapDelete("/{uuid}", (Guid uuid) =>
|
||||
{
|
||||
var countrie = countries.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (countrie == null)
|
||||
return Results.NotFound();
|
||||
countries.Remove(countrie);
|
||||
return Results.Json(new CountrieEntityDto()
|
||||
{
|
||||
Uuid = countrie.Uuid,
|
||||
Name = countrie.Name,
|
||||
Area = countrie.Area,
|
||||
|
||||
});
|
||||
})
|
||||
.WithName("DeleteCountrieByGUID")
|
||||
.WithOpenApi();
|
||||
|
||||
app.Run();
|
||||
|
||||
public class Countries
|
||||
{
|
||||
public Guid Uuid { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Area { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class CountrieEntityDto : Countries { }
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:51956",
|
||||
"sslPort": 44303
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5197",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7027;http://localhost:5197",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
tasks/mikhailov-ys/Lab_3/worker-1/appsettings.json
Normal file
9
tasks/mikhailov-ys/Lab_3/worker-1/appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
15
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.csproj
Normal file
15
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.csproj
Normal file
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>worker_1</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
6
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.csproj.user
Normal file
6
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.csproj.user
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ActiveDebugProfile>https</ActiveDebugProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
22
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.sln
Normal file
22
tasks/mikhailov-ys/Lab_3/worker-1/worker-1.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-1", "worker-1.csproj", "{90F6C7BD-78E2-47C8-A702-DD47E74D3865}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{90F6C7BD-78E2-47C8-A702-DD47E74D3865}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
tasks/mikhailov-ys/Lab_3/worker-2/.vs/worker-2/v17/.suo
Normal file
BIN
tasks/mikhailov-ys/Lab_3/worker-2/.vs/worker-2/v17/.suo
Normal file
Binary file not shown.
11
tasks/mikhailov-ys/Lab_3/worker-2/Dockerfile
Normal file
11
tasks/mikhailov-ys/Lab_3/worker-2/Dockerfile
Normal file
@@ -0,0 +1,11 @@
|
||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
|
||||
WORKDIR /app
|
||||
|
||||
COPY . ./
|
||||
RUN dotnet restore
|
||||
RUN dotnet publish -c Release -o out
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0
|
||||
WORKDIR /app
|
||||
COPY --from=build-env /app/out .
|
||||
ENTRYPOINT ["dotnet", "worker-2.dll"]
|
||||
142
tasks/mikhailov-ys/Lab_3/worker-2/Program.cs
Normal file
142
tasks/mikhailov-ys/Lab_3/worker-2/Program.cs
Normal file
@@ -0,0 +1,142 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.OpenApi.Models;
|
||||
|
||||
List<Сities> сities = new()
|
||||
{
|
||||
new Сities() { Uuid= Guid.NewGuid(), Population = "134r23", Name = "Moscow", IdCountrie = Guid.Parse("6a1b4a72-5669-41fe-8d5b-106dc86f58bd") },
|
||||
new Сities() { Uuid= Guid.NewGuid(), Population = "223322213", Name = "Paris", IdCountrie = Guid.Parse("f8692bea-b7e6-4164-b564-a921f16c35c9") },
|
||||
new Сities() { Uuid= Guid.NewGuid(), Population = "32123", Name = "New York", IdCountrie = Guid.Parse("464bbdb8-39c0-4644-b9c0-3df1c484ea7e") },
|
||||
new Сities() { Uuid= Guid.NewGuid(), Population = "312122", Name = "Sant Peterburg", IdCountrie = Guid.Parse("464bbdb8-39c0-4644-b9c0-3df1c484ea7e") },
|
||||
};
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.MapGet("/", () =>
|
||||
{
|
||||
return сities.Select(r => new CityEntityDto()
|
||||
{
|
||||
Uuid = r.Uuid,
|
||||
Population = r.Population,
|
||||
Name = r.Name,
|
||||
IdCountrie = r.IdCountrie,
|
||||
});
|
||||
})
|
||||
.WithName("GetСities")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapGet("/{uuid}", (Guid uuid) =>
|
||||
{
|
||||
var city = сities.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (city == null)
|
||||
return Results.NotFound();
|
||||
return Results.Json(new CityEntityDto()
|
||||
{
|
||||
Uuid = city.Uuid,
|
||||
Population = city.Population,
|
||||
Name = city.Name,
|
||||
IdCountrie = city.IdCountrie,
|
||||
});
|
||||
})
|
||||
.WithName("GetCityByGUID")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapPost("/{population}/{name}/{IdCountrie}", (string? Population, string Name, Guid IdCountrie) =>
|
||||
{
|
||||
Guid NewGuid = Guid.NewGuid();
|
||||
сities.Add(new Сities() { Uuid = NewGuid, Population = (string)Population, Name = (string)Name, IdCountrie = (Guid)IdCountrie });
|
||||
|
||||
var city = сities.FirstOrDefault(r => r.Uuid == NewGuid);
|
||||
if (city == null)
|
||||
return Results.NotFound();
|
||||
return Results.Json(new CityEntityDto()
|
||||
{
|
||||
Uuid = city.Uuid,
|
||||
Population = city.Population,
|
||||
Name = city.Name,
|
||||
IdCountrie = city.IdCountrie,
|
||||
});
|
||||
})
|
||||
.WithName("PostCity")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapPatch("/{uuid}/{population}/{name}/{IdCountrie}", (Guid uuid, string ?population, string name, Guid IdCountrie) =>
|
||||
{
|
||||
var city = сities.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (city == null)
|
||||
return Results.NotFound();
|
||||
if (population != ",") city.Population = population;
|
||||
if (name != city.Name) city.Name = name;
|
||||
if (IdCountrie != city.IdCountrie) city.IdCountrie = IdCountrie;
|
||||
|
||||
return Results.Json(new CityEntityDto()
|
||||
{
|
||||
Uuid = city.Uuid,
|
||||
Population = city.Population,
|
||||
Name = city.Name,
|
||||
IdCountrie = city.IdCountrie,
|
||||
});
|
||||
})
|
||||
.WithName("UpdateCity")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapDelete("/{uuid}", (Guid uuid) =>
|
||||
{
|
||||
var city = сities.FirstOrDefault(r => r.Uuid == uuid);
|
||||
if (city == null)
|
||||
return Results.NotFound();
|
||||
сities.Remove(city);
|
||||
return Results.Json(new CityEntityDto()
|
||||
{
|
||||
Uuid = city.Uuid,
|
||||
Population = city.Population,
|
||||
Name = city.Name,
|
||||
IdCountrie = city.IdCountrie,
|
||||
});
|
||||
})
|
||||
.WithName("DeleteCity")
|
||||
.WithOpenApi();
|
||||
|
||||
app.MapGet("/Сities/", async () =>
|
||||
{
|
||||
var httpClient = new HttpClient();
|
||||
var secondWorkerResponse = await httpClient.GetStringAsync("http://worker-1:8080/");
|
||||
|
||||
return secondWorkerResponse.ToArray();
|
||||
})
|
||||
.WithName("GetCountries")
|
||||
.WithOpenApi();
|
||||
|
||||
app.Run();
|
||||
|
||||
public class Сities
|
||||
{
|
||||
public Guid Uuid { get; set; }
|
||||
public string Population { get; set; } = string.Empty;
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public Guid IdCountrie { get; set; }
|
||||
}
|
||||
|
||||
public class CityEntityDto : Сities { }
|
||||
|
||||
public class Countries
|
||||
{
|
||||
public Guid Uuid { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Area { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class CountrieEntityDto : Countries { }
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/launchsettings.json",
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:36404",
|
||||
"sslPort": 44384
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5101",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"https": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7125;http://localhost:5101",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
tasks/mikhailov-ys/Lab_3/worker-2/appsettings.json
Normal file
9
tasks/mikhailov-ys/Lab_3/worker-2/appsettings.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
15
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.csproj
Normal file
15
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.csproj
Normal file
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>worker_2</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
6
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.csproj.user
Normal file
6
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.csproj.user
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ActiveDebugProfile>https</ActiveDebugProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
22
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.sln
Normal file
22
tasks/mikhailov-ys/Lab_3/worker-2/worker-2.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "worker-2", "worker-2.csproj", "{C9D63524-2C63-4E86-91B6-D86955CFA5F8}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C9D63524-2C63-4E86-91B6-D86955CFA5F8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,14 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.11" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,173 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Running;
|
||||
|
||||
public class MatrixMultiplication
|
||||
{
|
||||
public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB)
|
||||
{
|
||||
int rowsA = matrixA.Length;
|
||||
int colsA = matrixA[0].Length;
|
||||
int colsB = matrixB[0].Length;
|
||||
|
||||
int[][] result = new int[rowsA][];
|
||||
|
||||
for (int i = 0; i < rowsA; i++)
|
||||
{
|
||||
result[i] = new int[colsB];
|
||||
|
||||
for (int j = 0; j < colsB; j++)
|
||||
{
|
||||
for (int k = 0; k < colsA; k++)
|
||||
{
|
||||
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads)
|
||||
{
|
||||
int rowsA = matrixA.Length;
|
||||
int colsA = matrixA[0].Length;
|
||||
int colsB = matrixB[0].Length;
|
||||
|
||||
int[][] result = new int[rowsA][];
|
||||
|
||||
Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i =>
|
||||
{
|
||||
result[i] = new int[colsB];
|
||||
|
||||
for (int j = 0; j < colsB; j++)
|
||||
{
|
||||
for (int k = 0; k < colsA; k++)
|
||||
{
|
||||
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void MultiplySequential_100x100()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(100, 100);
|
||||
int[][] matrixB = GenerateRandomMatrix(100, 100);
|
||||
MultiplySequential(matrixA, matrixB);
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_100x100_4TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(100, 100);
|
||||
int[][] matrixB = GenerateRandomMatrix(100, 100);
|
||||
MultiplyParallel(matrixA, matrixB, 4);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_100x100_8TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(100, 100);
|
||||
int[][] matrixB = GenerateRandomMatrix(100, 100);
|
||||
MultiplyParallel(matrixA, matrixB, 8);
|
||||
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_100x100_16TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(100, 100);
|
||||
int[][] matrixB = GenerateRandomMatrix(100, 100);
|
||||
MultiplyParallel(matrixA, matrixB, 16);
|
||||
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void MultiplySequential_300x300()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(300, 300);
|
||||
int[][] matrixB = GenerateRandomMatrix(300, 300);
|
||||
MultiplySequential(matrixA, matrixB);
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_300x300_4TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(300, 300);
|
||||
int[][] matrixB = GenerateRandomMatrix(300, 300);
|
||||
MultiplyParallel(matrixA, matrixB, 4);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_300x300_8TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(300, 300);
|
||||
int[][] matrixB = GenerateRandomMatrix(300, 300);
|
||||
MultiplyParallel(matrixA, matrixB, 8);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_300x300_16TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(300, 300);
|
||||
int[][] matrixB = GenerateRandomMatrix(300, 300);
|
||||
MultiplyParallel(matrixA, matrixB, 16);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplySequential_500x500()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(500, 500);
|
||||
int[][] matrixB = GenerateRandomMatrix(500, 500);
|
||||
MultiplySequential(matrixA, matrixB);
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_500x500_4TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(500, 500);
|
||||
int[][] matrixB = GenerateRandomMatrix(500, 500);
|
||||
MultiplyParallel(matrixA, matrixB, 4);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_500x500_8TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(500, 500);
|
||||
int[][] matrixB = GenerateRandomMatrix(500, 500);
|
||||
MultiplyParallel(matrixA, matrixB, 8);
|
||||
}
|
||||
[Benchmark]
|
||||
public void MultiplyParallel_500x500_16TH()
|
||||
{
|
||||
int[][] matrixA = GenerateRandomMatrix(500, 500);
|
||||
int[][] matrixB = GenerateRandomMatrix(500, 500);
|
||||
MultiplyParallel(matrixA, matrixB, 16);
|
||||
}
|
||||
private static int[][] GenerateRandomMatrix(int rows, int cols)
|
||||
{
|
||||
int[][] matrix = new int[rows][];
|
||||
|
||||
Random rand = new Random();
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
matrix[i] = new int[cols];
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
matrix[i][j] = rand.Next(1, 10);
|
||||
}
|
||||
}
|
||||
|
||||
return matrix;
|
||||
}
|
||||
}
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var summary = BenchmarkRunner.Run<MatrixMultiplication>();
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
# Отчёт по лабораторной работе №5
|
||||
|
||||
Выполнил: студент гр. ИСЭбд-41 Михайлов Ю.С.
|
||||
|
||||
## Запуск приложения
|
||||
|
||||
Было выбрано консольное приложение, язык программирования - C#.
|
||||
|
||||
Перемножение матриц обычным алгоритмом:
|
||||
```
|
||||
public static int[][] MultiplySequential(int[][] matrixA, int[][] matrixB)
|
||||
{
|
||||
int rowsA = matrixA.Length;
|
||||
int colsA = matrixA[0].Length;
|
||||
int colsB = matrixB[0].Length;
|
||||
|
||||
int[][] result = new int[rowsA][];
|
||||
|
||||
for (int i = 0; i < rowsA; i++)
|
||||
{
|
||||
result[i] = new int[colsB];
|
||||
|
||||
for (int j = 0; j < colsB; j++)
|
||||
{
|
||||
for (int k = 0; k < colsA; k++)
|
||||
{
|
||||
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
Перемножение матриц параллельным алгоритмом:
|
||||
```
|
||||
public static int[][] MultiplyParallel(int[][] matrixA, int[][] matrixB, int numThreads)
|
||||
{
|
||||
int rowsA = matrixA.Length;
|
||||
int colsA = matrixA[0].Length;
|
||||
int colsB = matrixB[0].Length;
|
||||
|
||||
int[][] result = new int[rowsA][];
|
||||
|
||||
Parallel.For(0, rowsA, new ParallelOptions { MaxDegreeOfParallelism = numThreads }, i =>
|
||||
{
|
||||
result[i] = new int[colsB];
|
||||
|
||||
for (int j = 0; j < colsB; j++)
|
||||
{
|
||||
for (int k = 0; k < colsA; k++)
|
||||
{
|
||||
result[i][j] += matrixA[i][k] * matrixB[k][j];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
## Результаты
|
||||
|
||||

|
||||
Вывод: если в матрице не слишком много элементов, обычный алгоритм работает быстрее. Параллельный алгоритм следует использовать для обработки большого количества данных. В сравнении с однопоточным алгоритмом, работа параллельного в несколько раз быстрее.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 34 KiB |
Reference in New Issue
Block a user