• Как понять микросервисы?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Микросервисы пишут не для того, чтобы просто переделать API.

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

    А уже исходя из этой точки зрения:

    1. Если у каждого сервиса есть свой api, зачем API Gateway (точка входа), можно же на nginx сделать обращение по location на нужный api?

    А если нужно много экземпляров, будете одним nginx-ом раскидывать по 10 локейшенам? Микросервисы в современном мире предполагается запускать в докере на собственном легковесном веб-сервере (типа Jetty), поднимать нужное количество экземпляров и балансировать чем-нибудь на входе, но не по локейшенам.

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

    РаббитMQ или kafka позволяют множеству экземпляров вашего сервиса обрабатывать сообщения, с гарантией того, что из очереди ничего не пропадет, и если какой-то экземпляр сдохнет, то этот запрос обработает другой экземпляр. Именно ждать ответ наверное не самое правильное, но это можно смотреть как вам удобнее - периодически опрашивать очередь, или настроить чтобы message service сам пушил по событию.

    3. Например делаем микросервис по авторизации пользователя и регистрации. У него должна быть своя база данных? Как например в админке обращаться к пользователям, чтобы их добавить или заблокировать, я должен запрашивать пользователей с микросервиса? Получается микросервис отвечающий за пользователей CRUD + Регистрация, авторизация, сброс пароля?

    Это как вы хотите. Если у вас очень много пользователей и авторизация тормозит, но можно сделать микросервис с авторизацией, сделать кластер базы данных с репликацией. Дальше можете балансировать пользователей и там уже решать как их раскидывать. Или база мощная и все экземпляры могут работать с кластером. Или делите базу на части, и раскидываете пользователей по алфавиту (база юзеров от A* до H*, база юзеров от I* до M*, по региону или как вам нравится).

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

    Второй немаловажный плюс микросервисов - работать над небольшим микросервисом проще, чем над крупным монолитом. Упрощается его поддержка рефакторинг. То есть в конечном счете упрощается требования к квалификации программиста. Но усложняется общая архитектура проекта, то есть на сеньоров/техлидов нагрузка возрастает.
    Ответ написан
    Комментировать
  • Как правильно задать паттерн для даты в java?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Ну, допустим, я что-то понял (я же эксперт))...

    Можно задавать формат даты в джейсоне таким образом:

    1. Пишем свой конвертер.
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.type.TypeFactory;
    import com.fasterxml.jackson.databind.util.Converter;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    import static org.apache.http.util.TextUtils.isBlank;
    
    public class CustomStringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
    
        @Override
        public LocalDateTime convert(String value) {
            if (isBlank(value)) return null;
            var formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;  // Вот тут задается формат даты
            return LocalDateTime.parse(value, formatter);
        }
    
        @Override
        public JavaType getInputType(TypeFactory typeFactory) {
            return typeFactory.constructType(String.class);
        }
    
        @Override
        public JavaType getOutputType(TypeFactory typeFactory) {
            return typeFactory.constructType(LocalDateTime.class);
        }
    }


    2. Добавляем аннотацию над нужным полем:
    class WithDate {
        @JsonDeserialize(converter = CustomStringToLocalDateTimeConverter.class)
        private LocalDateTime startTime;
    }
    Ответ написан
    2 комментария
  • Как понять микросервисы?

    @deliro
    Как понять микросервисы?

    Прочитать соответствующую книгу (а лучше ещё парочку про DDD или хотя бы посмотреть этот доклад)

    Затем ответить на несколько вопросов:
    1. Почему вы решили, что микросервисы что-то вам дадут?
    2. Есть ли у вас настоящие причины для микросервисной архитектуры? (А именно: зоопарк технологий с невозможностью написать 99% на одном языке; более тысячи разработчиков; сложность выкатки монолита в виде часов прогонов CI/CD — тестов, билда, деплоя, стопоров выкатки в виде кучи проблем из-за разработчиков; вы такие же большие как гугл, убер, амазон и т.п.). Или вам просто нравится модное слово "микросервисы"?

    Не получится создать хорошую микросервисную архитектуру без умения создать хороший модульный монолит. В этом случае вы получите не только все проблемы плохого монолита: высокая связанность, каскадные падения, долгий CI/CD; но и все проблемы микросервисов: их надо оркестрировать (у вас же есть команда, которая будет поддерживать инфраструктуру?); каждому микросервису нужно своё CI/CD (и хорошее); сеть может (и будет) лагать и обрываться; длительность запросов увеличится на порядок(ки) (особенно если выбрать какой-нибудь JSON-RPC over HTTP); нужно предусмотреть failover strategy (например, идемпотентные ретраи. Вы же уже знаете про correlation id, саги и что делать, если прилетел network error на запрос в другой сервис "списать 10 баксов"?) и circuit breakers; трейсы и логи, которые не пришлось бы искать по сотням .log файлов от каждого сервиса; бизнес-логика расползётся по разным микросервисам и нарушит SRP (пофиг, что нарушит, важнее то, что это починить будет сильно сложнее). Список можно продолжать долго.
    Ответ написан
    11 комментариев
  • Как заставить запуститься Android Studio?

    BorLaze
    @BorLaze
    Java developer
    - JRE 1.8.0
    - JDK 1.7.0


    снеси, и поставь только одну jdk 1.8.0
    любая JDK содержит в себе JRE

    JAVA_HOME должен указывать на каталог, куда установлен JDK
    Ответ написан
    1 комментарий
  • Как проверить тип данных в Java через if?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Тип переменной проверяют через instanceof

    Object r = 13.1;
    if (r instanceof Double) {
        System.out.println("matches double");
    }


    Распознать же строку как double можно, например, с помощью регулярки

    String example = "1331.2";
    if (Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) example)) {
        System.out.println("matches double");
    }


    Можно найти какую-нибудь библиотеку, можно самому написать метод, посимвольно перебирающий строку. А можно просто воспользоваться Double.parseDouble(), не такой уж он и громоздкий.
    Ответ написан
    4 комментария
  • Как получить доступ к методу класса с модификатором private static из другого класса?

    BorLaze
    @BorLaze
    Java developer
    DeNissss4444, тестировать можно (и нужно) только то, что из класса "доступно миру".

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

    Значение имеют только доступные извне методы.

    Грубо говоря - если у тебя есть публичный метод сортировки массива пузырьком sort(), и в нем вызывается приватный метод swap(), то тебе не нужно тестировать, правильно ли работает обмен. Тестируй сортировку. Потому что завтра ты перепишешь сортировку на что-то более кошерное, и у тебя вместо swap() появится какой-нибудь join().

    Важно лишь, чтобы sort() возвращал правильное значение.
    Ответ написан
    1 комментарий
  • Как работает Scanner scanner в виде параметра метода?

    axifive
    @axifive
    Software Engineer
    В метод просто передается объект Scanner, смотрите откуда он считывает.
    Системный ввод можно так передать:
    convert(new Scanner(System.in), 1.55)
    Ответ написан
    Комментировать
  • Тестирование сервиса, можно ли создавать отдельный класс для хранения объектов тестирования или это плохая практика?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Можно и так.
    Я видел как некоторые ребята пишут DSL для тестов. (Типа: User user = ObjectFather.getDefaultUser().with ... .please())
    Ну а мне больше нравится тестовые данные хранить в виде джейсонов: джейсон легко хранить, легко просматривать, дегко преобразовывать в объект.
    Ответ написан
    2 комментария
  • Как настроить безостановочную работу java maven приложения в Jenkins?

    BorLaze
    @BorLaze
    Java developer
    В данной теме новичок.

    Это заметно :-)

    Потому что задача CI/CD (в частности, того же jenkins) как раз в том и состоит, чтобы
    • по триггеру (например, коммит в мастер) запустить сборку
    • скомпилировать приложение, прогнать тесты
    • в случае успеха, задеплоить собранную версию на сервер


    А работать приложение должно на сервере – Jenkins тут совершенно ни при чем.
    Ответ написан
    3 комментария
  • Что в данном случаи присваивается переменной?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Строка присваивается. Похоже, содержащая шаблон путей к ресурсам.
    Ответ написан
    Комментировать
  • Как в реальном времени передать переменную из Py в Jar?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Так же как и между любыми микросервисами: REST, MQ и т.д...
    Ответ написан
    3 комментария
  • Стоит ли писать // Given // When // Then в комментариях теста?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Код должен быть самодокументируемым
    Ответ написан
    Комментировать
  • Стоит ли писать // Given // When // Then в комментариях теста?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Если очень хочется - пишите на споке.
    https://spockframework.org/
    Ответ написан
    1 комментарий
  • Как получить доступ к owner?

    Jacen11
    @Jacen11
    никак, ты не сделал класс овнер и не сделал его полем в йтем. Как ты вообще собирался получить то что не сделал?
    Ответ написан
    Комментировать
  • Стоит ли переживать за скорость работы программы с интерфейсами?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    На производительность это никак не влияет, а вот с абстракциями можно действительно переборщить, даже термин для этого есть - оверинжиниринг
    Ответ написан
    7 комментариев
  • Как работает Comparator.comparing в Java?

    @romank0
    Стрим будет сначала сортироваться в алфавитном порядке по значению, которое возвращает `getSourceFileName`, а потом (т.е. если значения `sourceFileName` одинаковые) будет сортироваться по значению `getSourceFileLineNumber`.
    Ответ написан
    Комментировать
  • Новый метод выдаёт много true/false с последующей ошибкой "Exception in thread "main" java.lang.StackOverflowError". Как исправить?

    BorLaze
    @BorLaze
    Java developer
    "Компьютер делает не то, что вы хотели, а то, что вы приказали" :-)))

    Замени return isNegative(number); на return (number < 0); і буде тобі щастя.
    Ответ написан
    1 комментарий
  • Новый метод выдаёт много true/false с последующей ошибкой "Exception in thread "main" java.lang.StackOverflowError". Как исправить?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Метод бесконечно вызывает сам себя до исчерпания ресурсов виртуальной машины. Очевидно, делать этого не надо и тогда всё заработает.
    Ответ написан
    Комментировать
  • Новый метод выдаёт много true/false с последующей ошибкой "Exception in thread "main" java.lang.StackOverflowError". Как исправить?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Проблема в том, что метод бесконечно вызывает сам себя безо всяких условий.
    Ответ написан
    Комментировать
  • Как узнать какие версии библиотек установлены в Java проекте?

    Erik_Mironov
    @Erik_Mironov
    Старые вопросы: *Dies from cringe*
    Библиотеки могут быть добавлены в проект как в виде java-архива вручную, так и управляться системой автоматической сборки проектов по типу maven/gradle/ant. Делают абсолютно то же самое, а именно добавляют java-архивы в раздел "External Libraries" вашего проекта, в названии самого архива как правило указывается версия этой библиотеки, либо если вы пользуетесь системой авто-сборки, то версия библиотеки указывается в разметке при ее добавлении.
    Ответ написан
    Комментировать