Merge pull request 'kutygin_andrey_lab_2_ready' (#121) from kutygin_andrey_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/121
This commit is contained in:
Alexey 2024-01-17 11:50:07 +04:00
commit e3677ed302
17 changed files with 380 additions and 0 deletions

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2aWZgD9jVzSrrT33mt6jGLtpCOt" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"project.structure.last.edited": "Modules",
"project.structure.proportion": "0.15",
"project.structure.side.proportion": "0.2"
}
}]]></component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\kutyg\Downloads\pibd-22-internet-programming-Lab5 (1)\kutygin_andrey_lab_1" />
</key>
</component>
<component name="RunManager">
<configuration name="docker-compose.yml.rabbitmq: Compose Deployment" type="docker-deploy" factoryName="docker-compose.yml" temporary="true" server-name="Docker">
<deployment type="docker-compose.yml">
<settings>
<option name="services">
<list>
<option value="rabbitmq" />
</list>
</option>
<option name="sourceFilePath" value="docker-compose.yml" />
</settings>
</deployment>
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Docker.docker-compose.yml.rabbitmq: Compose Deployment" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="2825a2d7-cbe6-410f-9785-96603cbb0f02" name="Changes" comment="" />
<created>1704436409086</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1704436409086</updated>
</task>
<servers />
</component>
</project>

3
kutygin_andrey_lab_2/.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JpaBuddyIdeaProjectConfig">
<option name="renamerInitialized" value="true" />
</component>
</project>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="18" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="ProjectType">
<option name="id" value="jpab" />
</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$/kutygin_andrey_lab_2.iml" filepath="$PROJECT_DIR$/kutygin_andrey_lab_2.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,121 @@
**Задание**
***
Цель: изучение техники создания простого распределённого приложения.
**Задачи**
***
Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго.
Изучить файлы сборки образов docker и разработать их для созданных приложений.
Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
Правильно закоммитить результат без лишних файлов.
Оформить pull request по правилам и отправить его на проверку.
**Ход работы**
***
**Разворачивание сервисов:**
***
Были разработаны два приложения на java:
worker-1 - Формирует файл /var/result/data.txt из файла, где было найдено самое большое число /var/data.
worker-2 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.
**Исходные файлы**
Исходные файлы содержат целые числа.
В /var/result/data.txt проверяются числа из каждого файла и выбирается самое большое
**Firsttxt.txt:**
1
2
3
4
5
**Secondtxt.txt**
1
2
3
**Thirdtxt.txt**
1
2
3
4
5
6
7
8
9
10
В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10
**Dockerfile**
Для данной работы были созданы идентичные докер-файлы в обоих проектах.
````
FROM openjdk:17
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]
````
FROM - выбор базового образа
RUN - создание директории внутри контейнера
WORKDIR - установка рабочей директории для последующих команд
COPY - копирование содержимого директории внутрь контейнера
RUN - компиляция исходного кода Main.java внутри контейнера
CMD - определение команды, которая выполняется при запуске контейнера. В данном случае происходит запуск программы на java и указывается пусть до Main.java
**docker-compose.yml**
````
version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
worker1:
build:
context: /worker-1 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\data:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
worker2:
- depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
worker1
build:
context: /worker-2 #путь к контексту сборки
- dockerfile: Dockerfile #имя докерфайла
- volumes:
- .\var\result:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
````
Видео: https://disk.yandex.ru/d/jpeOKQ_PAO0c0Q

View File

@ -0,0 +1,18 @@
version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
worker1:
build:
context: /worker_1 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\data:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
worker2:
depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
- worker1
build:
context: /worker_2 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\result:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов

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,5 @@
1
2
3
4
5

View File

@ -0,0 +1,3 @@
1
2
3

View File

@ -0,0 +1,10 @@
1
2
3
4
5
6
7
8
9
10

View File

@ -0,0 +1,10 @@
1
2
3
4
5
6
7
8
9
10

View File

@ -0,0 +1 @@
100.0

View File

@ -0,0 +1,11 @@
FROM openjdk:17
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]

View File

@ -0,0 +1,40 @@
import java.io.*;
import java.nio.file.*;
//Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
public class Main {
private static Path findLargestFile(DirectoryStream<Path> stream) throws IOException {
long maxSize = 0;
Path largestFile = null;
for (Path file : stream) {
long size = Files.size(file);
if (size > maxSize) {
maxSize = size;
largestFile = file;
}
}
return largestFile;
}
public static void main(String[] args) {
Path dataDir = Path.of("/var/data");
Path resultDir = Path.of("/var/result");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dataDir)) {
Path largestFile = findLargestFile(stream);
if (largestFile != null) {
Files.createFile(resultDir.resolve("data.txt"));
Files.copy(largestFile, resultDir.resolve("data.txt"), StandardCopyOption.REPLACE_EXISTING);
System.out.println(largestFile.getFileName() + " перемещён");
} else {
System.out.println("Файл не найден");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,11 @@
FROM openjdk:17
RUN mkdir /var/data
RUN mkdir /var/result
WORKDIR /app
COPY src /app/src
RUN javac /app/src/Main.java
CMD ["java", "-cp", "/app/src", "Main"]

View File

@ -0,0 +1,50 @@
import java.io.*;
import java.nio.file.*;
import java.util.*;
//Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt.
public class Main {
public static void main(String[] args) {
Path dataFile = Path.of("/var/result/data.txt");
Path resultFile = Path.of("/var/result/result.txt");
try {
if (!Files.exists(dataFile)) {
System.out.println("Файл data.txt не существует");
return;
}
List<Integer> numbers = readNumbersFromFile(dataFile);
int maxNumber = findMaxNumber(numbers);
try (BufferedWriter writer = Files.newBufferedWriter(resultFile)) {
writer.write(String.valueOf(Math.pow(maxNumber,2)));
}
System.out.println("квадрат наибольшего числа " + Math.pow(maxNumber,2));
} catch (IOException e) {
e.printStackTrace();
}
}
private static List<Integer> readNumbersFromFile(Path dataFile) throws IOException {
List<Integer> numbers = new ArrayList<>();
try (BufferedReader reader = Files.newBufferedReader(dataFile)) {
String line;
while ((line = reader.readLine()) != null) {
numbers.add(Integer.parseInt(line));
}
}
return numbers;
}
private static int findMaxNumber(List<Integer> numbers) {
int maxNumber = Integer.MIN_VALUE;
for (int number : numbers) {
if (number > maxNumber) {
maxNumber = number;
}
}
return maxNumber;
}
}