Обновить
512K+

Java *

Объектно-ориентированный язык программирования

207,7
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Поддержка Null в Protobuf

Время на прочтение9 мин
Охват и читатели37K

Что значит значение равно null?

Проблема в том, что null может обозначать разные вещи в разных контекстах:

- Null — это null.

- Null — значение опционально / не установлено.

- Null — значение по умолчанию.

- Null — перепутано с другим значением.

Чтобы избежать этой путаницы, разработчики protobuf решили не сериализовать null. Вместо этого protobuf принуждает вас использовать одну из явных стратегий, избегая тем самым семантической путаницы в вашем Protobuf / gRPC API.

Читать далее

Итак, вы хотите оптимизировать gRPC. Часть 1

Время на прочтение10 мин
Охват и читатели6.5K

Часто возникает вопрос о том, как ускорить gRPC. gRPC позволяет реализовать высокопроизводительный RPC, но не всегда понятно как достичь этого быстродействия. И я решил попытаться показать ход своих мыслей при оптимизации программ.

Рассмотрим простой сервис "ключ-значение", который используется несколькими клиентами. Сервис должен корректно работать при параллельных операциях изменения данных. Также должна быть возможность масштабирования. И, в конце концов, он должен быть быстрым. Для реализации подобного сервиса gRPC будет идеальным вариантом. Давайте посмотрим, как его реализовать.

Я написал пример клиента и сервера на Java. В примере три основных класса и protobuf-файл, описывающий API:

Читать далее

Реактивное программирование на Java: как, зачем и стоит ли? Часть II

Время на прочтение15 мин
Охват и читатели100K

Реактивное программирование — один из самых актуальных трендов современности. Обучение ему — сложный процесс, особенно если нет подходящих материалов. В качестве своеобразного дайджеста может выступить эта статья. На конференции РИТ++ 2020 эксперт и тренер Luxoft Training Владимир Сонькин рассказал о фишках управления асинхронными потоками данных и подходах к ним, а также показал на примерах, в каких ситуациях нужна реактивность, и что она может дать.

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

Читать далее

Как использовать GraphHopper для построения пешеходных маршрутов по собственным правилам

Время на прочтение5 мин
Охват и читатели11K

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

Решений, для построения маршрута тоже немало, в том числе существует GraphHopper, который умеет строить маршруты, и для автомобилей, и для пешеходов, и даже для пешего туризма, - подойдёт в 99% случаев.

Далее речь пойдёт том, что делать в оставшемся 1% ситуаций, точнее о моём опыте использования GraphHopper, когда существующее решение не подходило. Требовалось учитывать дополнительные ограничения: строить пешеходные маршруты для людей с ограниченными возможностями. Не будет ни каких значимых особенностей реализации именно этой задачи. Максимально обобщённо.

Будет описано, как создать на основе библиотеки GraphHopper свой веб–сервис, который, по координатам начала и окончания пути, вернёт массив координат маршрута.

Пример приложения, со всеми необходимыми для запуска заглушками, можно найти в моём репозитории на GitHub.

Читать далее

Android — ViewPager2 — заменяем фрагменты на лету (программно)

Время на прочтение7 мин
Охват и читатели11K

Вдруг вам надо листать фрагменты через ViewPager2 и при этом подменять их динамически. Например, чтобы уйти "глубже" - пользователь из фрагмента "Главные настройки" переходит во фрагмент "Выбор языка".

При этом новый фрагмент должен отобразиться на месте предыдущего фрагмента. А потом пользователь еще и захочет вернуться обратно...

Читать далее

11 вопросов на собеседовании по Spring Boot, которые заставляют задуматься

Время на прочтение7 мин
Охват и читатели67K

Большинство списков вопросов интервью по Spring Boot заставляют вас запоминать случайные детали из документации Spring Boot. Но запоминание — плохая замена истинному пониманию и уверенности в знании Spring Boot.

Поэтому сегодня мы собираемся применить другой подход. Вместо того, чтобы перечислять 50 вопросов по мелочам Spring Boot, мы сосредоточимся на 11, которые заставят вас задуматься и, таким образом, многому научиться на этом пути.
Вот они, в произвольном порядке.

Примечание: если вы сами проводите интервью по Spring Boot, возможно, вы захотите задать эти вопросы в открытом формате, ведущем к обсуждениям вместо того, чтобы ожидать ответов из учебников.

Читать далее

REST API с использованием Spring Security и JWT

Время на прочтение14 мин
Охват и читатели106K

