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:
commit
e3677ed302
63
kutygin_andrey_lab_1/.idea/workspace.xml
Normal file
63
kutygin_andrey_lab_1/.idea/workspace.xml
Normal 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
3
kutygin_andrey_lab_2/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
6
kutygin_andrey_lab_2/.idea/jpa-buddy.xml
Normal file
6
kutygin_andrey_lab_2/.idea/jpa-buddy.xml
Normal 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>
|
9
kutygin_andrey_lab_2/.idea/misc.xml
Normal file
9
kutygin_andrey_lab_2/.idea/misc.xml
Normal 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>
|
8
kutygin_andrey_lab_2/.idea/modules.xml
Normal file
8
kutygin_andrey_lab_2/.idea/modules.xml
Normal 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>
|
121
kutygin_andrey_lab_2/README.md
Normal file
121
kutygin_andrey_lab_2/README.md
Normal 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
|
18
kutygin_andrey_lab_2/docker-compose.yml
Normal file
18
kutygin_andrey_lab_2/docker-compose.yml
Normal 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 #том для папки результатов
|
11
kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
Normal file
11
kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml
Normal 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>
|
5
kutygin_andrey_lab_2/var/data/Firsttxt.txt
Normal file
5
kutygin_andrey_lab_2/var/data/Firsttxt.txt
Normal file
@ -0,0 +1,5 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
3
kutygin_andrey_lab_2/var/data/Secondtxt.txt
Normal file
3
kutygin_andrey_lab_2/var/data/Secondtxt.txt
Normal file
@ -0,0 +1,3 @@
|
||||
1
|
||||
2
|
||||
3
|
10
kutygin_andrey_lab_2/var/data/Thirdtxt.txt
Normal file
10
kutygin_andrey_lab_2/var/data/Thirdtxt.txt
Normal file
@ -0,0 +1,10 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
10
kutygin_andrey_lab_2/var/result/data.txt
Normal file
10
kutygin_andrey_lab_2/var/result/data.txt
Normal file
@ -0,0 +1,10 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
1
kutygin_andrey_lab_2/var/result/result.txt
Normal file
1
kutygin_andrey_lab_2/var/result/result.txt
Normal file
@ -0,0 +1 @@
|
||||
100.0
|
11
kutygin_andrey_lab_2/worker_1/Dockerfile
Normal file
11
kutygin_andrey_lab_2/worker_1/Dockerfile
Normal 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"]
|
40
kutygin_andrey_lab_2/worker_1/src/Main.java
Normal file
40
kutygin_andrey_lab_2/worker_1/src/Main.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
11
kutygin_andrey_lab_2/worker_2/Dockerfile
Normal file
11
kutygin_andrey_lab_2/worker_2/Dockerfile
Normal 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"]
|
50
kutygin_andrey_lab_2/worker_2/src/Main.java
Normal file
50
kutygin_andrey_lab_2/worker_2/src/Main.java
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user