Обновление
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-11-04 19:12:20 +03:00
parent 5c31e845f5
commit fed7b2b637
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
15 changed files with 234 additions and 20 deletions

View File

@ -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]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[00 RabbitMQ]]
- [[Advanced Message Queuing Protocol]]
- [[NATS]]
<!-- SerializedQuery END -->

View File

@ -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]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[ClassLoader]]
<!-- SerializedQuery END -->

95
dev/java/ClassLoader.md Normal file
View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,22 @@
---
aliases:
- байт-кода
- байт-код
tags:
- maturity/🌱
date: 2024-11-03
---
Байт-код является универсальным форматом, который можно запускать на любой платформе с установленной [[Java Virtual Machine|JVM]], что обеспечивает независимость от платформы
***
## Мета информация
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-03]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -10,6 +10,8 @@ linked:
--- ---
Конфигурация для подключения к мок-сервису авторизации по auth2. Полезно при локальной разработке, чтобы не цепляться к настоящему Oauth2 серверу. Конфигурация для подключения к мок-сервису авторизации по auth2. Полезно при локальной разработке, чтобы не цепляться к настоящему Oauth2 серверу.
- [The OAuth2 / OpenID Connect Mock | WireMock Cloud](https://docs.wiremock.io/oauth2-mock/)
```yml ```yml
spring: spring:
security: security:
@ -18,7 +20,7 @@ spring:
registration: registration:
mocklab: mocklab:
provider: mocklab provider: mocklab
client-authentication-method: basic client-authentication-method: client_secret_basic
authorization-grant-type: authorization_code authorization-grant-type: authorization_code
scope: profile, email scope: profile, email
redirect-uri: http://localhost:8080/login/oauth2/code/ redirect-uri: http://localhost:8080/login/oauth2/code/
@ -26,11 +28,11 @@ spring:
clientSecret: whatever clientSecret: whatever
provider: provider:
mocklab: mocklab:
authorization-uri: https://oauth.mocklab.io/oauth/authorize authorization-uri: https://oauth.wiremockapi.cloud/oauth/authorize
token-uri: https://oauth.mocklab.io/oauth/token token-uri: https://oauth.wiremockapi.cloud/oauth/token
user-info-uri: https://oauth.mocklab.io/userinfo user-info-uri: https://oauth.wiremockapi.cloud/userinfo
user-name-attribute: sub user-name-attribute: sub
jwk-set-uri: https://oauth.mocklab.io/.well-known/jwks.json jwk-set-uri: https://oauth.wiremockapi.cloud/.well-known/jwks.json
``` ```
*** ***
## Мета информация ## Мета информация

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

View File

@ -0,0 +1 @@
05aecda3a3d7c26f6f0be944cf043a0e

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View File

@ -0,0 +1 @@
7d913f0a8a063775d75a3745a3995198

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

View File

@ -0,0 +1 @@
05aecda3a3d7c26f6f0be944cf043a0e

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

View File

@ -0,0 +1 @@
7d913f0a8a063775d75a3745a3995198