diff --git a/dev/architecture/Брокер сообщений.md b/dev/architecture/Брокер сообщений.md new file mode 100644 index 00000000..14d2124d --- /dev/null +++ b/dev/architecture/Брокер сообщений.md @@ -0,0 +1,52 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-07-02 +--- +Брокеры способны обрабатывать 10000+ сообщений в секунду + +Для чего используются: +- Межсервисное общение +- Асинхронная запись логов приложения +- Тяжелые ассинхронные задачи + +Требования к брокерам: +- гарантия доставки сообщений + - at least once delivery. Гарантируется, что наше сообщение получит хотя бы один клиент. + - at most once delivery. Не гарантирует доставку. + - exactly once delivery. Гарантируется, что только один получатель получит сообщение. +- порядок передачи сообщений +- управление размером очереди +- зеркалирование +- масштабирование + +**Терминология:** +- Брокер - это приложение, которое реализует модель [AMQP](Advanced%20Message%20Queuing%20Protocol.md). Которое принимает соединения клиентов для маршрутизации сообщений и т.п. +- Сообщение (message) - это единица передаваемых данных. Включая мета-информацию. +- Потребитель (consumer) - приложение, которое читает сообщения из очереди. +- Производитель (producer) - приложение, которое отправляет сообщения в брокер. + +Примеры реализаций брокеров сообщений: +- [00 RabbitMQ](00%20RabbitMQ.md) +- [00 Kafka](00%20Kafka.md) +- [[../../../../_inbox/NATS|NATS]] +- [00 Redis](../../meta/zero/00%20Redis.md) (pub/sub, stream) + +![[../../meta/files/images/Pasted image 20241103222905.png]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Архитектура ИС|00 Архитектура ИС]] +**Родитель**:: +**Источник**:: +**Автор**:: +**Создана**:: [[2024-07-02]] +### Дополнительные материалы +- +### Дочерние заметки + + +- [[00 RabbitMQ]] +- [[Advanced Message Queuing Protocol]] +- [[NATS]] + diff --git a/dev/java/Class Loader Subsystem.md b/dev/java/Class Loader Subsystem.md new file mode 100644 index 00000000..3a721ecc --- /dev/null +++ b/dev/java/Class Loader Subsystem.md @@ -0,0 +1,39 @@ +--- +aliases: +tags: + - maturity/🌱 +date: "[[2023-11-06]]" +--- +## Тезисы +- Class Loader Subsystem — часть [[Java Virtual Machine|JVM]], ответственная за загрузку, связывание и инициализацию классов. +- Хранит информацию о загруженных классах и загружает скомпилированные файлы классов (Class Files) в память. +- [[gc/Garbage Collector|Сборка мусора]] здесь не производится, что может привести к `OutOfMemoryException` при создании большого количества классов "на лету". +- Основные этапы работы: загрузка, проверка, связывание и инициализация классов. +- Включает иерархию [[ClassLoader|Classloader]], что позволяет гибко управлять загрузкой и безопасностью классов. +*** + +Class Loader Subsystem — это часть [[Java Virtual Machine|JVM]], которая отвечает за управление процессом загрузки, связывания и инициализации классов. Здесь хранится информация о классах, которые были загружены в память. Он берет скомпилированные файлы классов (Class Files) и загружает их для использования в программе. + +Важно отметить, что [[gc/Garbage Collector|сборка мусора]] в этой части JVM не производится, поэтому при создании большого количества классов "на лету" существует риск получения ошибки `OutOfMemoryException`. + +**Основные этапы работы Class Loader Subsystem** +1. **Загрузка (Loading)**: На этом этапе Class Loader Subsystem находит и загружает файлы классов в память. Используются различные типы [[ClassLoader|Classloader]] (Bootstrap, Extension, Application), которые обеспечивают доступ к необходимым классам в зависимости от их принадлежности. +2. **Проверка (Verification)**: После загрузки классов выполняется проверка их корректности. Это необходимо для предотвращения потенциально опасного кода, который может нарушить работу JVM или привести к сбоям. Проверка включает анализ структуры байт-кода, соответствие стандартам Java и другие меры безопасности. +3. **Связывание (Linking)**: Этот этап включает несколько подпроцессов: + - **Подготовка (Preparation)**: Создаются статические поля классов и выделяется память под них, но не происходит их инициализация. + - **Разрешение (Resolution)**: Разрешаются ссылки на другие классы и их методы, чтобы JVM могла корректно работать с зависимостями между классами. +4. **Инициализация (Initialization)**: На этом этапе выполняются статические инициализаторы классов и инициализируются статические переменные. Это завершающий этап, который делает класс готовым к использованию. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: [[Архитектура JVM]] +**Источник**:: +**Автор**:: +**Создана**:: [[2023-11-06]] +### Дополнительные материалы +- +### Дочерние заметки + + +- [[ClassLoader]] + diff --git a/dev/java/ClassLoader.md b/dev/java/ClassLoader.md new file mode 100644 index 00000000..2ee9b890 --- /dev/null +++ b/dev/java/ClassLoader.md @@ -0,0 +1,95 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-11-04 +--- +## Тезисы +- Classloader — это компонент JVM, отвечающий за динамическую загрузку классов в память во время выполнения программы. +- Classloader выполняет загрузку, проверку, связывание и инициализацию классов. +- В Java существует иерархия Classloader: Bootstrap, Extension (Platform), и Application (System). +- Классы могут загружаться из нестандартных источников с использованием кастомного Classloader, что полезно для создания модульных систем или плагинов. +*** + +Classloader — это компонент [[Java Virtual Machine|JVM]], отвечающий за динамическую загрузку классов в память во время выполнения программы. В Java каждый класс должен быть загружен в память перед его использованием, и именно Classloader выполняет эту задачу. + +**Функции Classloader** +1. **Загрузка классов**: Classloader находит и загружает файлы классов (обычно с расширением `.class`) из classpath в память. +2. **Проверка классов**: После загрузки Classloader проверяет [[Java байт-код|байт-код]] класса для обеспечения его корректности и безопасности. +3. **Связывание классов**: Classloader связывает загруженные классы, включая проверку ссылок и разрешение символов. +4. **Инициализация классов**: Classloader инициализирует загруженные классы, вызывая их статические инициализаторы и инициализаторы переменных. + +**Иерархия Classloader** +- **Bootstrap ClassLoader**: Базовый загрузчик классов, встроенный в JVM. Он загружает основные классы Java из файла rt.jar, такие как классы из `java.lang`, `java.util` и других. Реализован на нативном языке и является частью ядра JVM. +- **Extension ClassLoader (Platform ClassLoader)**: Загружает классы из стандартных расширений Java, находящихся в директории `jre/lib/ext` или другой директории, определенной системным параметром `java.ext.dirs`. Обратите внимание, что директория `jre/lib/ext` используется в старых версиях Java, а более новые версии могут использовать другой подход. Сам загружается с помощью Bootstrap ClassLoader. +- **Application ClassLoader (System ClassLoader)**: Загружает классы приложения из директории classpath. Обычно это директория, указанная в переменной окружения `CLASSPATH` или параметре командной строки `-cp`. Используется для загрузки классов приложений и библиотек. + +Пример: +```java +public class Main { + public static void main(String[] args) { + ClassLoader classLoader = Main.class.getClassLoader(); + System.out.println("ClassLoader: " + classLoader); + + try { + Class aClass = classLoader.loadClass("Example"); + System.out.println("Class loaded: " + aClass.getName()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } +} +``` + +Этот пример демонстрирует, как можно использовать Classloader для динамической загрузки классов во время выполнения программы. Он полезен в случаях, когда классы могут быть неизвестны на этапе компиляции и должны быть загружены из внешних источников, например, при создании плагинов или модулей, добавляемых на лету. +## Кастомный Classloader +Можно создавать собственные Classloader, расширяя класс `java.lang.ClassLoader`, для загрузки классов из нестандартных источников (например, из базы данных, сети или зашифрованных архивов). Это может быть полезно, когда требуется загрузить обновляемые модули или плагины, которые могут меняться без необходимости перезапуска всей системы. Например, кастомный Classloader можно использовать для реализации системы плагинов, где плагины загружаются динамически по запросу пользователя. + +```java +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class CustomClassLoader extends ClassLoader { + + @Override + public Class findClass(String name) throws ClassNotFoundException { + try { + byte[] bytes = loadClassData(name); + return defineClass(name, bytes, 0, bytes.length); + } catch (IOException e) { + throw new ClassNotFoundException(name, e); + } + } + + private byte[] loadClassData(String name) throws IOException { + String path = name.replace('.', '/') + ".class"; + InputStream inputStream = Files.newInputStream(Paths.get(path)); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + int data; + while ((data = inputStream.read()) != -1) { + byteArrayOutputStream.write(data); + } + return byteArrayOutputStream.toByteArray(); + } +} +``` + +- Мы расширяем `ClassLoader` и переопределяем метод `findClass`. +- Метод `loadClassData` загружает данные класса из файла. +- Метод `defineClass` создает класс из байтового массива. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: [[Class Loader Subsystem|Class Loader Subsystem]] +**Источник**:: +**Создана**:: [[2024-11-04]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/java/Java байт-код.md b/dev/java/Java байт-код.md new file mode 100644 index 00000000..926341c5 --- /dev/null +++ b/dev/java/Java байт-код.md @@ -0,0 +1,22 @@ +--- +aliases: + - байт-кода + - байт-код +tags: + - maturity/🌱 +date: 2024-11-03 +--- +Байт-код является универсальным форматом, который можно запускать на любой платформе с установленной [[Java Virtual Machine|JVM]], что обеспечивает независимость от платформы +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-11-03]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md b/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md index 2fa6e0d3..ada5f856 100644 --- a/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md +++ b/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md @@ -10,27 +10,29 @@ linked: --- Конфигурация для подключения к мок-сервису авторизации по auth2. Полезно при локальной разработке, чтобы не цепляться к настоящему Oauth2 серверу. +- [The OAuth2 / OpenID Connect Mock | WireMock Cloud](https://docs.wiremock.io/oauth2-mock/) + ```yml -spring: - security: - oauth2: - client: - registration: - mocklab: - provider: mocklab - client-authentication-method: basic - authorization-grant-type: authorization_code - scope: profile, email - redirect-uri: http://localhost:8080/login/oauth2/code/ - clientId: mocklab_oidc - clientSecret: whatever - provider: - mocklab: - authorization-uri: https://oauth.mocklab.io/oauth/authorize - token-uri: https://oauth.mocklab.io/oauth/token - user-info-uri: https://oauth.mocklab.io/userinfo - user-name-attribute: sub - jwk-set-uri: https://oauth.mocklab.io/.well-known/jwks.json +spring: + security: + oauth2: + client: + registration: + mocklab: + provider: mocklab + client-authentication-method: client_secret_basic + authorization-grant-type: authorization_code + scope: profile, email + redirect-uri: http://localhost:8080/login/oauth2/code/ + clientId: mocklab_oidc + clientSecret: whatever + provider: + mocklab: + authorization-uri: https://oauth.wiremockapi.cloud/oauth/authorize + token-uri: https://oauth.wiremockapi.cloud/oauth/token + user-info-uri: https://oauth.wiremockapi.cloud/userinfo + user-name-attribute: sub + jwk-set-uri: https://oauth.wiremockapi.cloud/.well-known/jwks.json ``` *** ## Мета информация diff --git a/meta/files/images/Pasted image 20241103222905.png b/meta/files/images/Pasted image 20241103222905.png new file mode 100644 index 00000000..0e76ae67 Binary files /dev/null and b/meta/files/images/Pasted image 20241103222905.png differ diff --git a/meta/files/images/Pasted image 20241103223030.png b/meta/files/images/Pasted image 20241103223030.png new file mode 100644 index 00000000..4fcef149 Binary files /dev/null and b/meta/files/images/Pasted image 20241103223030.png differ diff --git a/meta/files/images/comp/Pasted image 20241103222905.png b/meta/files/images/comp/Pasted image 20241103222905.png new file mode 100644 index 00000000..886b96e4 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103222905.png differ diff --git a/meta/files/images/comp/Pasted image 20241103222905.png.md5 b/meta/files/images/comp/Pasted image 20241103222905.png.md5 new file mode 100644 index 00000000..17dbcac9 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103222905.png.md5 @@ -0,0 +1 @@ +05aecda3a3d7c26f6f0be944cf043a0e diff --git a/meta/files/images/comp/Pasted image 20241103223030.png b/meta/files/images/comp/Pasted image 20241103223030.png new file mode 100644 index 00000000..2c0829d4 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241103223030.png differ diff --git a/meta/files/images/comp/Pasted image 20241103223030.png.md5 b/meta/files/images/comp/Pasted image 20241103223030.png.md5 new file mode 100644 index 00000000..d14bd665 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241103223030.png.md5 @@ -0,0 +1 @@ +7d913f0a8a063775d75a3745a3995198 diff --git a/meta/files/images/webp/Pasted image 20241103222905.webp b/meta/files/images/webp/Pasted image 20241103222905.webp new file mode 100644 index 00000000..d58c38ac Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103222905.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103222905.webp.md5 b/meta/files/images/webp/Pasted image 20241103222905.webp.md5 new file mode 100644 index 00000000..17dbcac9 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103222905.webp.md5 @@ -0,0 +1 @@ +05aecda3a3d7c26f6f0be944cf043a0e diff --git a/meta/files/images/webp/Pasted image 20241103223030.webp b/meta/files/images/webp/Pasted image 20241103223030.webp new file mode 100644 index 00000000..4e0b4910 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241103223030.webp differ diff --git a/meta/files/images/webp/Pasted image 20241103223030.webp.md5 b/meta/files/images/webp/Pasted image 20241103223030.webp.md5 new file mode 100644 index 00000000..d14bd665 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241103223030.webp.md5 @@ -0,0 +1 @@ +7d913f0a8a063775d75a3745a3995198