Pull to refresh
4
0
Бубб Дмитрий @dbubb

Java-разработчик

Send message

Туториал по нотификациям через RSocket: от концепции до запуска в продакшн

Level of difficulty Medium
Reading time 17 min
Views 2.8K

Однажды мы решали задачу разработки системы нотификаций для Альфа-Онлайн — мобильного банка в вебе. Нам было необходимо разработать инструмент по отправке сообщений (нотификаций) со стороны сервера в браузер в любой момент времени, пока клиент онлайн. На стороне Альфа-Онлайн каждый процесс самостоятельно определит дальнейшую судьбу сообщения.

После анализа различных вариантов, мы остановились на WebSocket в связке с RSocket.

Но есть нюанс — информации по RSocket почти нет. Технология относительно новая и просто так сразу на ней не начнешь делать проекты. Для начала нужно изучить теорию, овладеть терминологией и при необходимости, собрать тестовый прототип, чтобы появилось понимание, как RSocket работает изнутри. Но попробуй найди эту информацию.

Этап анализа и разработки превратился в бесконечные ресёрчи с долгим поиском информации по теме. Реальных примеров почти нет, а статьи (как англоязычные, так и русскоязычные) чаще всего приводят просто абстрактные примеры использования. Выжать практику из теоретических статей сопоставимо с попыткой нарисовать сову по мануалу из трех шагов.

Поэтому, когда мы закончили проект, то решили восполнить (или попытаться) этот пробел в русскоязычной среде на реальном примере. Надеемся, что эта статья поможет вам разобраться в применении RSocket over WebSocket и сократит время на погружение :) 

Читать далее
Total votes 21: ↑21 and ↓0 +21
Comments 2

Хороший ретрай, плохой ретрай, или История одного падения

Level of difficulty Medium
Reading time 17 min
Views 36K

Порой простое и очевидное решение может потянуть за собой хвост проблем в будущем. Например, добавление ретраев.

Меня зовут Денис Исаев, и я работаю в Яндекс Go. Сегодня я поделюсь опытом решения проблем с отказоустойчивостью из-за ретраев. Основано на реальных инцидентах в системе из 800 микросервисов.

Этот пост — продолжение вымышленных историй о разработчике Васе, который несколько лет назад разбирался с идемпотентностью в распределённых системах. Теперь перед ним новые задачи — получится ли справиться с ними в этот раз? Давайте узнаем.

Читать далее
Total votes 152: ↑152 and ↓0 +152
Comments 32

Разбираем TLS по байтам. Кто такой этот HTTPS?

Level of difficulty Medium
Reading time 32 min
Views 22K


Подключение к сайту бывает защищённым, а бывает нет — это надо знать всем детям. Только мало детей знают, что это значит и как работает.

Я, изучая веб-разработку, узнал об HTTP. Разобраться в нём несложно: в каждой статье о протоколе множество наглядных примеров запросов и ответов. Затем узнал о схеме HTTPS, с которой всё не так наглядно. В ней используется то ли SSL, то ли TLS, и что-то где-то шифруется, и зачем-то нужны какие-то сертификаты. Короче, всё расплывалось в тумане: где пример ответа, запроса, сертификата, как его создать, зачем он нужен и почему гайд по созданию http-сервера уже написал каждый школьник, а https-сервер — недоступная для начинающих разработчиков роскошь?

В связи с этим, предлагаю обсудить протокол TLS и его роль в вебе. Статья состоит из двух частей. В первой поговорим о защите соединения: от чего и как защищаемся, почему именно так, а не иначе, сколько и каких ключей для этого нужно, и разберёмся с системой сертификатов; а в конце создадим свой сертификат и посмотрим, как его использовать для разработки.

Во второй обсудим, как это дело реализуется в протоколе TLS и разберём формат TLS-пакетов по байтам. Статьи рассчитаны в первую очередь на изучающих веб-разработку, знакомых с HTTP и жаждущих осознать, кто такое https. Но материал актуален для любых применений TLS, будь то веб или не веб.
Читать дальше →
Total votes 62: ↑61 and ↓1 +60
Comments 21

