This commit is contained in:
parent
5c31e845f5
commit
fed7b2b637
52
dev/architecture/Брокер сообщений.md
Normal file
52
dev/architecture/Брокер сообщений.md
Normal 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 -->
|
39
dev/java/Class Loader Subsystem.md
Normal file
39
dev/java/Class Loader Subsystem.md
Normal 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
95
dev/java/ClassLoader.md
Normal 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) -->
|
||||
|
22
dev/java/Java байт-код.md
Normal file
22
dev/java/Java байт-код.md
Normal 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) -->
|
||||
|
@ -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
|
||||
```
|
||||
***
|
||||
## Мета информация
|
||||
|
BIN
meta/files/images/Pasted image 20241103222905.png
Normal file
BIN
meta/files/images/Pasted image 20241103222905.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1019 KiB |
BIN
meta/files/images/Pasted image 20241103223030.png
Normal file
BIN
meta/files/images/Pasted image 20241103223030.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 775 KiB |
BIN
meta/files/images/comp/Pasted image 20241103222905.png
Normal file
BIN
meta/files/images/comp/Pasted image 20241103222905.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 212 KiB |
@ -0,0 +1 @@
|
||||
05aecda3a3d7c26f6f0be944cf043a0e
|
BIN
meta/files/images/comp/Pasted image 20241103223030.png
Normal file
BIN
meta/files/images/comp/Pasted image 20241103223030.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 157 KiB |
@ -0,0 +1 @@
|
||||
7d913f0a8a063775d75a3745a3995198
|
BIN
meta/files/images/webp/Pasted image 20241103222905.webp
Normal file
BIN
meta/files/images/webp/Pasted image 20241103222905.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 240 KiB |
@ -0,0 +1 @@
|
||||
05aecda3a3d7c26f6f0be944cf043a0e
|
BIN
meta/files/images/webp/Pasted image 20241103223030.webp
Normal file
BIN
meta/files/images/webp/Pasted image 20241103223030.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
@ -0,0 +1 @@
|
||||
7d913f0a8a063775d75a3745a3995198
|
Loading…
Reference in New Issue
Block a user