Рано или поздно каждый Java-разработчик столкнется с необходимостью реализовать защищенное REST API приложение. В этой статье хочу поделиться своей реализацией этой задачи.

Читать далее

Мониторинг производительности приложений в Broadcom DX APM — анонс вебинара

Время на прочтение1 мин
Охват и читатели944
image

Единый агент для всех популярных технологий, динамическое отслеживание изменений инфраструктуры, низкий оверхед, искусственный интеллект, оценка эффективности релизов, контекстный мониторинг, мониторинг реальных транзакций — обо всём этом и многом другом вы узнаете на вебинаре, посвящённому инструменту для мониторинга производительности приложений и инфраструктуры под ними Broadcom DX APM. Вебинар состоится 5 марта в 11 часов утра по московскому времени.

Под катом вы найдёте квадрант Gartner за 2020 год по APM-решениям и дополнительные материалы по DX APM и другим решениям Broadcom.
Читать дальше →

Краткое сравнение JUnit и TestNG

Время на прочтение10 мин
Охват и читатели37K

JUnit и TestNG, несомненно, являются двумя наиболее популярными фреймворками для модульного тестирования (юнит-тестирования) в экосистеме Java. Хотя JUnit послужил вдохновением для TestNG, второй имеет ряд отличий и, в отличие от JUnit, работает для функционального и более высоких уровней тестирования.

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

Читать далее

Еще раз о регекспах, бэктрекинге и том, как можно положить на лопатки JVM двумя строками «безобидного» кода

Время на прочтение6 мин
Охват и читатели12K

Раннее утро, десятая чашка кофе, безуспешные попытки понять почему ваше клиентское (или еще хуже – серверное) java-приложение намертво зависло при вычислении простого регекспа на небольшой строке… Если подобная ситуация уже возникала в вашей жизни, вы уже наверняка знаете про бэктрекинг и темную сторону регулярных выражений. Остальным – добро пожаловать под кат!

Читать далее

Pattern matching в Java 8

Время на прочтение9 мин
Охват и читатели14K
Многие современные языки поддерживают сопоставление с образцом (pattern matching) на уровне языка.

Язык Java не является исключениям. И в Java 16 будет добавлено поддержка сопоставление с образцом для оператора instanceof, как финальной фичи.

В будущем надеемся, что сопоставление с образцом будем расширено и для других языковых конструкций.
Читать дальше →

Шаблон Kotlin микросервисов

Время на прочтение3 мин
Охват и читатели8.8K

Для разработчиков не секрет, что создание нового сервиса влечет за собой немало рутиной настройки: билд скрипты, зависимости, тесты, docker, k8s дескрипторы. Раз мы выполняем эту работу, значит текущих шаблонов IDE недосточно. Под катом мои попытки автоматизировать все до одной кроссплатформенной кнопки "сделать хорошо" сопровождаемые кодом, примерами и финальным результатом.

Если перспективы создания сервисов в один клик с последующим автоматическим деплоем в Digital Ocean звучат заманчиво, значит эта статья для вас.

Читать далее

Как использовать шаблон Circuit Breaker в приложении Spring Boot

Время на прочтение11 мин
Охват и читатели37K

В этом посте я покажу, как мы можем использовать шаблон Circuit Breaker в приложении Spring Boot. Когда я говорю «шаблон Circuit Breaker» имеется в виду архитектурный шаблон автоматического выключателя. Netflix опубликовал библиотеку Hysterix для работы с автоматическими выключателями. В рамках этого поста я покажу, как мы можем использовать шаблон автоматического выключателя, используя библиотеку resilence4j в приложении Spring Boot.

Читать далее

Ближайшие события

Как катать релизы несколько раз в день и спать спокойно. Доклад Яндекса

Время на прочтение9 мин
Охват и читатели9.4K
Высокие темпы разработки сопряжены с рисками, влияющими на отказоустойчивость и стабильность — особенно если хочется экспериментировать и пробовать разное. Разработчик Маркета Мария Кузнецова рассказала о релизном цикле своей команды от и до, а также о мониторингах и других вещах, позволяющих обновлять сервис со скоростью три релиза в день.



— Всем привет! Я представляю бэкенд-разработку курьерской платформы. Поговорить хочу о том, как нам удается, с одной стороны, двигаться быстро, а, с другой стороны, не потонуть в ворохе и потоке проблем и ошибок.
Читать дальше →

Использование Google Protocol Buffers (protobuf) в Java

Время на прочтение8 мин
Охват и читатели43K

