Merge pull request 'martysheva_tamara_lab_2 is ready' (#50) from martysheva_tamara_lab_2 into main

Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/50
This commit is contained in:
Alexey 2023-12-28 10:55:03 +04:00
commit 5a1e7cb698
16 changed files with 236 additions and 0 deletions

View File

@ -0,0 +1,69 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
**Цель**: изучение техники создания простого распределённого приложения.
**Задачи**:
* Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго.
* Изучить файлы сборки образов docker и разработать их для созданных приложений.
* Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
* Правильно закоммитить результат без лишних файлов.
* Оформить pull request по правилам и отправить его на проверку.
***
## *Ход работы:*
### Разворачивание сервисов:
Были разработаны два приложения на ЯП java:
* worker1 - ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
* worker2 - ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt.
### Исходные файлы
Исходные файлы содержать различные числа и отсортированы по размеру.
В /var/result/data.txt должны скопироваться числа из наибольшего файла - 3.txt
В /var/result/result.txt должно записаться число 15 625 - квадрат максимального числа (125)
![](images/files.jpg "")
### 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"] #запуск java-приложения
```
### docker-compose.yml
Был создан файл docker-compose.yml для разворачивания сервисов:
```
version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
worker1:
build:
context: /worker1 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\data:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
worker2:
depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск
- worker1
build:
context: /worker2 #путь к контексту сборки
dockerfile: Dockerfile #имя докерфайла
volumes:
- .\var\result:/var/data #том для папки файлов
- .\var\result:/var/result #том для папки результатов
```
### docker-compose up -d
Создание контейнеров:
![](images/downloading.jpg "")
***
## *Результат:*
![](images/result-dockerhub.jpg "")
![](images/result-files.jpg "")

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1 @@
4

View File

@ -0,0 +1,5 @@
23
4
123
46
15

View File

@ -0,0 +1,15 @@
1
2
3
4
5
6
7
8
9
100
121
125
1
2
3

View File

@ -0,0 +1,15 @@
1
2
3
4
5
6
7
8
9
100
121
125
1
2
3

View File

@ -0,0 +1 @@
15625.0

Binary file not shown.

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"] #запуск java-приложения

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"] #запуск java-приложения

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;
}
}