gusev_vladislav_lab_2 #16
77
gusev_vladislav_lab_2/README.md
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
||||||
|
|
||||||
|
1) Согласно вашему варианту (выбирайте любой) разработать два приложения такие, что результат первого является исходными данными для второго.
|
||||||
|
2) Изучить файлы сборки образов docker и разработать их для созданных приложений.
|
||||||
|
3) Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
|
||||||
|
4) Правильно закоммитить результат без лишних файлов.
|
||||||
|
5) Оформить pull request по правилам и отправить его на проверку.
|
||||||
|
6)
|
||||||
|
# Варианты:
|
||||||
|
- Для Worker1: Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt.
|
||||||
|
- Для Worker2: Ищет набольшее число из файла /var/data/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
|
||||||
|
|
||||||
|
# Как запустить
|
||||||
|
Командой "docker-compose up -d"
|
||||||
|
|
||||||
|
# Работа программы
|
||||||
|
Для Worker1 создали следующий java файл:
|
||||||
|
|
||||||
|
![img.png](screens%2Fimg.png)
|
||||||
|
|
||||||
|
И следующий DockerFile:
|
||||||
|
|
||||||
|
![img_1.png](screens%2Fimg_1.png)
|
||||||
|
|
||||||
|
Для Worker2 создали следующий файл:
|
||||||
|
|
||||||
|
![img_2.png](screens%2Fimg_2.png)
|
||||||
|
|
||||||
|
И следующий DockerFile:
|
||||||
|
|
||||||
|
![img_3.png](screens%2Fimg_3.png)
|
||||||
|
|
||||||
|
Файлы с данными:
|
||||||
|
|
||||||
|
File1:
|
||||||
|
|
||||||
|
![img_4.png](screens%2Fimg_4.png)
|
||||||
|
|
||||||
|
File2:
|
||||||
|
|
||||||
|
![img_5.png](screens%2Fimg_5.png)
|
||||||
|
|
||||||
|
File3:
|
||||||
|
|
||||||
|
![img_6.png](screens%2Fimg_6.png)
|
||||||
|
|
||||||
|
Теперь создаем docker-compose файл:
|
||||||
|
|
||||||
|
![img_7.png](screens%2Fimg_7.png)
|
||||||
|
|
||||||
|
Запускаем в cmd с помощью docker-compose up -d:
|
||||||
|
|
||||||
|
![img_8.png](screens%2Fimg_8.png)
|
||||||
|
|
||||||
|
Образы:
|
||||||
|
|
||||||
|
![img_9.png](screens%2Fimg_9.png)
|
||||||
|
|
||||||
|
Контейнер:
|
||||||
|
|
||||||
|
![img_10.png](screens%2Fimg_10.png)
|
||||||
|
|
||||||
|
Файлы появились в папке:
|
||||||
|
|
||||||
|
![img_11.png](screens%2Fimg_11.png)
|
||||||
|
|
||||||
|
Файл data.txt:
|
||||||
|
|
||||||
|
![img_12.png](screens%2Fimg_12.png)
|
||||||
|
|
||||||
|
Файл result.txt:
|
||||||
|
|
||||||
|
![img_13.png](screens%2Fimg_13.png)
|
||||||
|
|
||||||
|
Наибольшее число 986 и число его вхождений равно 3, всё верно.
|
||||||
|
|
||||||
|
Видео -> https://drive.google.com/file/d/1Jt1wFrdweIrUhDn-MAA4RKYrktykOekw/view?usp=sharing
|
3
gusev_vladislav_lab_2/data/file1.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
123
|
||||||
|
456
|
||||||
|
789
|
10
gusev_vladislav_lab_2/data/file2.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
412
|
||||||
|
564
|
||||||
|
986
|
||||||
|
785
|
||||||
|
232
|
||||||
|
986
|
||||||
|
877
|
||||||
|
434
|
||||||
|
986
|
||||||
|
086
|
6
gusev_vladislav_lab_2/data/file3.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
111
|
||||||
|
222
|
||||||
|
333
|
||||||
|
444
|
||||||
|
555
|
||||||
|
666
|
17
gusev_vladislav_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
services:
|
||||||
|
worker1:
|
||||||
|
build:
|
||||||
|
context: /worker1
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- D:\java_labs\DAS\gusev_vladislav_lab_2\data:/var/data
|
||||||
|
- D:\java_labs\DAS\gusev_vladislav_lab_2\result:/var/result
|
||||||
|
worker2:
|
||||||
|
build:
|
||||||
|
context: /worker2
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- D:\java_labs\DAS\gusev_vladislav_lab_2\data:/var/data
|
||||||
|
- D:\java_labs\DAS\gusev_vladislav_lab_2\result:/var/result
|
||||||
|
depends_on:
|
||||||
|
- worker1
|
10
gusev_vladislav_lab_2/result/data.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
412
|
||||||
|
564
|
||||||
|
986
|
||||||
|
785
|
||||||
|
232
|
||||||
|
986
|
||||||
|
877
|
||||||
|
434
|
||||||
|
986
|
||||||
|
086
|
1
gusev_vladislav_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
3
|
BIN
gusev_vladislav_lab_2/screens/img.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
gusev_vladislav_lab_2/screens/img_1.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
gusev_vladislav_lab_2/screens/img_10.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
gusev_vladislav_lab_2/screens/img_11.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
gusev_vladislav_lab_2/screens/img_12.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
gusev_vladislav_lab_2/screens/img_13.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
gusev_vladislav_lab_2/screens/img_2.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
gusev_vladislav_lab_2/screens/img_3.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
gusev_vladislav_lab_2/screens/img_4.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
gusev_vladislav_lab_2/screens/img_5.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
gusev_vladislav_lab_2/screens/img_6.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
gusev_vladislav_lab_2/screens/img_7.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
gusev_vladislav_lab_2/screens/img_8.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
gusev_vladislav_lab_2/screens/img_9.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
29
gusev_vladislav_lab_2/worker1/.gitignore
vendored
Normal 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
|
3
gusev_vladislav_lab_2/worker1/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
6
gusev_vladislav_lab_2/worker1/.idea/misc.xml
Normal 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>
|
8
gusev_vladislav_lab_2/worker1/.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$/worker1.iml" filepath="$PROJECT_DIR$/worker1.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
gusev_vladislav_lab_2/worker1/.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
18
gusev_vladislav_lab_2/worker1/Dockerfile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Используем образ с Java
|
||||||
|
FROM openjdk:17
|
||||||
|
|
||||||
|
# Создаем директории для данных и результата внутри контейнера
|
||||||
|
RUN mkdir /var/data
|
||||||
|
RUN mkdir /var/result
|
||||||
|
|
||||||
|
# Создаем директорию приложения внутри контейнера
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
|
||||||
|
COPY src /app/src
|
||||||
|
|
||||||
|
# Компилируем Java-код
|
||||||
|
RUN javac /app/src/Worker1.java
|
||||||
|
|
||||||
|
# Запускаем Java-приложение
|
||||||
|
CMD ["java", "-cp", "/app/src", "Worker1"]
|
43
gusev_vladislav_lab_2/worker1/src/Worker1.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import java.io.*;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class Worker1 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String sourceDirectory = "/var/data";
|
||||||
|
String destinationDirectory = "/var/result";
|
||||||
|
|
||||||
|
try {
|
||||||
|
copyFileWithMostLines(sourceDirectory, destinationDirectory);
|
||||||
|
System.out.println("Файл успешно скопирован.");
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void copyFileWithMostLines(String sourceDirectory, String destinationDirectory) throws IOException {
|
||||||
|
Path sourceDir = Paths.get(sourceDirectory);
|
||||||
|
Path destDir = Paths.get(destinationDirectory);
|
||||||
|
|
||||||
|
// Поиск файла с наибольшим числом строк
|
||||||
|
Path fileWithMostLines = Files.walk(sourceDir)
|
||||||
|
.filter(Files::isRegularFile)
|
||||||
|
.max(Comparator.comparingLong(file -> {
|
||||||
|
try {
|
||||||
|
return Files.lines(file).count();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
|
if (fileWithMostLines != null) {
|
||||||
|
|
||||||
|
// Копирование файла
|
||||||
|
Files.copy(fileWithMostLines, Paths.get(destinationDirectory + "/data.txt"), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
} else {
|
||||||
|
System.out.println("Нет файлов для копирования.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
gusev_vladislav_lab_2/worker2/.gitignore
vendored
Normal 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
|
3
gusev_vladislav_lab_2/worker2/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
6
gusev_vladislav_lab_2/worker2/.idea/misc.xml
Normal 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>
|
8
gusev_vladislav_lab_2/worker2/.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$/worker2.iml" filepath="$PROJECT_DIR$/worker2.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
6
gusev_vladislav_lab_2/worker2/.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
18
gusev_vladislav_lab_2/worker2/Dockerfile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Используем образ с Java
|
||||||
|
FROM openjdk:17
|
||||||
|
|
||||||
|
# Создаем директории для данных и результата внутри контейнера
|
||||||
|
RUN mkdir /var/data
|
||||||
|
RUN mkdir /var/result
|
||||||
|
|
||||||
|
# Создаем директорию приложения внутри контейнера
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем исходные файлы вашего Java-приложения внутрь контейнера
|
||||||
|
COPY src /app/src
|
||||||
|
|
||||||
|
# Компилируем Java-код
|
||||||
|
RUN javac /app/src/Worker2.java
|
||||||
|
|
||||||
|
# Запускаем Java-приложение
|
||||||
|
CMD ["java", "-cp", "/app/src", "Worker2"]
|
47
gusev_vladislav_lab_2/worker2/src/Worker2.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
|
||||||
|
public class Worker2 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String sourceFilePath = "/var/result/data.txt";
|
||||||
|
String resultFilePath = "/var/result/result.txt";
|
||||||
|
|
||||||
|
try {
|
||||||
|
int maxNumberOccurrences = countMaxNumberOccurrences(sourceFilePath);
|
||||||
|
saveResult(resultFilePath, maxNumberOccurrences);
|
||||||
|
System.out.println("Результат сохранен в файле: " + resultFilePath);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int countMaxNumberOccurrences(String filePath) throws IOException {
|
||||||
|
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
|
||||||
|
int maxNumber = Integer.MIN_VALUE;
|
||||||
|
int maxNumberCount = 0;
|
||||||
|
String line;
|
||||||
|
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
int number = Integer.parseInt(line.trim());
|
||||||
|
|
||||||
|
if (number > maxNumber) {
|
||||||
|
maxNumber = number;
|
||||||
|
maxNumberCount = 1; // Новое максимальное число
|
||||||
|
} else if (number == maxNumber) {
|
||||||
|
maxNumberCount++; // Увеличиваем количество встреч максимального числа
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return maxNumberCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void saveResult(String filePath, int result) throws IOException {
|
||||||
|
String resultString = Integer.toString(result);
|
||||||
|
Files.write(Path.of(filePath), resultString.getBytes(), StandardOpenOption.CREATE);
|
||||||
|
}
|
||||||
|
}
|