Недавно вышло третье издание книги "Effective Java" («Java: эффективное программирование»), и мне было интересно, что появилось нового в этой классической книге по Java, так как предыдущее издание охватывало только Java 6. Очевидно, что появились совершенно новые разделы, связанные с Java 7, Java 8 и Java 9, такие как глава 7 "Lambdas and Streams" («Лямбда-выражения и потоки»), раздел 9 "Prefer try-with-resources to try-finally" (в русском издании «2.9. Предпочитайте try-с-ресурсами использованию try-finally») и раздел 55 "Return optionals judiciously" (в русском издании «8.7. Возвращайте Optional с осторожностью»). Но я был слегка удивлен, когда обнаружил новый раздел, не связанный с нововведениями в Java, а обусловленный изменениями в мире разработки программного обеспечения. Именно этот раздел 85 "Prefer alternatives to Java Serialization" (в русском издании «12.1 Предпочитайте альтернативы сериализации Java») и побудил меня написать данную статью об использовании Google Protocol Buffers в Java.

Читать далее

Кастомная (де) сериализация даты и времени в Spring

Время на прочтение4 мин
Охват и читатели10K

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

1)      При получении запроса привести дату к серверному времени и сохранить в базу данных в таком виде

2)      В ответ возвращать дату и время с указанием серверного часового пояса

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

Читать далее

Запись событий Spring при тестировании приложений Spring Boot

Время на прочтение7 мин
Охват и читатели17K

Одна из основных функций Spring - функция публикации событий. Мы можем использовать события для разделения частей нашего приложения и реализации шаблона публикации-подписки. Одна часть нашего приложения может публиковать событие, на которое реагируют несколько слушателей (даже асинхронно). В рамках Spring Framework 5.3.3 (Spring Boot 2.4.2) теперь мы можем записывать и проверять все опубликованные события ( ApplicationEvent) при тестировании приложений Spring Boot с использованием @RecrodApplicationEvents.

Читать далее

Методы расширения в Java

Время на прочтение3 мин
Охват и читатели21K


В таких языках программирования, как C#, Kotlin, Groovy, Scala есть возможность расширять класс путем добавления нового функционала, при этом не требуется наследование или изменение самого изначального класса. Это реализовано с помощью специальных выражений, называемых расширения. Java, в отличие от этих языков, не имеет такой возможности из коробки и даже не планирует в ближайших релизах. Благодаря Lombok это стало возможным. Методы расширения были реализованы в Lombok еще 8 лет назад (с поддержкой Eclipse), но для многих все упиралось в поддержку плагином в IDEA (код компилировался, но IDE его не распознавала как валидный). Lombok плагин теперь предустановлен в IDEA 2021.1 EAP, и теперь он поддерживает методы расширения lombok (спасибо Anna Kozlova, Tagir Valeev, NekoCaffeine и Michail Plushnikov).
Рассмотрим пример классического статического импорта:


import static org.apache.commons.lang3.StringUtils.capitalize;

public class ExtensionMethods {
    public static void main(String[] args) {
        String str = "test";
        String capitalized = capitalize(str);
        // "Test"
        System.out.println(capitalized);
    }
}

при переходе на метод расширения код станет выглядеть так:


import lombok.experimental.ExtensionMethod;
import org.apache.commons.lang3.StringUtils;

@ExtensionMethod(StringUtils.class)
public class ExtensionMethods {
    public static void main(String[] args) {
        String str = "test";
        String capitalized = str.capitalize();
        // "Test"
        System.out.println(capitalized);
    }
}
Читать дальше →

Реактивное программирование на Java: как, зачем и стоит ли? Часть I

Время на прочтение12 мин
Охват и читатели63K

Идея реактивного программирования появилась сравнительно недавно, лет 10 назад. Что вызвало популярность этого относительно нового подхода и почему сейчас он в тренде, рассказал на конференции РИТ++ 2020 эксперт и тренер Luxoft Training Владимир Сонькин. 

В режиме мастер-класса он продемонстрировал, почему так важен неблокирующий ввод-вывод, в чем минусы классической многопоточности, в каких ситуациях нужна реактивность, и что она может дать. А еще описал недостатки реактивного подхода.

Читать далее

Программируемые NER (Named Entity Recognition) компоненты

Время на прочтение6 мин
Охват и читатели4.4K

В данной заметке мы продолжим говорить о NER компонентах и попытаемся  определить условия, в которых нам начинает недоставать функционала стандартных компонентов и стоит задуматься о программировании своих собственных.

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

Читать далее