🚀 Как интегрировать Kafka со Spring Boot
Платформа распределенной потоковой передачи Kafka предоставляет надежную и отказоустойчивую систему обмена сообщениями, позволяющую обрабатывать данные в режиме реального времени.
Для создания эффективных, несвязанных и отзывчивых приложений разработчики могут гармонично реализовать возможности Kafka в сочетании с простотой и производительностью фреймворка Spring Boot.
Рассмотрим пошаговую интеграцию Kafka и Spring Boot.
Шаг 1. Настройте Kafka
Установите Kafka и запустите кластер Kafka. Инструкции по установке есть в официальной документации Kafka.
Шаг 2. Создайте проект Spring Boot
Настройте новый проект Spring Boot, используя предпочитаемую IDE или Spring Initializr. Включите необходимые зависимости:
spring-boot-starter-web включает веб-функции в Spring Boot.
Шаг 3. Настройте свойства Kafka
В файле проекта Spring Boot application.properties настройте необходимые свойства Kafka, такие как серверы начальной загрузки и названия разделов, а также любые дополнительные. Например:
Шаг 4. Создайте Kafka Producer
Внедрите Kafka producer для отправки сообщений в разделы (topic) Kafka. Создать простой producer позволяет KafkaTemplate, предоставленный Spring Kafka. Например:
📌Читать
@javatg
Платформа распределенной потоковой передачи Kafka предоставляет надежную и отказоустойчивую систему обмена сообщениями, позволяющую обрабатывать данные в режиме реального времени.
Для создания эффективных, несвязанных и отзывчивых приложений разработчики могут гармонично реализовать возможности Kafka в сочетании с простотой и производительностью фреймворка Spring Boot.
Рассмотрим пошаговую интеграцию Kafka и Spring Boot.
Шаг 1. Настройте Kafka
Установите Kafka и запустите кластер Kafka. Инструкции по установке есть в официальной документации Kafka.
Шаг 2. Создайте проект Spring Boot
Настройте новый проект Spring Boot, используя предпочитаемую IDE или Spring Initializr. Включите необходимые зависимости:
spring-kafka
предоставляет основную функциональность для интеграции Kafka в Spring;spring-boot-starter-web включает веб-функции в Spring Boot.
Шаг 3. Настройте свойства Kafka
В файле проекта Spring Boot application.properties настройте необходимые свойства Kafka, такие как серверы начальной загрузки и названия разделов, а также любые дополнительные. Например:
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.template.default-topic=my-topic
Шаг 4. Создайте Kafka Producer
Внедрите Kafka producer для отправки сообщений в разделы (topic) Kafka. Создать простой producer позволяет KafkaTemplate, предоставленный Spring Kafka. Например:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducerService {
private final KafkaTemplate<String, String> kafkaTemplate;
@Autowired
public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String message) {
kafkaTemplate.send("my-topic", message);
}
}
📌Читать
@javatg
❤10👍6🔥3😱1
Spring Modulith 1.0 GA Released. Новый -релиз получила Spring Modulith — часть экосистемы Spring, призванная упростить построение модульных монолитов.
Announcing Testcontainers Desktop Free Application — свежий анонс утилиты, удобной для работы с тест-контейнерами. Из интересного — быстрое переключение между docker/colima/podman, возможность запуска контейнеров на фиксированных портах и их фриз на время дебага.
Выпущен Jmix 2.0 — новая версия платформы для быстрой разработки бизнес-приложений на Java. В статье — подробности о том, для чего нужен этот инструмент и как он позволяет сокращать время разработки бизнес-приложения.
OpenAI выложила на Github OpenCopilot. OpenCopilot — это ИИ-помощник, способный интегрироваться в продукт. Он готов к встраиванию через базовые API и может вызывать эти API по необходимости. Модель OpenCopilot основана на обширной лингвистической базе и способна определить, требует ли запрос пользователя выполнения вызова к какой-либо конечной точке API.
Дмитрий Иванов, Андрей Кулешов — Пирамида потребностей Маслоу для Java/Kotlin-разработчика. Виде — это полноценная методичка, посвященная тому, как начать и развить свой open-source-проект. От стадии кодинга и до построения комьюнити — каждый шаг расписан детально, с приведением полезных инструментов и практик.
JDK 21 G1/Parallel/Serial GC changes — статья о том, как изменятся сборщики мусора в JDK 21, и о планах их развития. Основные изменения коснутся G1 GС:
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥2
🔥 Дайджест полезных материалов из мира : Java за неделю
Почитать:
— Всё, что вы хотели знать о Java, но не доходили руки спросить: что будет на Joker 2023
— Как добавить кастомный аутентификатор в KeyCloak и подружить его со сторонней системой
— Java Digest #4
— Высокие технологии или дешевые фокусы с двойным дном
— Байки джависта
— Создание приложения для распознавания текста с изображений и аудиофайлов
— Параллельность в Java на практике
— Динамическое создание слушателей в Kafka
— Аудит пользователей Spring Data JPA
— Ускоряем java-рефлексию в 2023
— 🔐 Unlock the Power of Data Security with Our Online Encryption and Decryption Tool! 🔐
— Securing the Path: A Comprehensive Guide to Spring Security Migration
— Elevate Your Security Game: Spring Security’s Lambda DSL Unleashed
— Parâmetros em API RESTful: Tipos e Exemplos
— Kafka in a Nutshell 🌰: Events, Topics, and APIs made simple
— Testes Mutantes com Pitest
— Aumente a Qualidade do seu Código Java: Um Guia para Utilizar o JaCoCo em sua API REST
— Simplifying Java Multithreading (Runnable interface) with a Construction Analogy
— Application and Webserver Logging in Spring Boot 3.1
— Exercising DSA with Java
Посмотреть:
🌐 Java 21 JVM & GC Improvements #RoadTo21 (⏱ 12:09)
🌐 Value Objects in Valhalla (⏱ 51:42)
🌐 Learn All You Need To Know For Your Java 17-21 Update #Java #Java21 #RoadTo21 (⏱ 00:46)
🌐 Java 21 Tool Enhancements: Better Across the Board #RoadTo21 (⏱ 17:39)
🌐 What is a deadlock? - Cracking the Java Coding Interview (⏱ 00:56)
🌐 Project Leyden - Capturing Lightning in a Bottle (⏱ 47:57)
🌐 Creating an instance of a Class using the Reflection API? - Cracking the Java Coding Interview (⏱ 00:53)
🌐 Everything You Never Wanted to Know about Java Class Initialization (⏱ 39:01)
Хорошего дня!
@javatg
Почитать:
— Всё, что вы хотели знать о Java, но не доходили руки спросить: что будет на Joker 2023
— Как добавить кастомный аутентификатор в KeyCloak и подружить его со сторонней системой
— Java Digest #4
— Высокие технологии или дешевые фокусы с двойным дном
— Байки джависта
— Создание приложения для распознавания текста с изображений и аудиофайлов
— Параллельность в Java на практике
— Динамическое создание слушателей в Kafka
— Аудит пользователей Spring Data JPA
— Ускоряем java-рефлексию в 2023
— 🔐 Unlock the Power of Data Security with Our Online Encryption and Decryption Tool! 🔐
— Securing the Path: A Comprehensive Guide to Spring Security Migration
— Elevate Your Security Game: Spring Security’s Lambda DSL Unleashed
— Parâmetros em API RESTful: Tipos e Exemplos
— Kafka in a Nutshell 🌰: Events, Topics, and APIs made simple
— Testes Mutantes com Pitest
— Aumente a Qualidade do seu Código Java: Um Guia para Utilizar o JaCoCo em sua API REST
— Simplifying Java Multithreading (Runnable interface) with a Construction Analogy
— Application and Webserver Logging in Spring Boot 3.1
— Exercising DSA with Java
Посмотреть:
🌐 Java 21 JVM & GC Improvements #RoadTo21 (⏱ 12:09)
🌐 Value Objects in Valhalla (⏱ 51:42)
🌐 Learn All You Need To Know For Your Java 17-21 Update #Java #Java21 #RoadTo21 (⏱ 00:46)
🌐 Java 21 Tool Enhancements: Better Across the Board #RoadTo21 (⏱ 17:39)
🌐 What is a deadlock? - Cracking the Java Coding Interview (⏱ 00:56)
🌐 Project Leyden - Capturing Lightning in a Bottle (⏱ 47:57)
🌐 Creating an instance of a Class using the Reflection API? - Cracking the Java Coding Interview (⏱ 00:53)
🌐 Everything You Never Wanted to Know about Java Class Initialization (⏱ 39:01)
Хорошего дня!
@javatg
👍12🔥4❤1😱1
Многие, возможно, думают, что работа с байт-кодом Java (будь то чтение или, тем более, генерация) — это какая-то особенная магия, доступная только продвинутым разработчикам с особенно крутым опытом. На самом деле, я считаю такую точку зрения ошибочной.
JVM устроена гораздо проще, чем CPU; она оперирует такими высокоуровневыми понятиями как классы, интерфейсы, методы, а не просто лопатит байты в памяти. В отличие от CPU, который легко уронить криво сгенерированным машинным кодом, JVM заботливо отверифицирует любой байт-код и в общем не даст выстрелить в ногу.
Но с чего начать погружение в байт-кодную магию? В сети есть некоторое количество туториалов по этому вопросу. Как мне кажется, они либо показывают слишком простые случаи, от которых непонятно, как перейти к чему-то более интересному, либо очень основательные и требуют вникать в теорию, собирать целиком картину в голове по кусочкам. Я хотел бы попробовать внести свой вклад в эту тему — надеюсь, у меня получится показать, как можно побороть первый страх и написать что-то похожее на реалистичный сценарий без особого вникания в теорию на первом этапе.
Весь приведённый код доступен в репозитории.
Задача
Я вдохновился книгой Бьёрна Страуструпа, по которой лет 20 назад изучал C++. В одной из первых глав в качестве задачи для введения в язык предлагается написать калькулятор выражений. Я же предлагаю не вычислять выражения, а генерировать байт-код, который вычисляет выражения.
Итак, формулировка: необходимо написать метод, которые принимает на вход строку с математическими выражениями и выдаёт на выходе экземпляр такого интерфейса:
public interface Expression {
double evaluate(Function<String, Double> inputs);
}
Выражения в списке разделены точкой с запятой (;), метод evaluate возвращает результат вычисления последнего из выражений. Выражения определим так:
Число (например, 2, 42, 3.14) — это выражение.
Идентификатор (например, foo, pi, myVar_1) — это выражение. Значение по-умолчанию для переменной вычисляется с помощью вызова inputs.apply(id).
Если A и B — выражения, то A + B, A - B, A * B, A / B, -A, (A) — так же выражения
Если A — это идентификатор, и B — это выражение, то A = B — так же выражение
Генерируем класс
Для начала напишем генератор класса, реализующего интерфейс Expression.
▪Читать дальше
▪Github
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4❤3
⚡Легкий способ получать свежие обновлении и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Data Science: www.tg-me.com/data_analysis_ml
Java: www.tg-me.com/java_library
Базы данных: www.tg-me.com/sqlhub
Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Go: www.tg-me.com/Golang_google
C/C++/ www.tg-me.com/cpluspluc
C#: www.tg-me.com/csharp_ci
Хакинг: www.tg-me.com/linuxkalii
Мобильная разработка: www.tg-me.com/mobdevelop
Docker: www.tg-me.com/+0WdB4uvOwCY0Mjdi
Python: www.tg-me.com/python_job_interview
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Big Data: www.tg-me.com/bigdatai
Devops: www.tg-me.com/devOPSitsec
Тестирование:https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Собеседования: https://www.tg-me.com/machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
ИИ: www.tg-me.com/vistehno
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
Data Science: www.tg-me.com/data_analysis_ml
Java: www.tg-me.com/java_library
Базы данных: www.tg-me.com/sqlhub
Машинное обучение: www.tg-me.com/ai_machinelearning_big_data
Go: www.tg-me.com/Golang_google
C/C++/ www.tg-me.com/cpluspluc
C#: www.tg-me.com/csharp_ci
Хакинг: www.tg-me.com/linuxkalii
Мобильная разработка: www.tg-me.com/mobdevelop
Docker: www.tg-me.com/+0WdB4uvOwCY0Mjdi
Python: www.tg-me.com/python_job_interview
Rust: www.tg-me.com/rust_code
Javascript: www.tg-me.com/javascriptv
React: www.tg-me.com/react_tg
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Linux: www.tg-me.com/+A8jY79rcyKJlYWY6
Big Data: www.tg-me.com/bigdatai
Devops: www.tg-me.com/devOPSitsec
Тестирование:https://www.tg-me.com/+F9jPLmMFqq1kNTMy
Собеседования: https://www.tg-me.com/machinelearning_interview
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
ИИ: www.tg-me.com/vistehno
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
❤3👍1🔥1
Крутой проект на Java. Клиент Reddit для Android. В нем нет рекламы, он отличается чистым пользовательским интерфейсом и плавным просмотром веб-страниц
Содержит такие функции, как Lazy Mode (автоматическая прокрутка сообщений), поддержка нескольких учетных записей и ночная тема.
▪Github
▪Docs
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2🔥1
Драйвер
PostgreSQL JDBC Driver
(сокращенно PgJDBC) позволяет Java-программам подключаться к базе данных PostgreSQL
, используя стандартный, независимый от базы данных Java-код. Это JDBC-драйвер с открытым исходным кодом, написанный на языке Pure Java (Type 4) и взаимодействующий в сетевом протоколе PostgreSQL.▪Github
▪Docs
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3🔥2🥰1
Тестирование должно быть простым.
Если тесты слишком сложные и проблематичные в сопровождении, они теряют смысл. Тесты помогают разработчику понять логику приложения и проверить, что оно работает как надо. Создавая простые тесты, вы обеспечиваете их практическую ценность как для себя, так и для тех, кто воспользуется ими в дальнейшем.
Один из способов это сделать — избавиться от шаблонного кода, перегружающего тесты. В статье мы займемся решением этой задачи.
Сценарий использования
Допустим, у нас есть приложение, которое отправляет какие-либо данные принимающему API. Отправляем следующее:
data class Stuff(val name: String, val type: String)
Сервис перенаправляет запрос другому классу для фактической отправки. Код выглядит так:
import okhttp3.OkHttpClient
class StuffService() {
private val client = OkHttpClient()
.newBuilder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.build()
chain.proceed(request)
}.build()
private val stuffLink = StuffLink(client, "http://some.where")
fun sendStuff(stuff: Stuff) = stuffLink.sendStuff(stuff)
}
Клиент (назовем его ссылкой, тем самым исключая множественные трактовки этого понятия) выполняет фактическую отправку, создавая запрос и отправляя его посредством заданного OkHttpClient и URL. Рассмотрим код:
import com.fasterxml.jackson.databind.ObjectMapper
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
class StuffLink(private val client: OkHttpClient, private val url: String) {
private val objectMapper = ObjectMapper()
fun sendStuff(stuff: Stuff): Response {
val request = Request.Builder()
.url(url)
.post(
objectMapper.writeValueAsString(stuff)
.toRequestBody("application/json".toMediaType()),
).build()
return client.newCall(request).execute()
}
}
Вариант теста 1
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥2
🔥 Дайджест полезных материалов из мира : Java за неделю
Почитать:
— Модельно-Ориентированная Java, или Навстречу Дизайну ПО
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 4 из 5]
— Как внедрить Prototype в Singleton в Spring с помощью параметра ProxyMode
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 3 из 5]
— Делаем свою простейшую систему сборки для Java
— Микросмартфон за 100 рублей: Покупаем смартфон 11-летней давности и… пишем под него приложения
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 2 из 5]
— Ad-hoc мониторинг: сбор, хранение и визуализация данных
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 1 из 5]
— Разница между Data Race и Race Condition
— Solving "All Nodes Distance K in Binary Tree" Leet code Question
— Mutex & Race Conditions in Java Multi-Threading made so simple with real-life analogies
— Hash! A magical datastructure
— "I definitely didn't spend 3 hours on this question..😢#BinaryTreeAdventures" Solving Binary Tree Right Side View Leet code
— Leet Code 75–2215. Find the Difference of Two Arrays
— Multi-Threading in JAVA using Callables
— convertTxtToHtml - A new command-line tool can process .txt files into .html
— Java Interfaces Default Methods
— Iniciando estudos em Kotlin
— Common Mistakes of Junior Java Developers When Working with Hibernate
Посмотреть:
🌐 Java 21 API New Features #RoadTo21 (⏱ 16:48)
🌐 #Java 21 bug fixes you need to know about (⏱ 00:54)
🌐 What is the difference between a Collection and a List? - Cracking the Java Coding Interview (⏱ 00:58)
🌐 Difference between toList() and Collectors.toList()? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 Java 21 Security Updates #RoadTo21 (⏱ 27:04)
🌐 JVM Language Summit 2023 Keynote #JVMLS (⏱ 21:15)
🌐 Java 21 Launch Event (⏱ 00:00)
Хорошего дня!
@javatg
Почитать:
— Модельно-Ориентированная Java, или Навстречу Дизайну ПО
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 4 из 5]
— Как внедрить Prototype в Singleton в Spring с помощью параметра ProxyMode
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 3 из 5]
— Делаем свою простейшую систему сборки для Java
— Микросмартфон за 100 рублей: Покупаем смартфон 11-летней давности и… пишем под него приложения
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 2 из 5]
— Ad-hoc мониторинг: сбор, хранение и визуализация данных
— Искусство ETL. Пишем собственный движок SQL на Spark [часть 1 из 5]
— Разница между Data Race и Race Condition
— Solving "All Nodes Distance K in Binary Tree" Leet code Question
— Mutex & Race Conditions in Java Multi-Threading made so simple with real-life analogies
— Hash! A magical datastructure
— "I definitely didn't spend 3 hours on this question..😢#BinaryTreeAdventures" Solving Binary Tree Right Side View Leet code
— Leet Code 75–2215. Find the Difference of Two Arrays
— Multi-Threading in JAVA using Callables
— convertTxtToHtml - A new command-line tool can process .txt files into .html
— Java Interfaces Default Methods
— Iniciando estudos em Kotlin
— Common Mistakes of Junior Java Developers When Working with Hibernate
Посмотреть:
🌐 Java 21 API New Features #RoadTo21 (⏱ 16:48)
🌐 #Java 21 bug fixes you need to know about (⏱ 00:54)
🌐 What is the difference between a Collection and a List? - Cracking the Java Coding Interview (⏱ 00:58)
🌐 Difference between toList() and Collectors.toList()? - Cracking the Java Coding Interview (⏱ 01:00)
🌐 Java 21 Security Updates #RoadTo21 (⏱ 27:04)
🌐 JVM Language Summit 2023 Keynote #JVMLS (⏱ 21:15)
🌐 Java 21 Launch Event (⏱ 00:00)
Хорошего дня!
@javatg
👍12🔥3❤1
🏛Событийно-ориентированная архитектура
Событийно-ориентированная архитектура — это шаблон проектирования с применением событий для запуска и передачи изменений между компонентами системы. Службы здесь взаимодействуют, обмениваясь событиями, то есть сообщениями о наступлении события или изменении состояния.
Преимущества событийно-ориентированной архитектуры
▪️ Слабая связанность: службы разделены, чем обеспечивается независимость и модульность.
▪️ Масштабируемость: службы масштабируются независимо, исходя из потребности в событиях, чем повышается общая производительность системы.
▪️ Асинхронная обработка: событиями обеспечиваются асинхронное взаимодействие, уменьшение задержки и времени отклика.
▪️ Порождение событий: поддерживается естественным образом, ведь состояние системы определяется последовательностью прошлых событий.
▪️ Гибкость: добавление новых служб или изменение имеющихся не сказывается на всей системе.
Kafka
Apache Kafka — это распределенная потоковая платформа для создания конвейеров данных в реальном времени и потоковых приложений, потоковой передачи событий с высокой пропускной способностью, отказоустойчивостью и масштабируемостью.
В основе Kafka — модель обмена сообщениями «публикация-подписка», где в темах отправителями публикуются сообщения-события, а получатели — для получения и обработки сообщений — подписываются на эти темы. События хранятся в Kafka неизменяемо и только с возможностью добавления. Данные обрабатываются как в реальном времени, так и ретроспективе.
Ключевые понятия Kafka
• Темы — каналы для публикации событий и подписки на них.
• Отправители — службы, которыми события создаются и отправляются в темы Kafka.
• Получатели — службы, которые подписываются на темы, ими обрабатываются входящие события.
• Разделы: каждая тема разбивается на разделы, чем обеспечиваются параллельная обработка и распределение нагрузки.
Роль Kafka в событийно-ориентированной архитектуре
📌 Читать
@javatg
Событийно-ориентированная архитектура — это шаблон проектирования с применением событий для запуска и передачи изменений между компонентами системы. Службы здесь взаимодействуют, обмениваясь событиями, то есть сообщениями о наступлении события или изменении состояния.
Преимущества событийно-ориентированной архитектуры
Kafka
Apache Kafka — это распределенная потоковая платформа для создания конвейеров данных в реальном времени и потоковых приложений, потоковой передачи событий с высокой пропускной способностью, отказоустойчивостью и масштабируемостью.
В основе Kafka — модель обмена сообщениями «публикация-подписка», где в темах отправителями публикуются сообщения-события, а получатели — для получения и обработки сообщений — подписываются на эти темы. События хранятся в Kafka неизменяемо и только с возможностью добавления. Данные обрабатываются как в реальном времени, так и ретроспективе.
Ключевые понятия Kafka
• Темы — каналы для публикации событий и подписки на них.
• Отправители — службы, которыми события создаются и отправляются в темы Kafka.
• Получатели — службы, которые подписываются на темы, ими обрабатываются входящие события.
• Разделы: каждая тема разбивается на разделы, чем обеспечиваются параллельная обработка и распределение нагрузки.
Роль Kafka в событийно-ориентированной архитектуре
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥3
🎉🎉🎉 Релиз Java 21 🎉🎉🎉
Новые функций:
• виртуальные потоки
• record Patterns
• pattern Matching для switch
• новые методы в коллекциях
• интерполяция строк и другие интересные нововведения.
• Релиз
• Трансляция
👍 лайк, если ждал новую версию
@javatg
Новые функций:
• виртуальные потоки
• record Patterns
• pattern Matching для switch
• новые методы в коллекциях
• интерполяция строк и другие интересные нововведения.
• Релиз
• Трансляция
👍 лайк, если ждал новую версию
@javatg
👍56🔥5❤4
🖇 Создание глубокой и поверхностной копии объекта.
Java Stream API: когда использовать map() и FlatMap()
При работе с объектами в Java бывают случаи, когда вам необходимо создать копию объекта. Однако не все копии одинаковы. Существует два основных способа копирования объектов: глубокое копирование (Deep Copy) и поверхностное копирование (Shallow Copy).
Глубокое копирование: что это такое?
Представьте, что у вас есть коллекция фигур, каждая из которых имеет свой перечень свойств. Глубокая копия объекта означает создание совершенно новой копии исходного объекта вместе со всеми вложенными объектами, которые он содержит. Иными словами, это похоже на точную копию каждой формы, включая все детали.
Поверхностное копирование: в чем разница?
С другой стороны, поверхностное копирование создает копию объекта, не зная о структуре класса, который он копирует. То есть, объект копируется без содержащихся в нем вложенных объектов. По умолчанию в Java применяется поверхностное копирование. Для этого используется метод clone().
Давайте применим копирование на практике: пример фигур
Представьте, что у вас есть класс с именем Circle, в котором есть вложенный объект класса Point, представляющий его центр. Сейчас мы увидим, как глубокое и поверхностное копирование работают с этими объектами.
Создание поверхностной копии
Для поверхностного копирования мы просто копируем ссылки на вложенные объекты:
Создание глубокой копии
ля глубокой копии Circle нам нужно создать новые экземпляры объектов Point и Circle.
Создание простого класса CopyUtil
Вот класс утилиты с кодом копирования объектов:
Модульные тесты
Давайте напишем несколько простых тестов для проверки наших методов глубокого и поверхностного копирования.
📌 Продолжение
@javatg
Java Stream API: когда использовать map() и FlatMap()
При работе с объектами в Java бывают случаи, когда вам необходимо создать копию объекта. Однако не все копии одинаковы. Существует два основных способа копирования объектов: глубокое копирование (Deep Copy) и поверхностное копирование (Shallow Copy).
Глубокое копирование: что это такое?
Представьте, что у вас есть коллекция фигур, каждая из которых имеет свой перечень свойств. Глубокая копия объекта означает создание совершенно новой копии исходного объекта вместе со всеми вложенными объектами, которые он содержит. Иными словами, это похоже на точную копию каждой формы, включая все детали.
Поверхностное копирование: в чем разница?
С другой стороны, поверхностное копирование создает копию объекта, не зная о структуре класса, который он копирует. То есть, объект копируется без содержащихся в нем вложенных объектов. По умолчанию в Java применяется поверхностное копирование. Для этого используется метод clone().
Давайте применим копирование на практике: пример фигур
Представьте, что у вас есть класс с именем Circle, в котором есть вложенный объект класса Point, представляющий его центр. Сейчас мы увидим, как глубокое и поверхностное копирование работают с этими объектами.
public class Circle {
public Point center;
public int radius;
public Circle(Point center, int radius) {
this.center = center;
this.radius = radius;
}
}
public class Point {
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Создание поверхностной копии
Для поверхностного копирования мы просто копируем ссылки на вложенные объекты:
public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}
Создание глубокой копии
ля глубокой копии Circle нам нужно создать новые экземпляры объектов Point и Circle.
public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}
Создание простого класса CopyUtil
Вот класс утилиты с кодом копирования объектов:
public class CopyUtil {
public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}
public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}
}
Модульные тесты
Давайте напишем несколько простых тестов для проверки наших методов глубокого и поверхностного копирования.
📌 Продолжение
@javatg
👍13❤4🥰1
Динамическое программирование - это метод, позволяющий разбивать задачи на более мелкие подзадачи.
Это полезный навык для решения задач
min change, max path sum
и других вопросов на собеседовании по кодированию.В этом курсе вы изучите методы динамического программирования на языке Java.
📌Курс
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥2
🔥 Дайджест полезных материалов из мира Java за неделю
Почитать:
— В Java 21 собираются реализовать сопоставление с образцом – так, глядишь, я снова на этот язык перейду
— Добавление отзывов с фотографиями в S3 с помощью AWS SDK Java
— Microsoft предлагает БЕСПЛАТНЫЕ онлайн курсы с сертификацией
— Сделали по красоте: победители «Конкурса красоты кода»
— OOM: direct memory при работе с сетью TCP/IP через NIO в Java
— Построение гибкой и распределенной архитектуры с использованием Kafka и Kafka Connect: Часть 2 — Получатель и Helm Chart
— Решаем задачу о секретном рукопожатии на Java
— Продвинутый телеграмм бот на Java (Spring, postgres и free deploy)
— Принцип Универсалий: или локальный подход к Dependency Injection
— Вышла Java 21
— Hello World in Java
— Cracking the Code: Leet Code 1048 - Longest String Chain (Medium) - NileshDev
— Cracking the LeetCode:392 Is Subsequence?
— Semaphores, is that so easy!! The Clothing Store Analogy as a Guide for Beginners
— Scanner em Java
— #11 Example of Views & View Groups in android | Android Studio Tutorial | SoftwareTechIT
— The Big Debate: Should We Explain Code or Not?
— Using JLink to create smaller Docker images for your Spring Boot Java application
— Salesforce Integration Services
— How to prevent NullPointerExceptions in Java
Посмотреть:
🌐 Java21 Brings Full Pattern Matching #RoadTo21 (⏱ 23:28)
🌐 Java 21 in Two Minutes... more or less (⏱ 02:50)
🌐 How can you model a concurrent task in Java? - Cracking the Java Coding Interview (⏱ 00:53)
🌐 Comparing Doubles with a comparator of Numbers? - Cracking the Java Coding Interview (⏱ 00:56)
🌐 JDK 21 Release Notes - Inside Java Newscast #55 (⏱ 34:18)
🌐 All About Java 21 - Launch Event (⏱ 08:01:35)
🌐 Как становились программистами 20 лет назад и что изменилось сейчас — Леша Корепанов (⏱ 01:02:28)
Хорошего дня!
@javatg
Почитать:
— В Java 21 собираются реализовать сопоставление с образцом – так, глядишь, я снова на этот язык перейду
— Добавление отзывов с фотографиями в S3 с помощью AWS SDK Java
— Microsoft предлагает БЕСПЛАТНЫЕ онлайн курсы с сертификацией
— Сделали по красоте: победители «Конкурса красоты кода»
— OOM: direct memory при работе с сетью TCP/IP через NIO в Java
— Построение гибкой и распределенной архитектуры с использованием Kafka и Kafka Connect: Часть 2 — Получатель и Helm Chart
— Решаем задачу о секретном рукопожатии на Java
— Продвинутый телеграмм бот на Java (Spring, postgres и free deploy)
— Принцип Универсалий: или локальный подход к Dependency Injection
— Вышла Java 21
— Hello World in Java
— Cracking the Code: Leet Code 1048 - Longest String Chain (Medium) - NileshDev
— Cracking the LeetCode:392 Is Subsequence?
— Semaphores, is that so easy!! The Clothing Store Analogy as a Guide for Beginners
— Scanner em Java
— #11 Example of Views & View Groups in android | Android Studio Tutorial | SoftwareTechIT
— The Big Debate: Should We Explain Code or Not?
— Using JLink to create smaller Docker images for your Spring Boot Java application
— Salesforce Integration Services
— How to prevent NullPointerExceptions in Java
Посмотреть:
🌐 Java21 Brings Full Pattern Matching #RoadTo21 (⏱ 23:28)
🌐 Java 21 in Two Minutes... more or less (⏱ 02:50)
🌐 How can you model a concurrent task in Java? - Cracking the Java Coding Interview (⏱ 00:53)
🌐 Comparing Doubles with a comparator of Numbers? - Cracking the Java Coding Interview (⏱ 00:56)
🌐 JDK 21 Release Notes - Inside Java Newscast #55 (⏱ 34:18)
🌐 All About Java 21 - Launch Event (⏱ 08:01:35)
🌐 Как становились программистами 20 лет назад и что изменилось сейчас — Леша Корепанов (⏱ 01:02:28)
Хорошего дня!
@javatg
👍12❤2🔥1
Подробный гайд по созданию микросервисов с использованием Spring Boot.
В этом учебном пособии показано -как создавать микросервис с использованием Spring Boot 3, Spring Cloud и базы данных PostgreSQL.
В этом микросервисном проекте вы изучите такие важные понятия, как
API Gateway, Config Server, Discovery Server,
и практически реализуете два реальных микросервиса - Student и School.📌 Статья
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥7❤2
Оператор +
Известно, что использование оператора + считается плохой практикой. Дело в том, что строки неизменяемы, и в соответствии с внутренним механизмом новая строка создается для каждой объединяемой части. Однако “meten is weten”, что в переводе с голландского означает “хочешь знать — измерь”. Посмотрим, что на самом деле происходит внутри:
// Пример #1:
String example1 = "some String " + 42;
// Пример #2:
int someInt = 42;
String example2 = "some String " + someInt + " other String " + someInt;
// Пример #3:
String example3 = "";
for (int i = 0; i < 10; i++) {
example3 += someInt;
}
В байт-коде примера #1 осуществляется одно выделение строки. Компилятор Java понимает, что магическое число является константой, поэтому оно загружается как часть строки String в стек операндов:
0: ldc #7 // Строка some String42
Но мы не намерены применять магические значения, поэтому посмотрим, что происходит с переменными.
В примере #2 при использовании переменной компилятор Java не может выполнить такую же оптимизацию, но зато совершает какую-то сложную операцию с помощью invokedynamic:
0: bipush 42
2: istore_1
3: iload_1
4: iload_1
5: invokedynamic #7, 0 // InvokeDynamic #0:makeConcatWithConstants:
(II)Ljava/lang/String;
...
BootstrapMethods:
0: #22 REF_invokeStatic
java/lang/invoke/StringConcatFactory.makeConcatWithConstants:
(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke
/MethodType;Ljava/lang/String;
[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
Method arguments:
#23 одна String \u0001 другая String \u0001
Эта инструкция позволяет во время выполнения вызвать метод bootstrap для конкатенации. Мы даем ему “рецепт”: some String \u0001 other String \u0001, который в данном случае содержит 2 плейсхолдера. При конкатенации большего числа переменных увеличивается и число плейсхолдеров, но это все равно одна строка String в пуле констант.
Фишка подхода invokedynamic состоит в том, что при появлении обновленных версий JDK с техниками конкатенации JDK, байт-код может оставаться прежним, тогда как действия метода bootstrap усложняются (чуть позже о деталях текущей реализации).
В примере #3 в цикле выполняется следующая инструкция:
16: invokedynamic #9, 0 // InvokeDynamic #0:makeConcatWithConstants:
(Ljava/lang/String;I)Ljava/lang/String;
Она приводит к выделению ненужного количества экземпляров String.
String::format
На мой взгляд, String::format — более эффективная альтернатива оператору +. Данный метод предлагает действительно улучшенную читаемость в ряде случаев и поддерживает локализацию. Основные тесты показывают, что его производительность немного превосходит конкатенацию. Однако реализация метода format создает новую строку String для каждого параметра.
Проведем небольшой эксперимент:
📌 Читать дальше
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3❤2