Как на самом деле работает Java ClassLoader system? (с картинками) — Часть 1/3, Загрузка

Level of difficulty Medium
Reading time 7 min
Views 15K

Так ли на самом деле работает процесс загрузки классов, как его описывает Wikipedia и Baeldung? ClassNotFoundException — это откуда и чье? Какие виды загрузчиков классов актуальны в Java 20?

Объясняем подпроцесс загрузки, из системы Java ClassLoader, на приятных Excalidraw диаграммах, со ссылками на оригинальные источники.

Читать далее
Total votes 21: ↑21 and ↓0 +21
Comments 12

Руководство по возможностям языка Java версий 8-19

Level of difficulty Easy
Reading time 18 min
Views 31K

Вы можете использовать это руководство для получения практической информации о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (Adoptium, AdoptOpenJdk, OpenJDK, OracleJDK и т. д.), а также получить обзор функций языка Java, включая версии 8–19.

Читать далее
Total votes 39: ↑37 and ↓2 +35
Comments 10

Как программист настроил автоматическое развертывание бекенда с базой данных

Reading time 11 min
Views 12K

Всем привет, хабровчане и гости сайта

Сегодня решил рассказать о своем опыте, как я при помощи docker-compose и bash скрипта настроил развертывание бекенд приложения с базой данных.

Какая была идея? Хотелось при помощи одной команды в терминале разворачивать Java приложение с базой данных так, чтобы можно было передать все необходимые переменные в момент запуска и нигде не хранить их.
Так, чтобы можно было развернуть новую версию приложения даже с телефона, просто заранее заготовив необходимую команду.

Как получилось в итоге:
в корне проекта лежит баш скрипт, который принимает переменные окружения, которые нужны для запуска бекенда и базы данных. Там внутри никаких захардкодженных данных нет, что позволяет нам запускать где угодно и с какими угодно настройками.

Путь к этому был сложен и тернист для меня. С большой вероятностью можно было сделать легче и проще, если б я занимался этим каждый день, но сделал как умел и как предполагал возможным. Поэтому все, кто имеет что сказать поэтому поводу, приглашаются в комментарии.

Дело было так...
Total votes 10: ↑7 and ↓3 +4
Comments 21

Глубокое погружение в Java Memory Model

Reading time 53 min
Views 123K


Я провел в изучении JMM много часов и теперь делюсь с вами знаниями в простой и понятной форме.


В этой статье мы подробно разберем Java Memory Model (JMM) и применим полученные знания на практике. Да, в интернете накопилось достаточно много информации про JMM/happens-before, и, кажется, что очередную статью про такую заезженную тему можно пропускать мимо. Однако я постараюсь дать вам намного большее и глубокое понимание JMM, чем большинство информации в интернете. После прочтения этой статьи вы будете уверенно рассуждать о таких вещах как memory ordering, data race и happens-before. JMM — сложная тема и не стоит верить мне на слово, поэтому большинство моих утверждений подтверждается цитатами из спеки, дизассемблером и jcstress тестами.

Читать дальше →
Total votes 109: ↑109 and ↓0 +109
Comments 60

Создание нативных CLI приложений на Java с помощью Graalvm и Picocli

Reading time 15 min
Views 7.1K

Язык программирования Go стал популярным для написания приложений командной строки. Для этого может быть много причин, но один аспект, в котором выделяется Go, - это возможность скомпилировать программу в один нативный исполняемый файл. Это значительно упрощает распространение программы.

Программы Java традиционно было трудно распространять, потому что они требовали, чтобы на целевой машине была установлена ​​виртуальная машина Java. Можно связать с приложением последнюю JVM, но это увеличивает размер пакета примерно на 200 МБ.

Все движется в правильном направлении: система модулей Java (JPMS), представленная в Java 9, включает утилиту jlink, позволяющую приложению создавать настраиваемую, минимизированную JRE, размер которой может составлять всего 30-40 МБ, и Java. 14 включает jpackage, которая может создать установщик, содержащий этот минимальный JRE с вашим приложением.

