Developer's Sandbox
Kanalga Telegramβda oβtish
ΠΠΏΡΡ ΠΈ ΡΠ°ΠΌΠΎΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΡΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π‘Π²ΡΠ·Ρ Ρ Π°Π²ΡΠΎΡΠΎΠΌ: @alpa1479
Ko'proq ko'rsatish1 059
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kun
Ma'lumot yo'q30 kun
Postlar arxiv
1 059
π₯ ΠΡΠΎ Π±Π°Π·Π° Ρ 1700 Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ Ρ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π° Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. Π€ΠΈΡΠΊΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΈΡΠ°Π½Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ Π±ΡΠ΄Π΅Π½ Π·Π°Π΄Π°Π½ ΠΈ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΎΡΠ²Π΅ΡΠΎΠ². Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΡΠ΅Ρ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ²ΡΠΈΡΡ ΠΊ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ π
1 059
β Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Spring Boot ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ?
π± Spring Boot β open-source ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎΠ΄, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ Π»ΠΈΡΡ Π·Π° Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ convention over configuration ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Ρ, Spring Boot ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΊΠΎΠ΄. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
β ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ² spring-boot-starter-actuator Π² Maven/Gradle ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°
β ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ² flyway-core ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ² ΡΠ°ΠΉΠ»Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ db/migration, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ
β ΠΠ° ΡΡΠ΅Ρ ΡΠ΅Π³ΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ?
ΠΠ° ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ
ΠΠ²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ β ΠΎΠ±ΡΡΠ½ΡΠΉ Π±ΠΈΠ½, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ Configuration ΠΈΠ»ΠΈ Autoconfiguration ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ Π² ΡΠ°ΠΉΠ»Π΅ META-INF/spring.factories [Π΄ΠΎ Π²Π΅ΡΡΠΈΠΈ 2.7] ΠΈΠ»ΠΈ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import [c Π²Π΅ΡΡΠΈΠΈ 2.7]
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΈΠΌΠ΅Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Spring Boot Starter
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Ρ Π² Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ starter, ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ΄ Π°Π²ΡΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ½Ρ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ, Π·Π°Π΄ΡΠΌΠ°Π½Π½ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ
Π Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Conditional Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌ, ΡΠ°ΠΊΠ°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΊΠΎΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
β ConditionalOnMissingBean ΡΠΎΠ·Π΄Π°ΡΡ Π±ΠΈΠ½, Π΅ΡΠ»ΠΈ Π½Π΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
β ConditionalOnProperty ΡΠΎΠ·Π΄Π°ΡΡ Π±ΠΈΠ½ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² application.yaml
β Π§ΡΠΎ Π΅ΡΠ΅ Π΅ΡΡΡ?
Spring Boot ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ BOM [Bill Of Materials] spring-boot-dependencies, ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ
ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ Π²Π΅ΡΡΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ
ΠΡΠΎ Π΄Π°Π΅Ρ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ²Π½ΠΎ Π²Π΅ΡΡΠΈΠΈ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² Maven/Gradle
Π Π½Π°ΡΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΠ Π±ΡΠ»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°. Π― Π²ΡΠ½Π΅Ρ ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΠ΄ Π² starter ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ API ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ:
π JDBC
π‘ jOOQ
π¦ MyBatis
πͺ Hibernate
π± Spring JDBC
π± Spring Data JDBC
π± Spring Data JPA
#sandbox #java_database_tools_starter
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox
1 059
π₯ ΠΡΠΎ Π±Π°Π·Π° Ρ 1700 Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ Ρ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π° Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. Π€ΠΈΡΠΊΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΈΡΠ°Π½Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ Π±ΡΠ΄Π΅Π½ Π·Π°Π΄Π°Π½ ΠΈ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΎΡΠ²Π΅ΡΠΎΠ². Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΡΠ΅Ρ, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ²ΡΠΈΡΡ ΠΊ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ π
1 059
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΏΠΎΡΡΠΎΠΌ Ρ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ Π½ΡΠ°Π½ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ Π² ΡΠ°ΠΌΠΎΠΌ ΠΏΠΎΡΡΠ΅.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·-Π·Π° ΠΎΠ±ΡΠ΅ΠΌΠ° Π»ΠΈΠ±ΠΎ Π½Π΅ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Ρ ΡΠΎΠ·Π΄Π°Π» ΡΠ°Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΎ Π½ΡΠ°Π½ΡΠ°Ρ
[ΠΊΠ°ΠΊ ΡΡΠΎ-ΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈΠ»ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ] Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ°ΡΠ΅, Π²Π΅Π΄Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΡΠ΅Π»ΡΠΉ ΠΏΠΎΡΡ
β ΠΠ°ΠΊ Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Ρ?
β ΠΠ½ΠΎΠ½ΡΡ ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡΠ΄ΡΡΠΈΡ
ΠΏΠΎΡΡΠΎΠ²
β ΠΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π΄Π°Π²Π°ΡΡ Π²ΠΎΠΏΡΠΎΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ
β ΠΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Π½Π° ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ [ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ, Π° Π½ΡΠ°Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΠΏΠΈΡΠ°ΡΡ, Π±ΡΠ΄Ρ Π²ΡΠ΄Π΅Π»ΡΡΡ ΡΠ΅Π³Π°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΉΡΠΈ]
ΠΠ΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π» ΠΎΠ΄ΠΈΠ½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ Π΄ΠΎΠΊΠ»Π°Π΄, ΠΈ ΠΌΠΎΠΉ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠ΅ΡΠΊΠ°Π· ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠ°ΠΌ Π΄ΠΎΠΊΠ»Π°Π΄ ΠΊΠ°ΠΊ ΡΠ°Π· Π±ΡΠ΄ΡΡ Π² ΡΠ°ΡΠ΅
ΠΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡΠ΅ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ β π¦ Developer's Chat
1 059
Π ΠΏΡΠΎΡΠ»ΡΠΉ ΡΠ°Π· ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ β JDBC, Spring JDBC, Hibernate ΠΈ Spring Data JPA.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ β Spring Data JDBC, MyBatis, JOOQ.
π± Spring Data JDBC β ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ORM ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΎΡ Spring. ΠΠ½ΡΡΡΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Hibernate, Π° ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ JdbcTemplate.
ΠΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ [Id, Column, MappedColleΡtion ΠΈ Ρ.Π΄.] Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ org.springframework.data.annotation.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ SQL Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
β ΠΠ°ΠΊΠΈΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ ΠΎΡ Hibernate?
β ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΠ·ΡΠΊ Π·Π°ΠΏΡΠΎΡΠΎΠ² [Π½Π΅Ρ JPQL, ΡΠΎΠ»ΡΠΊΠΎ SQL]
β ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ Lazy Loading [one-to-many ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΡΡΠ°Π·Ρ, Π²ΠΌΠ΅ΡΡΠ΅ Ρ N+1 ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ]
β ΠΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ [Π½Π΅ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ. ΠΡΠΆΠ½ΠΎ ΡΠ²Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ]
β ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏ Identity Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ id [ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Sequence, UUID Π½ΡΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΌΠΈΠΌ]
β ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Batch ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ [ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ²ΠΎΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ]
ΠΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ DDD [Domain-Driven Design], ΠΈ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Aggregate ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
β ΠΠ΅Ρ ΡΠ²Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ many-to-one [ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ id ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ ΡΡΡΠ½ΠΎΡΡΠΈ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ AggregateReference]
β ΠΠ΅Ρ ΡΠ²Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ many-to-many [Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΡΠ½ΠΎΡΡΡ]
β ΠΠ°ΡΠΊΠ°Π΄Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠ° [ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠ°, Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°ΡΡΡΡ]
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
π¦ MyBatis β persistence framework. ΠΠΌΠ΅Π΅Ρ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ API, ΡΠ΅ΠΌ Spring Data JDBC/JPA, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ, ΡΠ΅ΠΌ JDBC/Spring JDBC.
β ΠΠ°ΠΊΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ?
β Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ POJO [Plain Old Java Object]
β ΠΠΌΠ΅ΡΡΠΎ Repository ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Mapper [ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ SQL]
β ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ XML Π»ΠΈΠ±ΠΎ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ
β ΠΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠ΄Π°, Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠΈΠΉ ΠΏΡΠΎΡΡΠΎΠΉ CRUD ΠΈ ΡΠ°ΠΌΠΈ ΡΡΡΠ½ΠΎΡΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΠ
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
π‘ jOOQ [java Object Oriented Querying] β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΠ°Ρ DSL [Domain Specific Language] Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ SQL Π² ΡΠΎΡΠΌΠ°ΡΠ΅ type safe ΡΠ΅ΡΠ΅Π· fluent API.
β ΠΠ°ΠΊΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ?
β ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΡΡΠ½ΠΎΡΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΠ, Π° ΡΠ°ΠΊΠΆΠ΅ DAO ΠΊΠ»Π°ΡΡΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ Π³ΠΎΡΠΎΠ²ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
β ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π³ΠΈΠ±ΠΊΠΎ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ [ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ equals, hashCode. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΠΈ JPA ΠΈ Spring Context ΠΈ Ρ.Π΄.]
β ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ² ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΡ [Π΅ΡΠ»ΠΈ ΠΈΡ
Π½Π°Π·Π²Π°ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΈΡΠ»Π΅, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ. ΠΡΠΏΡΠ°Π²ΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· ΡΠ²ΠΎΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ]
β ΠΠ½ΠΎΠ³Π΄Π° ΡΠΎΠ²ΠΌΠ΅ΡΠ°ΡΡ Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌΠΈ Spring Data JDBC/JPA
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
#sandbox #java_database_tools
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox
1 059
ΠΠΎΠ²ΠΎΠ³ΠΎΠ΄Π½ΠΈΠ΅ ΠΏΡΠ°Π·Π΄Π½ΠΈΠΊΠΈ Π²Π½Π΅ΡΠ»ΠΈ ΡΠ²ΠΎΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΈ ΡΡΠΎ-ΡΠΎ "ΠΡΠ΄Ρ ΡΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΎΠ΄Π½Ρ/Π΄Π²Π΅ ΡΡΠ°ΡΡΠΈ Π² Π½Π΅Π΄Π΅Π»Ρ" Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ π«
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
Apache Kafka
β ΠΠΎΡΠ΅ΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΡ
?
ΠΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ², ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ
UI Π΄Π»Ρ Apache Kafka, ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ
:
1β£ UI for Apache Kafka, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² ΠΌΠΎΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
2β£ AKHQ
3β£ Confluent Control Centre
4β£ Offset Explorer
5β£ Kafka IDEA Plugin
ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ ΠΎΠΏΡΡΡ, Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π΅ΡΡΡ Web UI, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π±ΡΡΡ ΠΏΡΡΠΌΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, Π° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠ°ΠΊΠΈΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π΅ Π±ΡΠ΄Π΅Ρ
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ, Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠΌΠ΅ΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈΡ
ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π° Π΅ΡΠ»ΠΈ ΠΈ ΡΠΌΠ΅ΡΡ, ΡΠΎ ΠΏΠ»Π°ΡΠ½ΠΎ
ΠΠΎΡΡΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌ, Π° ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ
:
1β£ Kafka tools β ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π²Ρ
ΠΎΠ΄ΡΡΠΈΠ΅ Π² ΡΠΎΡΡΠ°Π² ΡΠ°ΠΌΠΎΠΉ Apache Kafka
2β£ Kcat β ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° Kafka tools, ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ:
π kafka-configs.sh
β ΠΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ»Π½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π±ΡΠΎΠΊΠ΅ΡΠ°/ΡΠΎΠΏΠΈΠΊΠ°
β ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π±ΡΠΎΠΊΠ΅ΡΠ°/ΡΠΎΠΏΠΈΠΊΠ°
β Π£Π΄Π°Π»ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ±ΡΠΎΡΠΈΡΡ Π΄ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π±ΡΠΎΠΊΠ΅ΡΠ°/ΡΠΎΠΏΠΈΠΊΠ°
π kafka-topics.sh
β ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
ΡΠΎΠΏΠΈΠΊΠΎΠ²
β ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΡΠΎΠΏΠΈΠΊΡ
β Π‘ΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΏΠΈΠΊ Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ
β Π£Π²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΎΠΏΠΈΠΊΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΡΠΈΡΠΈΠΉ
β Π£Π΄Π°Π»ΠΈΡΡ ΡΠΎΠΏΠΈΠΊ
β Π£Π΄Π°Π»ΠΈΡΡ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠΏΠΈΠΊΠ΅
π kafka-delete-records.sh
β Π£Π΄Π°Π»ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠΏΠΈΠΊΠ΅ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ offset'a
π kafka-console-consumer.sh
β ΠΡΠΎΡΠΈΡΠ°ΡΡ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ consumer-group
β ΠΡΠΎΡΠΈΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ ΠΈ offset'a
π kafka-console-producer.sh
β ΠΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΡ key,value,headers
β ΠΡΠ»ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΡΡ kafka-console-consumer ΠΈ kafka-console-producer, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΏΠΈΠΊΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ [ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ· DLT Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ, ΡΡΠΎΠ±Ρ Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ]
π kafka-consumer-groups.sh
β ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΡΠ΅Ρ
/ΠΎΠ΄Π½ΠΎΠΉ consumer group
β ΠΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ»Π°Π½ ΠΏΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΡ offset'a Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ consumer group
β Π‘Π±ΡΠΎΡΠΈΡΡ offset Π΄ΠΎ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° ΠΈΠ»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ consumer group
π kafka-log-dirs.sh
β ΠΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΠ±ΡΠ΅ΠΌΠ΅ Π΄Π°Π½Π½ΡΡ
Π² ΡΠΎΠΏΠΈΠΊΠ΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎ
π kafka-run-class.sh
β ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ offset Π² ΡΠΎΠΏΠΈΠΊΠ΅
β Π‘Π΄Π΅Π»Π°ΡΡ partition log dump
π kafka-reassign-partitions.sh
β Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ reassigning plan, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠ°ΡΡΠΈΡΠΈΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅
π kafka-producer-perf-test.sh
β ΠΡΠΎΠ²Π΅ΡΡΠΈ Π½Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Producer'a ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΡΠ΅Ρ
π kafka-consumer-perf-test.sh
β ΠΡΠΎΠ²Π΅ΡΡΠΈ Π½Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Consumer'a ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΡΠ΅Ρ
Π ΡΡΠΎ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ. Π― ΠΏΡΠΈΠ²Π΅Π» Π»ΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΈΡ
ΡΠ°ΠΌΠΈ, ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π° πGithub, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ quick-start.md
ΠΠΎ Π½ΠΎΠ²ΡΡ
Π²ΡΡΡΠ΅Ρ!
#sandbox_kafka #cheatsheet #console_tools
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox
1 059
ΠΠ°ΡΡΡΠΏΠ°Π΅Ρ 2024 Π³ΠΎΠ΄ β₯οΈ
Π₯ΠΎΡΡ ΠΏΠΎΠΆΠ΅Π»Π°ΡΡ Π²ΡΠ΅ΠΌ ΡΡΠΏΠ΅Ρ
ΠΎΠ² Π² ΠΠΎΠ²ΠΎΠΌ ΠΠΎΠ΄Ρ! ππ
Π’Π΅ΠΌ, ΠΊΡΠΎ ΠΈΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ - Π½Π°ΠΉΡΠΈ Π΅Π΅ ΠΈ ΡΡΠ°ΡΡ ΡΠ°ΡΡΡΡ Ρ
ΠΎΡΠΎΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ π
Π’Π΅ΠΌ, ΠΊΡΠΎ ΡΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ - ΠΏΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΊΠΎΠΌΡΠΎΡΡΠ½ΡΡ
ΡΡΠΎΠΊΠΎΠ² π
ΠΠ°ΠΊΠΎΠΉ Π±Ρ ΡΡΠΎΠ²Π΅Π½Ρ Π·Π½Π°Π½ΠΈΠΉ Π½ΠΈ Π±ΡΠ», ΠΌΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΡΠΈΡΡΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΎΠΏΡΡ, Π° ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡ ΠΈΠΌ, ΠΌΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΌ Π²ΡΠ΅ΠΌΡ ΠΈ ΡΠΈΠ»Ρ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π° β
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²Π°Ρ Π·Π° ΡΠΎ, ΡΡΠΎ ΡΠΈΡΠ°Π΅ΡΠ΅ ΡΡΠΎΡ ΠΊΠ°Π½Π°Π», ΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ! π±
Π ΠΏΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ ΠΠ°Ρ Ρ Π½Π°ΡΡΡΠΏΠ°ΡΡΠΈΠΌ 2024 Π³ΠΎΠ΄ΠΎΠΌ!βοΈ
βββ
ΠΠ΅Π±ΠΎΠ»ΡΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°:
ΠΠ°Π½Π°Π» ΡΠΎΠ·Π΄Π°Π½ 14.06.2022
ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΡ Ρ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» 15.07.2023, Π²ΡΡΠ»ΠΎ, ΡΡΠΎ ΠΎΡ ΠΈΠ΄Π΅ΠΈ Π΄ΠΎ Π½Π°ΡΠ°Π»Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅Π» Π³ΠΎΠ΄ ΠΈ 1 ΠΌΠ΅ΡΡΡ
ΠΠ° ΡΠ΅Π³ΠΎΠ΄Π½ΡΡΠ½ΠΈΠΉ Π΄Π΅Π½Ρ '31.12.2023', Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ 28 ΠΏΠΎΡΡΠΎΠ² ΠΈ 41 ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° πGithub, ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΠ΅ΠΌΡΡ ΠΠ΅Π½Ρ
βββ
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅:
Π IDEA Π΅ΡΡΡ Run Configurations, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠ»ΠΈΠΊΡ Π½Π°ΡΡΡΠΎΠΈΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ, ΠΈ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π² ΡΠ°ΠΉΠ»
Π’.Π΅. ΠΊΠΎΠ³Π΄Π° ΠΊΡΠΎ-ΡΠΎ ΡΠ΅ΡΠ΅Π· IDEA ΠΎΡΠΊΡΠΎΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Ρ Π½Π΅Π³ΠΎ Π΄ΠΎΡΡΡΠΏΠ½Ρ
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΈΡ
Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ:
π¦ sandbox
βοΈ sandbox-java
π± sandbox-spring-context
π± sandbox-web
π sandbox-postgresql
π± sandbox-spring-data-jpa
π sandbox-kafka
ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ πsandbox-kafka, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠ»ΠΈΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π±ΡΠΎΠΊΠ΅ΡΠΎΠΌ, Π»ΠΈΠ±ΠΎ Ρ Π΄Π²ΡΠΌΡ, Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³, ΠΈ Π΅ΡΠ΅, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊ confluentinc image, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ β bitnami ΠΈ wurstmeister
1 059
β ΠΠ°ΠΊΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΈΠΏΡ ΡΠ²ΡΠ·Π΅ΠΉ Π² JPA?
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅, ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΠΎ ΡΠΈΠΏΠ°Ρ
ΡΠ²ΡΠ·Π΅ΠΉ Π² ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ
ΠΠ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡ
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² JPA, Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π°ΡΠ΅ΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ β ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π³Π΄Π΅ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄Π²Π΅ ΡΡΡΠ½ΠΎΡΡΠΈ β Author ΠΈ Book
ΠΠ°ΡΠ½Π΅ΠΌ Ρ One to One, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΄Π²ΡΠΌΡ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
1β£ Π§Π΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ MapsId [ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅]
2β£ Π§Π΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ OneToOne:
// Book.class
@OneToOne
// Annotation @JoinColumn(name = "author_id", nullable = false, unique = true) can be skipped,
// because of default name mapping
private Author author;
β Π ΡΡΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ Author?
ΠΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ ΠΌΡ Π²Π½ΠΎΠ²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Ρ SQL. Π’ΠΎΠ³Π΄Π°, Π·Π½Π°Ρ id ΡΡΡΠ½ΠΎΡΡΠΈ Author, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠ°ΠΊ ΡΠ°ΠΌΠΎΠ³ΠΎ Π°Π²ΡΠΎΡΠ°, ΡΠ°ΠΊ ΠΈ Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Ρ. [Π°Π²ΡΠΎΡΠ° ΠΏΠΎ id, Π° ΠΊΠ½ΠΈΠ³Ρ ΠΏΠΎ author_id].
Π’Π΅ΠΏΠ΅ΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ JPA. ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π½Π΅ΡΡ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠ»Π°ΡΡ Book Π² ΠΊΠ»Π°ΡΡΠ΅ Author, ΡΠΎ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΠ°ΠΌΠΎΠ³ΠΎ Π°Π²ΡΠΎΡΠ° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ, Π° Π²ΠΎΡ Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Ρ β Π½Π΅Ρ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΡΠ·Ρ ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ Author:
// Author.class
/*
* One Author to One Book
* Bidirectional relationship
* Owner of the relationship is Book [because books table contains foreign key to authors table],
* linked by 'author' field in Book class
*/
@OneToOne(mappedBy = "author")
private Book book;
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π² JPA Π²ΡΠ΄Π΅Π»ΡΡΡ Π΄Π²Π° ΡΠΈΠΏΠ° ΡΠ²ΡΠ·Π΅ΠΉ:
1β£ Unidirectional β ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ Ρ owning side [ΡΠΎΡ, ΠΊΡΠΎ ΠΈΠΌΠ΅Π΅Ρ foreign key, Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β Book.class]
2β£ Bidirectional β ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΅ΡΠ΅Π· unowned side [ΡΠΎΡ, Π½Π° ΠΊΠΎΠ³ΠΎ ΡΡΡΠ»Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· foreign key, Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β Author.class], ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ owning side [Book.class]. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ mappedBy, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ»Π΅ ΠΈΠ· owning side [Book.class], ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· foreign key Π½Π° unowned side [Author.class].
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Bidirectional ΡΠ²ΡΠ·ΠΈ, ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
β Π ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
equals, hashCode, toString, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ java.lang.StackOverflowError
β ΠΡΠ»ΠΈ ΠΌΡ ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ unowned side, Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ owning side, ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΎΡΠΎΠ²Π°Π½Ρ Ρ ΠΠ
β ΠΠ»Ρ write ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Bidirectional setter'Ρ, ΡΡΠΎΠ±Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΡΠ°Π²Π°Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½ΡΠΌΠΈ Π² ΠΠ
Unidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Bidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
One to Many ΠΈ Many to One:
// Book.class
@ManyToOne
// Annotation @JoinColumn(name = "author_id", nullable = false) can be skipped,
// because of default name mapping
private Author author;
// Author.class
/*
* One Author to Many Books
* Bidirectional relationship
* Owner of the relationship is Book [because books table contains foreign key to authors table],
* linked by 'author' field in Book class
*/
@OneToMany(mappedBy = "author")
private Set<Book> books;
Hibernate Π½Π΅ ΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ OneToMany Π±Π΅Π· ManyToOne, ΠΎ ΡΠ΅ΠΌ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
Unidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Bidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Many to Many:
// Book.class
@ManyToMany
@JoinTable(
name = "books_authors",
joinColumns = @JoinColumn(name = "book_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "author_id", nullable = false)
)
private Set<Author> authors;
}
// Author.class
/*
*
* Many Authors to Many Books
* Bidirectional relationship
* Owner of the relationship is Book,
* linked by 'authors' field in Book class. If required, Author can be owner side
*/
@ManyToMany(mappedBy = "authors")
private Set<Book> books;
ΠΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎ ΡΠ²ΡΠ·ΡΠΌΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ
, ΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Entity. ΠΠ± ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ
ΠΎΡΠΎΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
Unidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Bidirectional ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
#sandbox_spring_data_jpa #relationships
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox1 059
β ΠΠ°ΠΊ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ JDBC Π½Π°ΡΡΡΠΎΠΈΡΡ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SQL Π·Π°ΠΏΡΠΎΡΠΎΠ²?
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ORM Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΠ°ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ SQL Π·Π°ΠΏΡΠΎΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π² ΠΠ, ΡΡΠΎΠ±Ρ Π²ΠΎΠ²ΡΠ΅ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΡΡΠ°Π²Π½ΠΈΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ Π·Π°ΠΏΡΠΎΡ Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ
ΠΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΆΠ΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π΄Π»Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ SQL Π·Π°ΠΏΡΠΎΡΠ°, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π΅Π³ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ β DBeaver, DataGrip, pgAdmin, ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ Π΅Π³ΠΎ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ
πͺ Hibernate ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° show_sql, format_sql, highlight_sql, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ORMβΠΎΠΌ SQL Π·Π°ΠΏΡΠΎΡ Π² ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅
ΠΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π»ΠΎΠ³Π³Π΅Ρ β org.hibernate.orm.jdbc.bind: trace, ΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π΅ΡΠ΅ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π½ΠΎ Π² Π½ΡΠΆΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»ΡΡΡ ΠΈΡ
ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ
β ΠΠ°ΠΊΠΈΠ΅ Π΅ΡΡΡ Π΅ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ?
ΠΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ SQL Π·Π°ΠΏΡΠΎΡΠ° ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° πGithub. ΠΠ° ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ:
1β£ Connection URL Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
2β£ SQL Π·Π°ΠΏΡΠΎΡ Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
3β£ ResultSet Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°
4β£ Json ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ±ΠΎΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· ResultSetβa Π² ΡΡΡΠ½ΠΎΡΡΡ
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΈΡ
, Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ
ΠΎΠΆΠΈΡ
Π»ΠΎΠ³ΠΎΠ², Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²:
1β£ log4jdbc β proxy Π΄Π»Ρ JDBC Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. ΠΠΎΠ³ΠΈΡΡΠ΅Ρ SQL Π·Π°ΠΏΡΠΎΡ Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΈ Π²ΡΠ΅ΠΌΡ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
2β£ log4jdbc-remix β ΡΠΎΡΠΊ log4jdbc ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΠΈΠΉ ΡΠΎΡ ΡΠ°ΠΌΡΠΉ Π²ΡΠ²ΠΎΠ΄ ResultSet'a Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π±Π»ΠΈΡΡ. ΠΡΠ» ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² log4jdbc-log4j2 ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°Π±ΡΠΎΡΠ΅Π½. ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
3β£ p6spy β Π±ΠΎΠ»Π΅Π΅ ΠΌΠ°ΡΡΡΠ°Π±Π½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΈ formatter'Ρ, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ ΡΠ΅ΡΠ΅Π· spy.properties. ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
4β£ datasource-proxy β ΠΎΡΠΎΠ±ΡΡ
ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² Π½Π°Π΄ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Hibernate Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΠ», Π½ΠΎ ΡΠ²ΠΎΡ Π·Π°Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ. ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
#sandbox #java_database_tools
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox
1 059
Π₯ΠΎΡΠ΅Π» Π½Π°ΠΏΠΈΡΠ°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΎ ΡΠΈΠΏΠ°Ρ
ΡΠ²ΡΠ·Π΅ΠΉ Π² ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ
ΠΠ, ΠΈ ΠΊΠ°ΠΊ ΠΈΡ
ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² JPA
ΠΠ΄Π½Π°ΠΊΠΎ Π² ΠΎΠ΄Π½Ρ ΡΡΠ°ΡΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΊΠΎΠ΄Π° Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ»ΠΎΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΠ» Π½Π° Π΄Π²Π΅ ΡΡΠ°ΡΡΠΈ ΠΈ ΡΠΎΠ·Π΄Π°Π» ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ:
π sandbox-postgresql
π± sandbox-spring-data-jpa
ΠΡΠ»ΠΈ Π² ΡΡΠ°ΡΡΠ΅ SQL ΠΊΠΎΠ΄ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Telegram.
β ΠΠ°ΠΊΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΈΠΏΡ ΡΠ²ΡΠ·Π΅ΠΉ Π² ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΡ
ΠΠ?
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π½Π°ΡΠ΅ΠΉ Π»ΡΠ±ΠΈΠΌΠΎΠΉ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ β ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
Π£ Π½Π°Ρ Π±ΡΠ΄ΡΡ Π΄Π²Π΅ ΡΡΡΠ½ΠΎΡΡΠΈ β ΠΠ½ΠΈΠ³Π°, ΠΠ²ΡΠΎΡ
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π½Π°ΡΠΈΡ
ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΡΡΠΎΠΈΡΡ Π½ΡΠΆΠ½ΡΡ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ½ΠΎΡΡΡΠΌΠΈ
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅:
Π Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π°Π²ΡΠΎΡ. Π ΡΠ°ΠΊΠΆΠ΅, ΡΡΠΎΠ±Ρ Π°Π²ΡΠΎΡ ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΊΠ½ΠΈΠ³Ρ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½ΡΡ
Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ One to One [ΡΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ βΠΎΠ΄ΠΈΠ½ Π°Π²ΡΠΎΡ β ΠΎΠ΄Π½Π° ΠΊΠ½ΠΈΠ³Π°β]:
CREATE TABLE authors
(
id BIGSERIAL NOT NULL PRIMARY KEY,
name VARCHAR(64) NOT NULL
);
CREATE TABLE books
(
id BIGSERIAL NOT NULL PRIMARY KEY,
title VARCHAR(128) NOT NULL,
author_id BIGINT NOT NULL UNIQUE REFERENCES authors (id)
);
ΠΠ΄Π΅ΡΡ Π²Π°ΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ UNIQUE constraint, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π° ΠΏΠΎΠ»Π΅ author_id, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π½ΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π²ΡΠΎΡΠ°.
Π’Π°ΠΊΠΆΠ΅ Π²ΠΌΠ΅ΡΡΠΎ author_id, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ book_id Π² ΡΠ°Π±Π»ΠΈΡΠ΅ authors, ΠΈ Π½Π°ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ, ΠΊΡΠΎ Π±ΡΠ΄Π΅Ρ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠ²ΡΠ·ΠΈ, Book ΠΈΠ»ΠΈ Author [ΠΎΠ± ΡΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π² ΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎ Spring Data JPA, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΊΡΠ°ΡΠΊΠΎ, ΡΠΎΡ Ρ ΠΊΠΎΠ³ΠΎ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ foreign key]
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅:
Π Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π°Π²ΡΠΎΡ. ΠΠ΄Π½Π°ΠΊΠΎ, Π°Π²ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΊΠ½ΠΈΠ³.
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ One to Many [ΡΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ βΠΎΠ΄ΠΈΠ½ Π°Π²ΡΠΎΡ β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠ½ΠΈΠ³β]
ΠΠ½ΠΎΠ³Π΄Π° Π²ΡΠ΄Π΅Π»ΡΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Many to One [ΡΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ βΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠ½ΠΈΠ³ β ΠΎΠ΄ΠΈΠ½ Π°Π²ΡΠΎΡβ], ΡΠ°Π·Π½ΠΈΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ Π½Π΅ΡΡ, ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅Π½ΡΠ΅ΠΌ Π°ΠΊΡΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΡΠΎ Ρ ΡΠ΅ΠΌ ΡΠ²ΡΠ·Π°Π½ΠΎ
CREATE TABLE authors
(
id BIGSERIAL NOT NULL PRIMARY KEY,
name VARCHAR(64) NOT NULL
);
CREATE TABLE books
(
id BIGSERIAL NOT NULL PRIMARY KEY,
title VARCHAR(128) NOT NULL,
author_id BIGINT NOT NULL REFERENCES authors (id)
);
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ One to One ΠΈ One to Many, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π½Π΅ΡΡ UNIQUE constraint Π΄Π»Ρ ΠΏΠΎΠ»Ρ author_id
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ book_id Π² ΡΠ°Π±Π»ΠΈΡΠ΅ authors Π²ΠΌΠ΅ΡΡΠΎ author_id Π² ΡΠ°Π±Π»ΠΈΡΠ΅ books, ΡΠΎ Π½Π°ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΎΠ³Π΄Π° Π°Π²ΡΠΎΡ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΊΠ½ΠΈΠ³Ρ
[ΠΠΎΡΡΠΎΠΌΡ Π² JPA Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ManyToOne Π½Π΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° mappedBy, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡΡΠ½ΠΎΡΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΡΠ²ΡΠ·ΠΈ, Ρ.Π΅. ΠΈΠΌΠ΅Π΅Ρ foreign key Π½Π° Π΄ΡΡΠ³ΡΡ ΡΡΡΠ½ΠΎΡΡΡ]
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅:
Π Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±ΡΠ»ΠΎ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ Π°Π²ΡΠΎΡΠΎΠ². Π ΡΠ°ΠΊΠΆΠ΅, Π°Π²ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΊΠ½ΠΈΠ³.
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
ΠΠ΄Π΅ΡΡ Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Many to Many [ΡΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ βΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π°Π²ΡΠΎΡΠΎΠ² β ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠ½ΠΈΠ³β]:
CREATE TABLE authors
(
id BIGSERIAL NOT NULL PRIMARY KEY,
name VARCHAR(64) NOT NULL
);
CREATE TABLE books
(
id BIGSERIAL NOT NULL PRIMARY KEY,
title VARCHAR(128) NOT NULL
);
CREATE TABLE books_authors
(
id BIGSERIAL NOT NULL PRIMARY KEY,
book_id BIGINT NOT NULL REFERENCES books (id),
author_id BIGINT NOT NULL REFERENCES authors (id),
UNIQUE (book_id, author_id)
);
Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° books_authors, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠ°Ρ Π½ΡΠΆΠ½ΡΠ΅ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ½ΠΎΡΡΡΠΌΠΈ
ΠΠ΅ ΡΡΠΎΠΈΡ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π±ΡΠ²Π°ΡΡ ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ UNIQUE constraintβa Π½Π° ΡΠ²ΡΠ·Ρ book_id ΠΈ author_id, ΡΡΠΎΠ±Ρ ΡΠ²ΡΠ·Ρ Π±ΡΠ»Π° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠΉ
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
#sandbox_postgresql #relationships
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox1 059
ΠΠΎΡΠ»Π΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ²Π°, Ρ Π²Π΅ΡΠ½ΡΠ»ΡΡ Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ΠΉ. ΠΡΠ΄Ρ ΡΡΠ°ΡΠ°ΡΡΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΎΠ΄Π½Ρ/Π΄Π²Π΅ ΡΡΠ°ΡΡΠΈ Π² Π½Π΅Π΄Π΅Π»Ρ.
ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ JDBC, Spring JDBC, Hibernate ΠΈ Spring Data JPA. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π°Π³Π»ΡΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ²ΡΡΠ°Π»ΡΡ ΡΡΠΎΠ²Π΅Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΠ Π² Java ΠΌΠΈΡΠ΅.
β ΠΠ°ΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ?
CRUD Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΡΠ½ΠΎΡΡΡΡ Book ΠΈ Π΅Π΅ ΡΠ²ΡΠ·ΡΠΌΠΈ β Author, Comment, Genre
Π Π΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ API Π΄Π»Ρ:
1β£ ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΊΠ½ΠΈΠ³ ΠΈ Π΅Π΅ ΡΠ²ΡΠ·Π΅ΠΉ
2β£ ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ id ΠΈ Π΅Π΅ ΡΠ²ΡΠ·Π΅ΠΉ
3β£ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ ΡΠ²ΡΠ·Π΅ΠΉ
4β£ ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ ΡΠ²ΡΠ·Π΅ΠΉ
5β£ Π£Π΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π² ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΆΠ°Π½ΡΠ°Ρ
ΠΠΎΠ΄Π΅Π»Ρ Π΄Π°Π½Π½ΡΡ
ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ:
1β£ books β Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ
2β£ authors β Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ± Π°Π²ΡΠΎΡΠ°Ρ
. Π‘ books βone-to-oneβ
3β£ genres β Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΆΠ°Π½ΡΠ°Ρ
4β£ comments β Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
ΠΊ ΠΊΠ½ΠΈΠ³Π°ΠΌ. Π‘ books βone-to-manyβ
5β£ books_genres β ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ βmany-to-manyβ ΠΌΠ΅ΠΆΠ΄Ρ books ΠΈ genres
ΠΠ°ΡΠ½Π΅ΠΌ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ²Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ:
π JDBC [Java Database Connectivity] β ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠ³ΠΎ API Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΡΠΌΠΈ ΠΠ ΠΈΠ· Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΡ
ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠ°Π² Java SE.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ API ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ JDBC Π΄ΡΠ°ΠΉΠ²Π΅Ρ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ PostgresSQL Π΅ΡΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ postgresql-42.6.0.jar, Π²Π½ΡΡΡΠΈ Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ PgResultSet, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ java.sql.ResultSet ΠΈΠ· JDBC ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ SQL Π·Π°ΠΏΡΠΎΡΠ°, Π½ΡΠΆΠ½ΠΎ:
1β£ ΠΠΎΠ»ΡΡΠΈΡΡ Connection
2β£ Π‘ΠΎΠ·Π΄Π°ΡΡ Statement, ΠΏΠ΅ΡΠ΅Π΄Π°Π² SQL Π·Π°ΠΏΡΠΎΡ Π² Π²ΠΈΠ΄Π΅ String
3β£ ΠΡΠ»ΠΈ ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ, ΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· .set ΠΌΠ΅ΡΠΎΠ΄Ρ Π² Statementβe
4β£ ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ResultSet
5β£ Π Π°Π·ΠΎΠ±ΡΠ°ΡΡ ResultSet, ΠΏΠΎΠ»ΡΡΠΈΠ² ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Book, Author, Comment, Genre
6β£ ΠΠ°ΠΊΡΡΡΡ ResultSet
7β£ ΠΠ°ΠΊΡΡΡΡ Statement
8β£ ΠΠ°ΠΊΡΡΡΡ Connection
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
π± Spring JDBC β Π½Π°Π±ΠΎΡ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΉ, ΡΠΏΡΠΎΡΡΡΡΠΈΠΉ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ JDBC. Π§ΡΠΎΠ±Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°Π³ΠΎΠ² ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΌΠΎΠΌΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Transactional Π΄Π»Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΉ, ΠΊΠ»Π°ΡΡ NamedParameterJdbcOperations Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ².
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ Connection ΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Statement ΠΈ ResultSet. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ResultSet'a Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
πͺ Hibernate β ORM [Object Relational Mapping] ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ. Π Π΅Π°Π»ΠΈΠ·ΡΠ΅Ρ JPA ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ. ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΎΡ ΡΠ΅Π»ΡΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΡ Π² ΠΠΠ ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΡ.
ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ ΠΈΠ· ΠΠ ΠΊΠ°ΠΊ Ρ Java ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. Π£Π±ΠΈΡΠ°Π΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° ResultSet'ΠΎΠ². ΠΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠΈΠ΅ HQL [Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ JPA Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ JPQL], ΠΊΠ°ΠΊ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ², Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΠ.
ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ N+1 ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ
ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ
ΠΊΠ°ΠΌΠ½Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ORM ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π» ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ SQL.
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
π± Spring Data JPA β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ Π½Π°Π΄ JPA. ΠΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Hibernate ΠΊΠ°ΠΊ JPA ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠ²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ½ΡΡΠΈΠ΅ Repository ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°, ΡΠ±ΠΈΡΠ°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠΈΡΡΠ°ΡΠΈΡΡ
ΠΏΠΈΡΠ°ΡΡ Π΄Π°ΠΆΠ΅ JPQL. ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ ΡΠ΅ ΠΆΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ ΡΡΠΎ ΠΈ Hibernate [Π² ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ JPA].
ΠΡΠΈΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° πGithub
#sandbox #java_database_tools
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @developer_sandbox
1 059
ΠΠ»Π°Π½ΠΈΡΡΡ Π²ΡΠ±ΡΠ°ΡΡ Π½ΠΎΠ²ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°Π½Π°Π»Π°, ΡΡΠΎ Π΄ΡΠΌΠ°Π΅ΡΠ΅?
1 059
ΠΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ Ρ Π²Π°Ρ Π±ΡΠ»ΠΎ?
1 059
β Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ delivery semantics Π² Apache Kafka?
Delivery semantics [delivery guarantees, processing guarantees] β ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Ρ.Π΅. ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±ΡΠ΄ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ Producer, Broker ΠΈ Consumer Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡ
Π΅ΠΌΡ. Π£ Π½Π°Ρ Π΅ΡΡΡ:
1β£ Kafka Cluster Ρ Π»ΡΠ±ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ BrokerβΠΎΠ²
2β£ Producer β ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΠ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ
Π² Π²ΠΈΠ΄Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ BrokerβΡ Π² demo.topic
3β£ Consumer β ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ Π½Π° demo.topic, Π΅ΡΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΡΠ»ΠΎ, ΡΠΎ ΡΠΈΡΠ°Π΅Ρ Π΅Π³ΠΎ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΠ
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π΅Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΠ Ρ Consumerβa ΠΈ Producerβa
ΠΠΎΡΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΡΠ°Π³ΠΎΠ²:
Π¨Π°Π³ 1. Producer ΡΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΠ
Π¨Π°Π³ 2. Producer ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Brokerβy Π² demo.topic
Π¨Π°Π³ 3. Broker ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² demo.topicβe
Π¨Π°Π³ 4. Broker ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ Producerβa, ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Ρ ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΎ [acknowledgment]
Π¨Π°Π³ 5. Consumer ΡΠΈΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· demo.topicβa
Π¨Π°Π³ 6. Consumer ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ Brokerβa, ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ [offset commit]
Π¨Π°Π³ 7. Consumer ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΠ
β Π§ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΉΡΠΈ Π½Π΅ ΡΠ°ΠΊ?
ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΡΠ±ΠΎΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
β ΠΠ°ΠΊΠΎΠ½ΡΠΈΠ»Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ β OutOfMemoryError
β ΠΠ°ΠΊΠΎΠ½ΡΠΈΠ»ΠΎΡΡ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅
β ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ±ΠΎΠΉ Π² ΡΠ΅ΡΠΈ
β Π‘Π»ΡΡΠΈΠ»ΡΡ timeout, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π¨Π°Π³ 3 β Broker ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ ΡΠΎΡ
ΡΠ°Π½ΡΠ» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π² ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠΉΠ΄Π΅Ρ Π½Π΅ ΡΠ°ΠΊ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ°Π·Π½ΡΠ΅ delivery semantics.
βοΈ Delivery semantics Π΄Π»Ρ Producerβa:
1β£ At most once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 1 ΡΠ°Π·. Producer ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ ΠΆΠ΄Π΅Ρ ΠΎΡ Brokerβa acknowledgment, Π° Π΅ΡΠ»ΠΈ Broker Π½Π΅ ΡΠΌΠΎΠ³ Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°ΡΡ, ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ, ΠΎΠ½ΠΎ ΡΡΠ΅ΡΡΠ½ΠΎ. ΠΡΠΈΠ½ΡΠΈΠΏ βfire-and-forgetβ.
2β£ At least once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 1 ΡΠ°Π·. Producer ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΆΠ΄Π΅Ρ acknowledgment, Π° Π΅ΡΠ»ΠΈ Broker Π½Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» acknowledgment, ΡΠΎ Producer Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
Π’ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, Π΅ΡΠ»ΠΈ Broker Π·Π°ΠΏΠΈΡΠ°Π» ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π²ΡΡΠ΅Π» ΠΈΠ· ΡΡΡΠΎΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ acknowledgmentβa, ΠΈ ΠΊΠΎΠ³Π΄Π° Broker Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΈ Producer ΠΏΠ΅ΡΠ΅ΠΎΡΠΏΡΠ°Π²ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΠΌΡ ΠΏΠΎ ΡΡΡΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ, ΡΠΎΡ
ΡΠ°Π½ΠΈΠ² Π² Brokerβe Π΄Π²Π°ΠΆΠ΄Ρ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
3β£ Exactly once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ 1 ΡΠ°Π·. Producer ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΆΠ΄Π΅Ρ acknowledgment, Π° Π΅ΡΠ»ΠΈ Broker Π½Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» acknowledgment, ΡΠΎ Producer Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΈ Π΅ΡΠ»ΠΈ Broker ΡΠΏΠ°Π΄Π΅Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ acknowledgmentβa ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ, ΠΎΠ½ ΡΡΠΎ ΠΏΠΎΠΉΠΌΠ΅Ρ ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π²Π°ΠΆΠ΄Ρ. ΠΠ΄Π΅ΡΡ ΠΌΡ Π½Π΅ ΡΠ΅ΡΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΡ.
βοΈ Delivery semantics Π΄Π»Ρ Consumerβa:
1β£ At most once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 1 ΡΠ°Π·. Consumer ΡΠΈΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Brokerβa ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
Π£ Π½Π°Ρ Π¨Π°Π³ 7, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Consumer ΡΠΏΠ°Π»ΠΎ Ρ OOM ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ΄Π½ΡΠ»ΠΎΡΡ, Π½ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ²Π°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Ρ
ΠΎΡΡ ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎ-ΡΠΎ Π² ΠΠ. Π’ΡΡ ΠΌΡ ΡΠ΅ΡΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
2β£ At least once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 1 ΡΠ°Π·. Consumer ΡΠΈΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Brokerβa ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΎΠ½ Π·Π°Π½ΠΎΠ²ΠΎ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°Π΅Ρ.
Π£ Π½Π°Ρ Π¨Π°Π³ 6 ΠΈ Π¨Π°Π³ 7 ΠΌΠ΅Π½ΡΡΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΠΠ, Ρ
ΠΎΡΠΈΠΌ ΡΠ΄Π΅Π»Π°ΡΡ commit offset ΠΈ ΠΏΠ°Π΄Π°Π΅ΠΌ Ρ OOM, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ, ΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΡΡ ΠΆΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ Π² ΠΠ.
3β£ Exactly once β ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ 1 ΡΠ°Π·. Consumer ΡΠΈΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Brokerβa ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΎΠ½ Π·Π°Π½ΠΎΠ²ΠΎ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°Π΅Ρ.
Π§ΡΠΎΠ±Ρ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡΡ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ ΠΈ Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ Π½Π°Ρ Π΅ΡΡΡ 2 Π²Π°ΡΠΈΠ°Π½ΡΠ°:
β Π’ΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π² ΠΠ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½Π° ΠΈ Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ²ΡΠΎΡΠΈΠΌ Π΅Π΅, ΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ
β ΠΡ Π΄Π΅Π»Π°Π΅ΠΌ commit offset Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΊ ΠΠ [Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ offset Π² Brokerβe, ΠΌΠΎΠΆΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΡΡ ΠΈΡ
Π² ΠΠ], ΡΡΠΎΠ±Ρ Π¨Π°Π³ 6 ΠΈ Π¨Π°Π³ 7 Π±ΡΠ» ΠΎΠ΄Π½ΠΈΠΌ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌ ΡΠ°Π³ΠΎΠΌ. Π’ΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π½Π΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΠ² ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΡ Π½Π΅ ΡΠ΅ΡΡΠ΅ΠΌ
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π° β πGithub
#sandbox_kafka #spring_boot_kafka
ββββββββ
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @sandbox_big_decimal
1 059
ΠΠ΅Π΄Π°Π²Π½ΠΎ Π²ΡΡΠ»Π° ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ Java 21, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ LTS (Long-term support) Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅ Java 17
Π‘ΠΌΠΎΡΡΠ΅Π» ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΡΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΡΠ·ΡΠΊ, ΠΈ Π·Π°Ρ
ΠΎΡΠ΅Π» ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ Π²Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠ΅ΡΡΡΡΠΎΠΌ, Π³Π΄Π΅ Ρ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΌΠΎΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ β javaalmanac
ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Java, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Ρ ΡΠΎΠΉ, ΡΡΠΎ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ (Java 22)
β Π§ΡΠΎ ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ?
β Π‘ΡΡΠ»ΠΊΠΈ Π½Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ β ΡΠ·ΡΠΊΠ°, API, Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ
β Π‘ΡΡΠ»ΠΊΠΈ Π½Π° release notes
β ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ, ΡΠΎ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΡΠΎΠ²Π½Ρ (JVM, Language, API), ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
ΡΠΈΡ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΠΎΠ±ΡΡΡΠ½ΡΡΡΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ
β Π ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ "Compare API to" ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ, ΡΡΠ°Π²Π½ΠΈΠ² API Π΄ΠΎ ΡΠ°ΠΌΡΡ
ΠΌΠ΅Π»ΠΎΡΠ΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΠΆΠ΄Ρ Java 21 ΠΈ Java 20 Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΡΡ ΠΌΠ΅ΡΠΎΠ΄ isEmoji(int) Π² Character ΠΊΠ»Π°ΡΡΠ΅
ΠΠ°ΠΎΠ΄Π½ΠΎ ΡΠ΅ΡΠΈΠ» ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ Π½Π° ΡΠ°ΠΌΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ:
β ΠΠ΅ΡΠ΅ΡΠ΅Π» Π½Π° Java 21
β ΠΡΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ» build.gradle ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π² Π½Π΅ΠΌ Ρ Groovy Π½Π° Kotlin
β ΠΠ±Π½ΠΎΠ²ΠΈΠ» Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, Π° Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ docker β ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» Π²Π΅ΡΡΠΈΠΈ imag'Π΅ΠΉ
Π’Π΅ΠΏΠ΅ΡΡ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅:
π± sandbox-spring-context
π± sandbox-spring-web
π sandbox-kafka
βοΈ sandbox-java
#note #sources
ββββββββ
βΏ ΠΠ΅Π½Ρ
βΏ ΠΠΎΠ΄ΠΏΠΈΡΠΈΡΡ: @sandbox_big_decimal
1 059
π€π€π€π€
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββJavaβοΈ π€Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΈ Ξ»-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ? π€ΠΠ°ΠΊΠΈΠ΅ Π±ΡΠ²Π°ΡΡ ΡΠΈΠΏΡ Ξ»-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ? π€ΠΠ°ΠΊ Capturing Ξ»-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° GC? π€ΠΡΠ΅Π³Π΄Π° Π»ΠΈ method reference Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΈ Ξ»-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅? π€Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Happens-before ΠΈ ΠΊΠ°ΠΊ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡ? π€ΠΠ»Ρ ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ volatile ΠΈ synchronized? Spring Contextπ± π€Annotation-based config ΠΈ ΠΊΠ°ΠΊ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π±ΠΈΠ½ Π² runtime? π€Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ? π€ΠΠ°ΠΊΠΈΠ΅ Π±ΡΠ²Π°ΡΡ ΡΠΏΠΎΡΠΎΠ±Ρ Dependency Injection? π€ΠΠ°ΠΊ Spring ΡΠΎΠ·Π΄Π°Π΅Ρ Π±ΠΈΠ½ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ»?π« Spring Webπ± π€ΠΠ±Π·ΠΎΡ Π²ΠΈΠ΄Π΅ΠΎΡΡΠΎΠΊΠ° "ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΊΠΎΠ΄Π° (Java)" π€Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ?π π€ΠΡΠΊΡΠ΄Π° Π²Π·ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡΡ Π²ΠΈΠ΄Ρ?π π€ΠΠ°ΠΊ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°?π Apache Kafkaπ π€Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Apache Kafka ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π΅Π΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ? π€ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Apache Kafka. Π§Π°ΡΡΡ 1 π€ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ Apache Kafka. Π§Π°ΡΡΡ 2 π€Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ DLT ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² Apache Kafka? Otherπ π€ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° π€ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ Π΄Π»Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π² Π―Π½Π΄Π΅ΠΊΡ, Π’ΠΈΠ½ΡΠΊΠΎΡΡ π€ΠΠ±Π·ΠΎΡ ΠΊΠ½ΠΈΠ³ΠΈ βΠΡ ΠΠΆΡΠ½Π° Π΄ΠΎ Π‘Π΅Π½ΡΠΎΡΠ°" π€Π‘ΠΏΠΈΡΠΎΠΊ Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΡ
1 059
#sandbox_spring_web #https
ΠΡΠ²Π΅ΡΠΈΠΌ Π½Π° Π²ΠΎΠΏΡΠΎΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠΈ:
βΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π²ΡΠ΄Π°Π½Π½ΡΠΉ CA, ΡΠΎ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π±ΡΠ΄ΡΡ Π΅ΠΌΡ Π΄ΠΎΠ²Π΅ΡΡΡΡ? ΠΠ΅Π΄Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΡΠ΄Π°Π½Π½ΡΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ
ΠΠ‘ ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
ΠΊΠ°ΠΊ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π² ΠΈΡ
truststore.
Π§ΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΠΎΡΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΎΡ CA, ΠΌΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ private key ΠΈ CSR (Certificate Signing Request). Π CSR Ρ
ΡΠ°Π½ΠΈΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΏΠΎΠ»Π΅ subject ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ»Π΅ CN=<Π΄ΠΎΠΌΠ΅Π½>), Π° ΡΠ°ΠΊΠΆΠ΅ public key, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ Π½Π°ΡΠΈΠΌ private key.
βΠ§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ private key ΠΈ public key?
ΠΡΠΎ ΠΏΠΎΠ½ΡΡΠΈΡ ΠΈΠ· ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π°ΡΡΠΈΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π»Π³ΠΎΡΠΈΡΠΌ RSA). ΠΠ΄Π΅ΡΡ Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ ΠΏΠ°ΡΠ° ΠΊΠ»ΡΡΠ΅ΠΉ:
β Public key ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠΌ Π»ΡΠ΄ΡΠΌ, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ signature (ΡΠΈΡΡΠΎΠ²Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡ)
β Private key ΡΠ»Π΅Π΄ΡΠ΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ Π² ΡΠ΅ΠΊΡΠ΅ΡΠ΅, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄Π΅ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ signature
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ CA ΠΏΠΎΠ»ΡΡΠΈΠ» CSR, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΅Π³ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΠΎΠΉ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈ CA private key, ΠΎΠ½ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π½Π°ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ (Π² ΠΏΠΎΠ»Π΅ issuer Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· subject'a CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°) ΠΈ ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π½Π° Π½Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π΅ΡΡΡ:
β Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π°ΠΌΠΈ private key
β Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π°ΠΌ ΠΎΡ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π½Π°Ρ public key ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΡ CA private key
βΠ ΡΡΠΎ Π΅ΡΡΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΏΡΠ°Π²ΠΈΡ Π·Π°ΠΏΡΠΎΡ Π½Π° Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ?
β Π£ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π² truststore Π΅Π³ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
1οΈβ£ ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
2οΈβ£ Π‘ΠΌΠΎΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ issuer ΠΈ ΠΈΡΠ΅ΠΌ Π² truststore ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΊΠΎΠΉ subject (ΠΌΡ Π΅Π³ΠΎ Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ, ΡΡΠΎ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ)
3οΈβ£ ΠΠ΅ΡΠ΅ΠΌ public key ΠΈΠ· CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, Π° signature Π±Π΅ΡΠ΅ΠΌ ΠΈΠ· ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
4οΈβ£ Π’.ΠΊ. signature Π±ΡΠ»Π° ΡΠ΄Π΅Π»Π°Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ CA private key, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ CA public key ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π΅Π΅ ΠΈ Π΄ΠΎΡΡΠ°Π΅ΠΌ ΠΈΠ· signature ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ hash'e ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°.
5οΈβ£ Π‘ΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ hash'a ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
6οΈβ£ ΠΡΠΊΠΈΠ΄ΡΠ²Π°Π΅ΠΌ signature ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ hash Π΄Π»Ρ body (body ΡΡΠΎ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΊΡΠΎΠΌΠ΅ signature)
7οΈβ£ ΠΡΠ»ΠΈ hash ΠΈΠ· signature ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ hash Π΄Π»Ρ body ΡΠ°Π²Π½Ρ, ΡΠΎ Π·Π½Π°ΡΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ» ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ CA ΠΈ Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅ΡΡΡΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΈΠΌΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²ΡΠ΅ Π²ΡΠ΄Π°Π½Π½ΡΠ΅ ΡΡΠΈΠΌ CA ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ.
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² (certificate chain):
β ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ΄ΠΈΠ½ ΠΊΡΡΠΏΠ½ΡΠΉ CA Π²ΡΠ΄Π°Π΅Ρ ΠΎΠΏΡΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Π΄ΡΡΠ³ΠΎΠΌΡ CA ΠΏΠΎΠΌΠ΅Π½ΡΡΠ΅, Π° ΠΎΠ½ ΡΠΆΠ΅ Π²ΡΠ΄Π°Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΌ Π»ΠΈΡΠ°ΠΌ.
β Π’ΠΎΠ³Π΄Π° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ΅ΠΏΠΎΡΠΊΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² ΠΎΡ ΡΠ°Π·Π½ΡΡ
CA (ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π² ΡΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ½ΠΈ Π²ΡΠ΄Π°Π²Π°Π»ΠΈΡΡ)
β ΠΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π² truststore, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡ ΠΊΡΡΠΏΠ½ΠΎΠ³ΠΎ CA
β ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌΡ Π²ΡΡΠ΅, ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΡΠ΅ΠΏΠΎΡΠΊΠ΅, Π½Π°ΡΠΈΠ½Π°Ρ ΠΎΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°
ΠΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π½ΠΈΠΆΠ΅, Ρ ΠΎΠΏΠΈΡΠ°Π» ΡΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΡΡΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° (ΠΏΠΎΠΈΡΠΊ ΠΏΠΎ Manual certificate validation), Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» https ΠΊΠ»ΠΈΠ΅Π½Ρ:
https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh
1 059
ΠΠ°ΠΊ Π²Ρ Π±Ρ ΠΎΡΠ΅Π½ΠΈΠ»ΠΈ ΡΠ²ΠΎΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π·Π½Π°Π½ΠΈΠΉ?
1 059
#sandbox_spring_web #https
ΠΡΠ²Π΅ΡΠΈΠΌ Π½Π° ΡΠ°ΡΡΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠΈ:
βΠΡΠΊΡΠ΄Π° Π²Π·ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ?
βΠΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π΅ΡΡΡ?
Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ:
β Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ
β ΠΠΎΠ»ΡΡΠΈΡΡ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ, Π»ΠΈΠ±ΠΎ ΠΊΡΠΏΠΈΡΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΠΌΠ΅ΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΡ Π‘ertificate Authority (CA)
β οΈ ΠΡΠ»ΠΈ Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ, ΡΠΎ ΠΊΠ°ΠΊ Π±ΡΠ°ΡΠ·Π΅Ρ Π»ΠΈΠ±ΠΎ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ, ΠΎΠ±ΡΠ°ΡΡΠΈΠΉΡΡ Ρ HTTPS ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅ΡΡΡΡ?
ΠΠ»Ρ ΠΎΡΠ²Π΅ΡΠ° Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΅ΡΡΡ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ², ΠΈ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌΠΈ ΡΡΠΈΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅, ΡΡΠΎ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΡΡΠΎΠΌ Π½Π°Π±ΠΎΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π΅ΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ truststore.
Π Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
ΠΈ JDK ΡΠ°ΠΊΠΈΠ΅ Π½Π°Π±ΠΎΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² ΠΈΠ΄ΡΡ ΡΡΠ°Π·Ρ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ. Π ΡΠ°ΠΌΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ Π±Π΅ΡΡΡΡΡ Ρ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΡ
CA ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ (ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ DigiCert, Let's Encrypt).
ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, Π΄ΠΎΠ²Π΅ΡΡΡΡ Π΅ΠΌΡ ΡΠΌΠΎΠ³ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π³Π΄Π΅ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΏΡΡΠΌΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΈΡ
truststore.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π²ΠΈΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² ΠΏΠΎ ΡΡΠΎΠ²Π½Ρ Π΄ΠΎΠ²Π΅ΡΠΈΡ ΠΊ Π½ΠΈΠΌ:
π Self-signed - ΡΠ°ΠΌΠΎΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρ openssl. ΠΠΎΠ²Π΅ΡΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ, ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΈΡ
Π² ΡΠ²ΠΎΠΉ truststore.
Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΡΠ½Π΅Π²ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΎΡ CA, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎ-ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
ΠΈ ΠΠ‘, ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΠΌΠΎΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ, Π½ΠΎ ΠΈΠΌ ΠΏΡΠΈΠ½ΡΡΠΎ Π΄ΠΎΠ²Π΅ΡΡΡΡ.
ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ΅ΡΠ΅Π· CA, ΡΠΎ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ CA, Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΈΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²:
π DV (Domain Validation) - CA ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΡΡ Π·Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΡΠΎ ΡΠ°ΠΌΠ°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ, ΡΠ°ΠΊ Π΄Π΅Π»Π°Π΅Ρ CA ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ - Let's Encrypt.
π OV (Organization Validation) - CA ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄ΠΎΠΌΠ΅Π½Π°, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π΅ΡΠ΅ ΡΡΠΎ Π²Π°ΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Ρ Π½Π΅Π΅ Π΅ΡΡΡ ΡΡΠΈΠ΄ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π΄ΡΠ΅Ρ. Π’Π°ΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠΆΠ΅ ΠΏΠ»Π°ΡΠ½ΡΠΉ.
π EV (Extended Validation) - CA ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΠΏΡΠΎΠ²Π΅Π΄Π΅Ρ ΡΡΠ΄ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π²Π°ΡΠ΅ΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΡΠΎΠΈΡΡ Π΅ΡΠ΅ Π΄ΠΎΡΠΎΠΆΠ΅. ΠΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΡΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ°ΠΉΡΠ΅ apple.
ΠΡΡΠ°ΡΡΡΡ Π²ΠΎΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΡΠ°ΡΡΡΡ
:
βΠ‘ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ? (ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ TLS-handshake)
βΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π²ΡΠ΄Π°Π½Π½ΡΠΉ CA, ΡΠΎ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π±ΡΠ΄ΡΡ Π΅ΠΌΡ Π΄ΠΎΠ²Π΅ΡΡΡΡ? ΠΠ΅Π΄Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΡΠ΄Π°Π½Π½ΡΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ Π²ΠΎ Π²ΡΠ΅Ρ
ΠΠ‘ ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ°Ρ
ΠΊΠ°ΠΊ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΉ Π² ΠΈΡ
truststore. (ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ certificate chain)
ΠΠ°ΡΠ°Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΠΏΠΎΡΠΊΠ°ΠΌΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²:
https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh
1 059
#sandbox_spring_web #https
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ?
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
Π£ Π½Π°Ρ Π΅ΡΡΡ ΡΠ°ΠΉΡ, Π³Π΄Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ Π²Π²ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π°Π½Π½ΡΠ΅ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΡ
ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ, ΠΏΠ°ΡΠΏΠΎΡΡΠ°, Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΎΠ² ΠΈ Ρ.Π΄.)
ΠΡΠ»ΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π° ΡΠ°ΠΉΡΠ΅ HTTP ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
β ΠΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ, ΠΈ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ, ΠΈΠΌΠ΅ΡΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΡΠΈ, ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ.
β ΠΠΎΠΈΡΠΊΠΎΠ²ΠΈΠΊΠΈ (google ΠΈ Π΄Ρ.) ΠΏΠΎΠ½ΠΈΠΆΠ°ΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ
ΠΏΠΎΠΈΡΠΊΠ° ΡΠ°ΠΉΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ HTTP
β ΠΡΠ°ΡΠ·Π΅ΡΡ (google chrome ΠΈ Π΄Ρ.) ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠΌ Π½Π° HTTP ΡΠ°ΠΉΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ½ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ
β ΠΠ΅Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° ΡΡΠΎ Π½Π°Ρ ΡΠ°ΠΉΡ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ Π½Π°ΡΠ΅ΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ. Π’.Π΅. Π½Π΅ΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°Π½ΠΎ. Π Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠΏΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ°.
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° HTTPS. Π Π·Π΄Π΅ΡΡ ΠΌΡ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ½ΡΡΠΈΡ SSL ΠΈ TLS:
SSL - Secure Sockets Layer - ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π² ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ ΡΠ΅ΡΠΈ.
SSL ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ Π½Π° Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π΅ TLS - Transport Layer Security, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΈΠ· ΡΡΠ°ΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, ΠΈ ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡΡΡ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ, ΠΈΠΌΠ΅ΡΡ Π²Π²ΠΈΠ΄Ρ TLS ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.
HTTPS ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ TLS Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ
. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ HTTPS ΡΡΠΎ HTTP, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΎΠ²Π½Π΅ΠΌ Π½ΠΈΠΆΠ΅ TLS.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ TLS ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ:
β
ΠΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΡ - Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈ Π² Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΡΠ΅ΠΏΠ΅ΡΡ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ Π½Π΅ ΡΠ²ΠΈΠ΄ΠΈΡ Π½Π°ΡΠΈ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ.
β
ΠΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡΡ - Π² ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌ ΠΈ Π½Π°ΡΠ΅ΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. ΠΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ Π΄Π°Π½Π½ΡΡ
, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π» Π½Π° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ.
β
Π¦Π΅Π»ΠΎΡΡΠ½ΠΎΡΡΡ - Π΄Π°Π½Π½ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ/ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ/ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. ΠΠ»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΈΡ
ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠΈΡ. (ΠΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΡΡΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ MAC (Message Authentication Code). ΠΠ»ΠΈΠ΅Π½Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Ρ
Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Ρ
Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Ρ Ρ
Π΅ΡΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ»ΠΈ Ρ
Π΅Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ, Π·Π½Π°ΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.)
Π‘Π°ΠΌΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° TLS ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. ΠΠ΅Π· Π½Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
SSL (TLS) ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ - Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΠΏΠ°ΡΠΏΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ ΡΠ°ΠΉΠ», ΠΎΠ±ΡΡΠ½ΠΎ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ .cer ΠΈΠ»ΠΈ .pem
Π Π½Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:
π Subject - Π΄Π°Π½Π½ΡΠ΅ ΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° (ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
ΠΏΠΎΠ»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π² CN (Common Name) ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΄ΠΎΠΌΠ΅Π½)
π Issuer - Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΊΠ°ΠΊΠΎΠΉ CA (Certificate Authority) ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π» ΡΡΠΎΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ)
π Public key - ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΈ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ session key (ΠΎ Π½Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅)
π Valid from - Π΄Π°ΡΠ° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°
π Valid until - ΡΡΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°
π Signature - ΡΠΈΡΡΠΎΠ²Π°Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½Π°Ρ CA
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΡΠΎ ΡΡΠΎ ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ. ΠΡΡΠ°ΡΡΡΡ Π²ΠΎΠΏΡΠΎΡΡ:
βΠΡΠΊΡΠ΄Π° Π²Π·ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ?
βΠΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π΅ΡΡΡ?
βΠ‘ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ?
ΠΠ± ΡΡΠΎΠΌ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΡΠ°ΡΡΡΡ
. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Ρ
ΠΎΡΠ΅Ρ Π±ΡΡΡΡΠ΅Π΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Spring Boot ΡΠ΅ΡΠ²Π΅ΡΠ° c mTLS ΠΈ ΡΠΊΡΠΈΠΏΡ Ρ ΡΠΌΡΠ»ΡΡΠΈΠ΅ΠΉ Π²ΡΠ΄Π°ΡΠΈ CA ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅:
https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh
