Pull to refresh
5
0
MrCloud @Antharas

Java Backend Developer

Send message

Правильная архитектура MMO эмулятора

Reading time14 min
Views14K

Предыстория/Мотивация


Все началось с хобби в начале 2020 года — с очередной попытки написания эмулятора игрового сервера Lineage 2 "по новому". Перед этим шагом было несколько попыток распиливания монолита существующих решений на рынке по новым практикам разработки, но затея оказалась тщетной, ибо те монолиты, которые и по сей день существуют и участвуют в так называемом "продакшен-пиратстве", имеют сильную связанность компонентов и решения поставленных задач, сопоставимые с началом 2000х годов, когда сфера только начинала развиваться. А самое главное, что монолит не заточен на построение распределенной архитектуры и, как следствие, обладает низкой эффективностью.


image


Было принято решение взять часть бизнес-логики (основной составляющей обработки действий игрока) из допотопных проектов эмуляторов и создать современный/масштабируемый эмулятор игрового сервера Lineage 2 Prelude Of War.

Читать дальше →
Total votes 16: ↑15 and ↓1+15
Comments62

Spring Integration — динамические потоки данных

Reading time12 min
Views28K
Салют, Хабр! Сегодня мы разберем достаточно специфичную область — потоковая обработка данных, с помощью Spring Integration фреймворка и как сделать эти потоки в runtime без предварительной инициализации в контексте приложения. Полный пример приложения лежит в Гите.

Введение


Spring Integration — фреймворк корпоративной интеграции (EIP), использующий под капотом механизмы обмена сообщениями между адаптерами различных протоколов/систем интеграции на основе каналов сообщений (условные очереди). Известными аналогами являются — Camel, Mule, Nifi.

Из тестового кейса у нас будет — сделать REST сервис, который умеет считывать полученные параметры запроса, ходить в нашу базу, к примеру, postgres, делать обновление и выборку из данных таблиц по параметрам, полученных от источника, и отдавать результат в очередь обратно (request/response), а также сделать несколько экземпляров с разными путями запроса.

Условно диаграмма data flow (потока) будет выглядеть так:

image

Далее я покажу, как это можно просто сделать без особых танцев с бубном, с помощью IntegrationFlowContext, с REST-управляющими эндепоинтами компонентов/потоков. Весь основной код проекта будет расположен в репозитории, здесь укажу лишь некоторые вырезки. Что ж, кто заинтересован, прошу под кат.
Читать дальше →
Total votes 1: ↑1 and ↓0+1
Comments9

Автоматизация HTTP запросов в контексте Spring

Reading time18 min
Views12K

Предыстория


Несколько месяцев назад поступила задача по написанию HTTP API работы с продуктом компании, а именно обернуть все запросы с помощью RestTemplate и последующим перехватом информации от приложения и модификации ответа. Примерная реализация сервиса по работе с приложением была таковая:


        if (headers == null) {
            headers = new HttpHeaders();
        }

        if (headers.getFirst("Content-Type") == null) {
            headers.add("Content-Type", MediaType.APPLICATION_JSON_VALUE);
        }

        HttpEntity<Object> entity;
        if (body == null) {
            entity = new HttpEntity<>(headers);
        } else {
            entity = new HttpEntity<>(body, headers);
        }

        final String uri = String.format("%s%s/%s", workingUrl, apiPath, request.info());

        final Class<O> type = (Class<O>) request.type();
        final O response = (O)restTemplate.exchange(uri, request.method(), entity, type);

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


И пока товарищи коллеги писали на старом механизме функционал в своих ветках, мне пришла в голову гениальнейшая идея — а почему бы не писать эти запросы "в одну строчку" (like Feign).


Идея


У нас в руках имеется мощный DI контейнер Spring, так почему бы не использовать его функционал в полной мере? В частности инициализации Data репозиториев на примере Jpa. Предо мной стояла задача инициализация класса типа интерфейс в контексте Spring и три варианта решения перехвата вызова метода, как типичной реализации — Aspect, PostProcess и BeanDefinitionRegistrar.


Кодовая база


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


1) Mapping — аннотация, идентифицирующая интерфейс как компонент HTTP вызовов.


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Mapping {
    /**
     * Registered service application name, need for config
     */
    String alias();
}
Читать дальше →
Total votes 11: ↑7 and ↓4+3
Comments6

Web App с IoC Starter. Базовый маппинг запросов, используя ioc context, ioc web и ioc orm

Reading time18 min
Views1.7K
image

Введение


С момента первого релиза прошло достаточно много времени (ссылка на предыдущую статью). Что изменилось?


  • улучшена стабильность системы в целом;
  • реализована ленивая загрузка компонентов;
  • встроена базовая система слушателей;
  • встроена поддержка аспектно-ориентированного программирования (для средней сложности решения задач, в остальном все же советую использовать — AspectJ библиотеку)
  • новый загрузчик RequestFactory
  • встроена работа с кешем на базе EhCache, Guava
  • встроена работа с потоками (как инициализация посредством аннотации @SimpleTask, так и прямая работа с пулом)

**Модули


  • модуль работы с базой (легковесный ORM с поддержкой JPA, Transactions, NO-SQL Driver — Orient, Crud methods, repository system и автогенерацией запросов из функции класса-репозитория)
  • модуль работы с веб-мордой (маппинг линков посредством аннотаций, поддержка кастомных producers/consumes, Velocity Template Rendering Page, Basic Security Requests, Sessions, Cookies, SSL) на базе Netty 4.1.30.Final

Структура фреймворка
struct


"Это конечно же все хорошо,"- скажите Вы, -"но по факту работает ли это все?".
"Да, работает. Прошу под кат".


Процесс реализации примера


Для реализации примера я буду использовать Maven 3 и Intelijj Idea 2018.2.


1) Подключаем зависимости:

Читать дальше →
Total votes 4: ↑4 and ↓0+4
Comments0

Реализация своего IoC контейнера

Reading time16 min
Views12K
image

Введение


Каждый начинающий разработчик должен быть знаком с понятием Inversion of Control (Инверсия управления).

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

Инверсия управления (Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения связанности в компьютерных программах и входящий в пятерку важнейших принципов SOLID.

На сегодня существуют несколько основных фреймворков по этой теме:

1. Dagger
2. Google Guice
3. Spring Framework

По сей день пользуюсь Spring и частично доволен его функционалом, но пора бы попробовать что-то и свое, не правда ли?
Читать дальше →
Total votes 14: ↑9 and ↓5+4
Comments12

Information

Rating
Does not participate
Location
Севастополь, Республика Крым, Россия
Date of birth
Registered
Activity