Тем не менее, для приложений командной строки установщик не идеален. В идеале мы хотим распространять нашу утилиту CLI как «настоящий» нативный исполняемый файл без упакованной среды выполнения. GraalVM позволяет нам делать это с помощью программ, написанных на Java.

Читать далее
Total votes 15: ↑13 and ↓2 +11
Comments 4

Возможности Java — от Java 8 до Java 17

Reading time 19 min
Views 28K

С момента появления в 1995 году до сегодняшнего дня в Java многое изменилось. Java 8 была революционным выпуском, вернувшим Java на пьедестал лучших языков программирования.

Мы рассмотрим большинство изменений в языке Java, которые произошли с Java 8 в 2014 году до сегодняшнего дня. Мы постараемся быть как можно более краткими по каждой функции. Намерение состоит в том, чтобы иметь ссылку на все новые фичи языка Java 8 - 17 включительно.

Примечание переводчика,

Эта статья переведена по просьбе одного из читателей Хабр. Надеюсь она будет полезна как краткий справочник по новым фичам языка Java 8 - 17.

Читать далее
Total votes 20: ↑13 and ↓7 +6
Comments 12

Шесть лет «Хаябусы-2»

Reading time 10 min
Views 32K
Может быть, в фантастике вам попадался такой сюжет: на орбите планеты появляется враждебный космический флот, бомбит ее и обстреливает, высаживает десант, а потом улетает с награбленным. Поразительно, но в современной космонавтике есть почти полный аналог — японский аппарат «Хаябуса-2» вышел на орбиту астероида Рюгу, затем высадил на его поверхность три ровера, сбросил кумулятивную бомбу, сделал по астероиду два выстрела и улетел на Землю с образцами, доставив их 5 декабря 2020. И все это было сделано с мирными целями во имя науки.


«Хаябуса-2» в 21 метре над астероидом, фото JAXA
Читать дальше →
Total votes 172: ↑172 and ↓0 +172
Comments 30

Deep dive into PostgreSQL internal statistics. Алексей Лесовский

Reading time 24 min
Views 7.7K

Расшифровка доклада 2015 года Алексея Лесовского "Deep dive into PostgreSQL internal statistics"


Disclaimer от автора доклада: Замечу что доклад этот датирован ноябрем 2015 года — прошло больше 4 лет и прошло много времени. Рассматриваемая в докладе версия 9.4 уже не поддерживается. За прошедшие 4 года вышло 5 новых релизов в которых появилась масса новшеств, улучшений и изменений относительно статистики и часть материала устарела и не актуальна. По мере ревью я постарался отметить эти места чтобы не вводить тебя читатель в заблуждения. Переписывать же эти места я не стал, их очень много и получится в итоге совсем другой доклад.


СУБД PostgreSQL — это огромный механизм, при этом состоит этот механизм из множества подсистем, от слаженной работы которых напрямую зависит производительность СУБД. В процессе эксплуатации обеспечивается сбор статистики и информации о работе компонентов, что позволяет оценить эффективность PostgreSQL и принять меры для повышения производительности. Однако, этой информации очень много и представлена она в достаточно упрощенном виде. Обработка этой информации и ее интерпретация порой совсем нетривиальная задача, а "зоопарк" инструментов и утилит запросто поставит в тупик даже продвинутого DBA.

Total votes 13: ↑13 and ↓0 +13
Comments 2

Измеряем скорость кода Java правильно (используя JMH)

Reading time 7 min
Views 50K

Привет, Хабр!


Это вводная статья про то, как следует делать тесты производительности на JVM языках (java, kotlin, scala и тд.). Она полезна для случая, когда требуется в цифрах показать изменение производительности от использования определенного алгоритма.


Все примеры приведены на языке kotlin и для системы сборки gradle. Исходный код проекта доступен на github.


КДВП

Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Comments 8

Плагинное приложение на Java без боли

