Merge pull request 'savenkov_alexander_lab_2 is ready' (#8) from savenkov_alexander_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/8
This commit is contained in:
Alexey 2023-10-28 11:19:00 +04:00
commit 512453aa79
39 changed files with 413 additions and 0 deletions

View File

@ -0,0 +1,105 @@
# Лабораторная работа №2 - Разработка простейшего распределенного приложения
Цель: изучение техники создания простого распределенного приложения.
Задачи:
- Согласно вышему варианту (выбирайте любой) разработать два приложения такие, что результат первого является исходными данными для второго.
- Изучить файлы сборки образов docker и разработать их для созданных приложений.
- Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
- Правильно закоммитить результат без лишних файлов.
- Оформить pull request по правилам и отправить его на проверку.
# Разработка двух приложений
Вариант первого приложения(worker-1): 5 - Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt
Вариант второго приложения(worker_2) 1 - Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt
Приложения выполнены на языке Java
<p>
<div>Worker-1</div>
<img src="screens/img1.png" width="650" title="Worker-1">
</p>
<p>
<div>Worker-2</div>
<img src="screens/img2.png" width="650" title="Worker-2">
</p>
# Запуск
Запуск контейнеров производится командой "docker-compose up -d"
# Работа программы
- Создание двух деррикторий: worker-1 и worker-2 для реализаций двух программ.
- Описание Dockerfile для создания образов для обоих программ.
<p>
<div>Worker-1 Dockerfile</div>
<img src="screens/img3.png" width="650" title="Worker-1 Dockerfile">
</p>
<p>
<div>Worker-2 Dockerfile</div>
<img src="screens/img4.png" width="650" title="Worker-2 Dockerfile">
</p>
- Создание двух репозиториев: data, result, для монтирования их в контейнеры.
<p>
<div>data</div>
<img src="screens/img5.png" width="650" title="data">
</p>
<p>
<div>result</div>
<img src="screens/img6.png" width="650" title="result">
</p>
<p>
<div>f3.txt</div>
<img src="screens/img7.png" width="650" title="f3.txt">
</p>
<p>
<div>file_with_a_very_long_name_that_is_often_used_in_programming.txt</div>
<img src="screens/img8.png" width="650" title="file_with_a_very_long_name_that_is_often_used_in_programming.txt">
</p>
<p>
<div>file1.txt</div>
<img src="screens/img9.png" width="650" title="file1.txt">
</p>
- Описание docker-compose: запускает контейнеры, реализует build для создания образов на основе dockerfile и у второго контейнера описавыется зависимость depends_on от первого контейнера, чтобы сначала запустился первый контейнер, а за ним запустился второй. Также описываются volumes, для монтирование папок data и result в контейнеры.
<p>
<div>docker-compose</div>
<img src="screens/img10.png" width="650" title="docker-compose">
</p>
<p>
<div>Сборка и запуска контейнеров</div>
<img src="screens/img11.png" width="650" title="Сборка и запуска контейнеров">
</p>
<p>
<div>Проверка в Docker Desktop контейнеров и образов</div>
<img src="screens/img12.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
</p>
<p>
<img src="screens/img13.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
</p>
<p>
<div>Смотрим, что выдает нам первый воркер в консоль</div>
<img src="screens/img14.png" width="650" title="Смотрим, что выдает нам первый воркер в консоль">
</p>
<p>
<div>Смотрим, что выдает нам второй воркер в консоль</div>
<img src="screens/img15.png" width="650" title="Смотрим, что выдает нам второй воркер в консоль">
</p>
<p>
<div>Смотрим, что при запуске контейнеров действительно в папке result создалось два файла data.txt и result.txt</div>
<img src="screens/img16.png" width="650" title="Смотрим, что при запуске контейнеров действительно в папке result создалось два файла data.txt и result.txt">
</p>
<p>
<div>Смотрим, что лежит в файле data.txt</div>
<img src="screens/img17.png" width="650" title="Смотрим, что лежит в файле data.txt">
</p>
<p>
<div>Смотрим, что лежит в файле result.txt</div>
<img src="screens/img18.png" width="650" title="Смотрим, что лежит в файле result.txt">
</p>
# Видео
Видео с разбором лабораторной работы - https://youtu.be/o_sTok7W22s

View File

@ -0,0 +1,9 @@
987
654
321
876
543
210
765
432
100

View File

@ -0,0 +1,9 @@
456
789
123
987
345
678
234
567
890

View File

@ -0,0 +1,9 @@
123
456
789
234
567
890
345
678
901

View File

@ -0,0 +1,17 @@
services:
worker-1:
build:
context: /worker-1
dockerfile: Dockerfile
volumes:
- D:\Git-RViP\savenkov_alexander_lab_2\data:/var/data
- D:\Git-RViP\savenkov_alexander_lab_2\result:/var/result
worker-2:
build:
context: /worker-2
dockerfile: Dockerfile
volumes:
- D:\Git-RViP\savenkov_alexander_lab_2\data:/var/data
- D:\Git-RViP\savenkov_alexander_lab_2\result:/var/result
depends_on:
- worker-1

View File

@ -0,0 +1,9 @@
987
654
321
876
543
210
765
432
100

View File

@ -0,0 +1 @@
974169.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/worker-1.iml" filepath="$PROJECT_DIR$/worker-1.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,18 @@
# Используем образ с Java
FROM openjdk:21
# Создаем директории для данных и результата внутри контейнера
RUN mkdir /var/data
RUN mkdir /var/result
# Создаем директорию приложения внутри контейнера
WORKDIR /app
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
COPY src /app/src
# Компилируем Java-код
RUN javac /app/src/FileMover.java
# Запускаем Java-приложение
CMD ["java", "-cp", "/app/src", "FileMover"]

View File

@ -0,0 +1,50 @@
import java.io.IOException;
import java.nio.file.*;
import java.util.List;
public class FileMover {
public static void main(String[] args) {
String sourceDirectory = "/var/data";
String destinationDirectory = "/var/result";
String resultFile = destinationDirectory + "/data.txt";
try {
// Получаем список файлов в исходной директории
List<Path> files = getFilesInDirectory(sourceDirectory);
if (!files.isEmpty()) {
// Находим файл с самым коротким именем
Path shortestFileName = findShortestFileName(files);
// Копируем найденный файл в целевую директорию
Files.copy(shortestFileName, Paths.get(resultFile), StandardCopyOption.REPLACE_EXISTING);
System.out.println("Файл " + shortestFileName.getFileName() + " был скопирован в " + resultFile);
} else {
System.out.println("В исходной директории нет файлов для копирования.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<Path> getFilesInDirectory(String directory) throws IOException {
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(directory))) {
List<Path> fileList = new java.util.ArrayList<>();
for (Path entry : stream) {
fileList.add(entry);
}
return fileList;
}
}
private static Path findShortestFileName(List<Path> files) {
Path shortestFile = files.get(0);
for (Path file : files) {
if (file.getFileName().toString().length() < shortestFile.getFileName().toString().length()) {
shortestFile = file;
}
}
return shortestFile;
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/worker-2.iml" filepath="$PROJECT_DIR$/worker-2.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,18 @@
# Используем образ с Java
FROM openjdk:21
# Создаем директории для данных и результата внутри контейнера
RUN mkdir /var/data
RUN mkdir /var/result
# Создаем директорию приложения внутри контейнера
WORKDIR /app
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
COPY src /app/src
# Компилируем Java-код
RUN javac /app/src/LargestNumberSquare.java
# Запускаем Java-приложение
CMD ["java", "-cp", "/app/src", "LargestNumberSquare"]

View File

@ -0,0 +1,44 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class LargestNumberSquare {
public static void main(String[] args) {
String sourceFilePath = "/var/result/data.txt";
String resultFilePath = "/var/result/result.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath))) {
String line;
double largestNumber = Double.MIN_VALUE;
while ((line = reader.readLine()) != null) {
try {
double number = Double.parseDouble(line);
if (number > largestNumber) {
largestNumber = number;
}
} catch (NumberFormatException e) {
// Пропускаем строки, которые не могут быть преобразованы в числа
}
}
if (largestNumber != Double.MIN_VALUE) {
double square = Math.pow(largestNumber, 2);
try (FileWriter writer = new FileWriter(resultFilePath)) {
writer.write(Double.toString(square));
}
System.out.println("Наибольшее число в файле: " + largestNumber);
System.out.println("Вторая степень наибольшего числа: " + square);
System.out.println("Результат сохранен в " + resultFilePath);
} else {
System.out.println("Файл не содержит чисел.");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>