Reading time 8 min
Views 12K
В этой статье я хотел бы рассказать, как быстро и просто сделать каркас приложения на Java с поддержкой динамической загрузки плагинов. Читателю наверняка сразу в голову придёт, что такая задача уже давно решена, и можно просто использовать готовые фреймворки или написать свой загрузчик классов, но в предлагаемом мною решении ничего этого не потребуется:

  • Нам не понадобятся специальные библиотеки или фреймворки (OSGi, Guice и т.п.)
  • Мы не будем использовать парсинг байткода с помощью ASM и подобных библиотек.
  • Не будем писать свой загрузчик классов.
  • Не будем использовать рефлексию и аннотации.
  • Не понадобится возня с classpath для поиска плагинов. Мы вообще не будем трогать classpath.
  • Также мы не будем использовать XML, YAML или какие-либо другие декларативные языки для описания точек расширений (extension point’ов в плагинах).

Однако всё же есть одно требование — такое решение будет работать только на Java 9 или выше. Потому что оно будет основано на модулях и сервисах.
Читать дальше →
Total votes 24: ↑22 and ↓2 +20
Comments 49

Что не так с федеральным законом «Об электронной подписи» (63-ФЗ), и как это можно исправить

Reading time 24 min
Views 43K

Рисовальная машина за работой, © axisdraw.com

Электронная подпись в России впервые появилась в январе 2002 года вместе с принятием первого закона «Об электронной цифровой подписи» (1-ФЗ). Затем, спустя 9 лет, в апреле 2011 появился новый закон «Об электронной подписи» (63-ФЗ). Спустя еще 8 лет, в начале лета 2019, в СМИ стали появляться леденящие душу публикации о том, как с помощью электронной подписи воруют квартиры, как мошенники оформляют на ничего не подозревающих граждан фиктивные фирмы, и так далее, и тому подобное.

Давайте без лишних эмоций попробуем разобраться в сложившихся проблемах и подумаем, как их можно исправить.

Читать дальше →
Total votes 51: ↑50 and ↓1 +49
Comments 182

Байт-машина для форта (и не только) по-индейски (часть 2)

Reading time 16 min
Views 3.6K
image

Продолжим эксперименты с байт-кодом. Это продолжение статьи о байт-машине на ассемблере, вот первая часть.

Вообще, я планировал во второй части сделать интерпретатор форта, а в третьей — компилятор форта для этой байт-машины. Но объем, который получался для статьи, оказался очень велик. Что бы сделать интерпретатор, надо расширить ядро (набор байт-команд), и реализовать: переменные, парсинг строк, ввод строк, словари, поиск по словарям… Ну и должен работать хотя бы вывод чисел. В результате, я решил разбить статью об интерпретаторе на две. Поэтому, в этой статье мы расширим ядро, определимся с переменными, сделаем вывод чисел. Дальше примерный план такой: 3-я часть — интерпретатор, 4-я — компилятор. И, конечно же, тесты быстродействия. Они будут в 4-й или 5-й статье. Эти статьи будут уже после нового года.

А кто еще не испугался страшного ассемблера и байт-кода — добро пожаловать под кат! :)
Читать дальше →
Total votes 14: ↑14 and ↓0 +14
Comments 16

В любой непонятной ситуации — пиши скрипты

Reading time 10 min
Views 8.7K
image

Скрипты — один из самых распространенных способов сделать приложение более гибким, с возможностью поправить что-то прямо на ходу. Конечно же, у этого подхода есть и недостатки, нужно всегда помнить про баланс между гибкостью и управляемостью. Но в этой статье мы не будем рассуждать “в общем” по поводу плюсов и минусов использования скриптов, мы рассмотрим практические способы реализации этого подхода, а также представим библиотеку, которая предоставляет удобную инфраструктуру для добавления скриптов в приложения, написанные на Spring Framework.
Читать дальше →
Total votes 14: ↑14 and ↓0 +14
Comments 3

Про версии Oracle JDK 11+ (лицензирование и распространение)

Reading time 4 min
Views 28K
Вчера на Хабре был опубликован перевод поста «Не попадитесь в ловушку используя Oracle JDK 11» с последующим обсуждением «платности Java», но не всё так страшно, как кажется на первый взгляд — ниже перевод публикации из блога Oracle с официальной позицией по лицензированию и распространению версий JDK 11+.

Резюме


Начиная с Java 11, Oracle будет выпускать JDK под лицензией GNU General Public License v2, with the Classpath Exception (GPLv2+CPE) и под коммерческой лицензией для тех, кто использует Oracle JDK как часть продуктов или сервисов Oracle, или кто не хочет использовать открытое программное обеспечение. Эта комбинация из OS-лицензии и коммерческой заменяет старую лицензию BCL (Oracle Binary Code License), которая состоит из коммерческих и бесплатных условий использования.

Для каждой лицензии будут предоставляться отдельные сборки, но эти сборки будут идентичны функционально, кроме некоторых косметических различий и различий в способе упаковки бинарников, подробно описанных ниже.
Читать дальше →
Total votes 17: ↑17 and ↓0 +17
Comments 1

90 новых фич (и API) в JDK 11

Reading time 15 min
Views 70K

Привет, Хабр! Представляю вашему вниманию перевод статьи «90 New Features (and APIs) in JDK 11» от автора Simon Ritter.



Новый шестимесячный релизный цикл JDK для многих означает, что некоторые ещё даже не выяснили, какие новые функции в JDK 10, а на пороге уже JDK 11. В одном из ранних блогов (англ.), были перечислены все 109 новых фич и API, которые удалось найти в JDK 10. Поэтому для JDK 11 было решено поступить аналогично. Тем не менее, был выбран другой формат. Этот пост будет поделён на два раздела: новые фичи, которые доступны разработчикам (публичный API) и всё остальное. Таким образом, если вас интересует только то, что непосредственно повлияет на вашу разработку, вы можете пропустить вторую часть.


Общее число изменений, которое удалось подсчитать, получилось равным 90 (это JEP плюс новые классы и методы, исключая отдельные методы для HTTP-клиента и Flight Recorder) (прим. переводчика: Java Flight Recorder (JFR) был одним из коммерческих дополнений от Оракла встроенным в JDK, но начиная с Java 11, благодаря JEP 328, был передан в опенсорс). Хоть и в JDK 11 удалось найти на одиннадцать изменений меньше, чем в JDK 10, считаю, что справедливо сказать, что в JDK 11 добавлено больше функциональных возможностей, однозначно на уровне JVM.

Читать дальше →
Total votes 21: ↑21 and ↓0 +21
Comments 6

Не попадитесь в ловушку используя Oracle JDK 11

Reading time 2 min
Views 174K
Привет, Хабр! Представляю вашему вниманию перевод статьи «Do not fall into Oracle's Java 11 trap» автора Stephen Colebourne.

Java 11 была официально выпущена. Это мажорный релиз, имеющий долгосрочную поддержку (LTS — long-term support). Однако Oracle приготовила ловушку (намеренно или случайно).

Ловушка


В течение 23 лёт разработчики привыкли загружать JDK с сайта Oracle и использовать его бесплатно. Введите «JDK» в свою любимую поисковую систему, и верхняя ссылка будет вести на страницу загрузки Oracle Java SE (я намеренно не предоставляю ссылку). Но этот запрос и эта ссылка теперь являются ловушкой.

Oracle JDK, на который ссылаются почти все поисковые запросы, теперь является коммерческим, и не является бесплатным.
Читать дальше →
Total votes 54: ↑50 and ↓4 +46
Comments 69

Выгружаем данные в Excel. Цивилизованно

Reading time 9 min
Views 67K
Есть в IT-отрасли задачи, которые на фоне успехов в big data, machine learning, blockchain и прочих модных течений выглядят совершенно непривлекательно, но на протяжении десятков лет не перестают быть актуальными для целой армии разработчиков. Речь пойдёт о старой как мир задаче формирования и выгрузки Excel-документов, с которой сталкивался каждый, кто когда-либо писал приложения для бизнеса.



При чём тут ксилофон?!
Total votes 23: ↑23 and ↓0 +23
Comments 27

Information

Rating
Does not participate
Location
Екатеринбург, Свердловская обл., Россия
Date of birth
Registered
Activity

Specialization

Backend Developer
Lead
Java
OOP
Java Spring Framework
Hibernate
PostgreSQL
SQL
REST