Опишите архитектуру, используемую для веб-приложений Java?

Предоставить возможность совместного использования архитектур веб-приложений на основе Java!

Существует множество различных архитектур для веб-приложений, которые должны быть реализованы с использованием Java. Ответы на этот вопрос могут служить библиотекой различных проектов веб-приложений с их плюсами и минусами. Хотя я понимаю, что ответы будут субъективными, постарайтесь быть настолько объективными, насколько мы можем, и мотивируем плюсы и минусы, которые мы перечисляем.

Используйте уровень детализации, который вы предпочитаете для описания вашей архитектуры. Чтобы ваш ответ имел какую-либо ценность, вам, по крайней мере, нужно будет описать основные технологии и идеи, используемые в описываемой вами архитектуре. И последнее, но не менее важное: когда мы должны использовать вашу архитектуру?

Я начну...


Обзор архитектуры

Мы используем трехуровневую архитектуру, основанную на открытых стандартах от Sun, таких как Java EE, Java Persistence API, Servlet и Java Server Pages.

  • Постоянство
  • Бизнес
  • Презентация

Возможные коммуникационные потоки между слоями представлены следующим образом:

Persistence <-> Business <-> Presentation

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

Постоянство

Выполняет операции сохранения, чтения, обновления и удаления (CRUD). В нашем случае мы используем (Java Persistence API) JPA, и в настоящее время мы используем Hibernate в качестве нашего провайдера persistence и его EntityManager.

Этот уровень разделен на несколько классов, где каждый класс имеет дело с определенным типом сущностей (т.е. объекты, связанные с корзиной покупок, могут обрабатываться одним классом персистентности) и используются одним и только одним менеджером.

Кроме того, этот слой также сохраняет объекты JPA, которые являются такими, как Account, ShoppingCart и т.д.

Бизнес

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

Этот слой делится на несколько классов, и каждый из этих классов аннотируется с помощью @Stateless, чтобы стать сеансом без состояния Bean (SLSB). Каждый SLSB называется менеджером, и, например, менеджер может быть классом, аннотированным, как упоминалось, под названием AccountManager.

Когда AccountManager необходимо выполнить операции CRUD, он вызывает соответствующие вызовы экземпляру AccountManagerPersistence, который является классом в уровне персистентности. Грубым эскизом двух методов в AccountManager может быть:

...
public void makeExpiredAccountsInactive() {
    AccountManagerPersistence amp = new AccountManagerPersistence(...)
    // Calls persistence layer
    List<Account> expiredAccounts = amp.getAllExpiredAccounts();
    for(Account account : expiredAccounts) {
        this.makeAccountInactive(account)
    }
}
public void makeAccountInactive(Account account) {
    AccountManagerPersistence amp = new AccountManagerPersistence(...)
    account.deactivate();
    amp.storeUpdatedAccount(account); // Calls persistence layer
}

Мы используем транзакции менеджера контейнеров, поэтому нам не нужно выполнять демаркацию транзакций с нашей собственной стороны. Что в основном происходит под капотом, мы начинаем транзакцию при вводе метода SLSB и фиксируем его (или откатываем) непосредственно перед выходом из метода. Это пример соглашения над конфигурацией, но нам не нужно ничего, кроме значения по умолчанию, обязательно.

Вот как учебник Java EE 5 от Sun объясняет обязательный атрибут транзакции для Enterprise JavaBeans (EJB):

Если клиент работает в пределах транзакция и вызывает предприятие bean s, метод выполняет в рамках транзакции клиентов. Если клиент не связан с транзакции, контейнер запускает новой транзакции перед запуском Метод.

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

Презентация

Наш уровень представления отвечает за... презентацию! Он отвечает за пользовательский интерфейс и показывает информацию пользователю, создавая HTML-страницы и получая пользовательский ввод через запросы GET и POST. В настоящее время мы используем старый Servlet + Страницы сервера Java (JSP).

Слой вызывает методы в менеджерах бизнес-уровня для выполнения операций, запрошенных пользователем, и для получения информации, отображаемой на веб-странице. Иногда информация, полученная из бизнес-уровня, является менее сложными типами как String и int egers, а в других случаях сущности JPA.

Плюсы и минусы с архитектурой

Pros

  • Наличие всего, что связано с определенным способом выполнения настойчивости в этом слое, означает, что мы можем перейти от использования JPA к чему-то другому, не переписывая что-либо на бизнес-уровне.
  • Нам легко сменить наш слой презентации на что-то еще, и, вероятно, мы сможем, если найдем что-то лучшее.
  • Позволяет контейнеру EJB управлять границами транзакций.
  • Использование Servlet + JPA очень просто (для начала), и технологии широко используются и реализуются на множестве серверов.
  • Использование Java EE должно облегчить нам создание системы высокой доступности с балансировкой нагрузки и завершается с ошибкой. Оба они чувствуют, что мы должны иметь.

Против

  • Используя JPA, вы можете хранить часто используемые запросы как именованные запросы, используя аннотацию @NamedQuery в классе сущности JPA. Если вы, насколько это возможно, связаны с сохранением в классах персистентности, как и в нашей архитектуре, это будет распространять места, где вы можете найти запросы, чтобы включить объекты JPA. Будет сложнее просмотреть операции сохранения и, следовательно, будет труднее поддерживать.
  • У нас есть сущности JPA как часть нашего слоя сохранения. Но Account и ShoppingCart, разве они не бизнес-объекты? Это делается так, как вам приходится прикасаться к этим классам и превращать их в объекты, которые JPA знает, как обращаться.
  • Объекты JPA, которые также являются нашими бизнес-объектами, создаются как объекты передачи данных (DTO), также называемые объектами Value (VO-х). Это приводит к JPQL) и сделать FETCH JOIN. Однако оба этих параметра немного громоздки.

Ответ 1

Хорошо, я сделаю (более короткий):

  • Frontend: Tapestry (3 для более старых проектов, 5 для более новых проектов)
  • Бизнес-уровень: Spring
  • DAO: Ibatis
  • База данных: Oracle

Мы используем поддержку транзакций Sping и начинаем транзакции при входе в сервисный уровень, распространяясь до вызовов DAO. Уровень обслуживания имеет большинство бизнес-моделей знаний, а DAO делает относительно простую работу CRUD.

Некоторые более сложные материалы запроса обрабатываются более сложными запросами в бэкэнд по соображениям производительности.

Преимущества использования Spring в нашем случае состоят в том, что у нас могут быть экземпляры, зависящие от страны/языка, которые находятся за прокси-классом Spring. На основе пользователя в сеансе при выполнении вызова используется правильная реализация страны/языка.

Управление транзакциями почти прозрачно, откатывает исключения во время выполнения. Мы используем непроверенные исключения как можно больше. Мы делали проверенные исключения, но с введением Spring я вижу преимущества исключенных исключений, но только обрабатывая исключения, когда вы можете. Это позволяет избежать большого количества шаблонов "catch/rethrow" или "throws".

Извините, короче, чем ваш пост, надеюсь, вы найдете это интересным...

Ответ 2

Идеальные технологии веб-разработки на основе Java сегодня.

Веб-уровень:

HTML + CSS + Ajax + JQuery

RESTFul Web Controller/Action/Request Processing Layer:

Play Framework

Бизнес-логика/уровень обслуживания:

Используйте Pure Java Code как можно дольше. Здесь можно слияние веб-сервисов.

Уровень преобразования данных XML/JSon:

XMLTool (поиск в коде Google), JSoup, Google GSon, XStream, JOOX (поиск в коде Google)

Уровень сдерживания:

CRUD: JPA или SienaProject или QueryDSL/ Комплексные запросы: JOOQ, QueryDSL

Ответ 3

Здесь мои 5 центов

Презентация

Android, Angular.JS WebClient, OAUTHv2

API

REST, Джерси (JAX-RS), Джексон (деблокирование/сериализация JSON), объекты DTO (отличные от моделей бизнес-логики)

Бизнес-логика

Spring для обработки DI и событий. DDD-иш-подход объектов модели. Более длинные рабочие задания выгружаются с помощью SQS в рабочих модулях.

DAO

Модель репозитория с Spring JDBC-шаблонами для хранения объектов. Redis (JEDIS) для лидеров, используя упорядоченные списки. Memcache для Token Store.

База данных

MySQL, Memcached, Redis

Ответ 4

В нашем проекте мы следовали:

Технология передней панели

  • AngularJS
  • HTML5
  • CSS3
  • Javascript
  • Bootstrap 3

API

  • REST
  • JERSEY (JAX-RS)
  • ОТДЫХ НАЗНАЧЕН
  • SPRING BOOT
  • Джексон
  • SPRING безопасность

Бизнес-логика

  • SPRING DATA

  • SPRING данные MongoDB

База данных

  • MongoDB

Сервер (для кэширования)

  • Redis

Ответ 5

Мы по-прежнему используем обычный стек Struts- Spring -Hibernate.

В будущих приложениях мы рассмотрим Spring Web Flow + Spring MVC + Hibernate или Spring + Hibernate + веб-службы с интерфейсом Flex.

Отличительной особенностью нашей архитектуры является модуляция. У нас есть несколько модулей, некоторые из которых начинаются от 3 до 30 таблиц в базе данных. Большинство модулей состоят из бизнес-проектов и веб-проектов. Бизнес-проект содержит логику бизнеса и постоянства, в то время как веб-сайт содержит логику презентации.
На логическом уровне есть три уровня: "Бизнес", "Настойчивость" и "Презентация".
Зависимости:
Презентация зависит от бизнеса и настойчивости.
Стойкость зависит от бизнеса.
Бизнес не зависит от других слоев.

Большинство бизнес-проектов имеют три типа интерфейсов (обратите внимание: не GUI, это программный уровень интерфейса Java).

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

Часто 1 продолжается 2. Таким образом, легко заменить одну реализацию модуля на другую. Это помогает нам адаптироваться к разным клиентам и легко интегрироваться. Некоторые клиенты будут покупать только определенные модули, и нам необходимо интегрировать функциональные возможности, которые у них уже есть. Поскольку интерфейс и уровень реализации разделены, легко развертывать реализацию модуля ad-hock для этого конкретного клиента, не затрагивая зависимые модули. И Spring Framework упрощает внедрение различной реализации.

Наш бизнес-уровень основан на POJO. Одна из тенденций, которые я наблюдаю, заключается в том, что эти POJO напоминают DTO. Мы страдаем от модели анемичного домена. Я не совсем уверен, почему это происходит, но это может быть связано с простотой проблемной области многих наших модулей, большая часть работы - CRUD или благодаря разработчикам, предпочитающим размещать логику где-то в другом месте.

Ответ 6

Вот еще одна веб-архитектура, над которой я работал:

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

Уровень представления:

  • JSP/JQuery (клиентский MVC)
  • Основной Android
  • Родной iPhone
  • Мобильная сеть (HTML5/CSS3/Отзывчивый дизайн)

  • Spring Контроллеры REST (могут меняться на JAX-RS)

Уровень обслуживания:

Spring @Service (может измениться на E-Video без учета состояния)

Уровень доступа к данным:

Spring @Repository (может быть изменен на E-Video без состояния)

Уровень ресурсов:

Объекты спящего режима (JPA) (можно изменить на любой ORM)

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

Ответ 7

ИМХО, у большинства из нас есть общий знаменатель. По крайней мере, в фоновом режиме у нас есть форма контейнера IOC/DI и структура сохранения. Лично я использую Guice и Mybatis для этого. Различия заключаются в том, как мы реализуем слой view/UI/presentation. Здесь есть 2 основных варианта (может быть больше). Действие основано (URL-адреса, сопоставленные с контроллерами) и на основе компонентов. В настоящее время я использую компонентный слой на основе компонентов (с использованием калитки). Он отлично имитирует среду рабочего стола, где я использую компоненты и события, а не URL-адреса и контроллеры. В настоящее время я ищу причину, по которой я должен перейти на эту архитектуру с URL-контроллером (как я оказался на этой странице). Почему реклама об архитектуре RESTful и Stateless.

Чтобы ответить на этот вопрос короче: я пишу веб-приложения с сохранением состояния, используя компонентную структуру поверх контейнера Guice IOC и помещаю данные в реляционную базу данных с помощью Mybatis.

Ответ 8

Немного отличается, и я бы назвал здесь более модульную архитектуру Java. Мы имеем:

  • Spring WS/Rest/JSP передняя часть
  • Spring MVC для логики бизнес-обслуживания, содержащей логику уровня представления, а также Spring транзакции
  • Интерфейс связи служебных компонентов, просмотренный через EJB бизнес-услугами. EJB устанавливают свои собственные границы транзакций, которые могут присоединиться к транзакциям Spring.
  • Реализации компонентов, снова Spring компоненты
  • Интеграционный уровень, MyBatis для интеграции баз данных, Spring WS для интеграции веб-сервисов, других технологий интеграции для других сервисов.
  • Мейнфреймы, базы данных, другие службы на других серверах...

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

Использование разных слоев позволяет нам полностью развязать и нужна модульность. Мы также можем полностью использовать возможности Java EE, а также Spring. Ничто не мешает нам использовать JSF, например, для передней части, если это необходимо.

По сравнению с примером архитектуры OP, я думаю, что это можно описать как имеющее четыре основных слоя вместо трех, хотя и с твистом.

Ответ 9

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

В текущем проекте, над которым я работаю, есть веб-приложение с комбинацией вызовов Spring MVC и RestEasy JSON/Ajax. На стороне сервера, встроенной в наши контроллеры, есть разумный уровень данных на основе фасадов с JPA/Hibernate для прямого доступа к базе данных, некоторый доступ к EJB и некоторые вызовы веб-сервисов на основе SOAP. Связывание всего этого представляет собой некоторый пользовательский код контроллера Java, который определяет, что сериализовать как JSON и вернуться к клиенту.

Мы почти не пытаемся создать какой-то единый шаблон вместо того, чтобы принять идею "Хуже - лучше" философии дизайна Unix. Быть тем, что его гораздо лучше окрашивать за пределы линий и создавать что-то разумное, быстро, чем создавать нечто, что соответствует целому ряду строгих мандатов дизайна.

Ответ 10

В Архитектура веб-приложений:

1: Браузер: взаимодействие с клиентом

        HTML
        JavaScript
        Stylesheet

2: Интернет

3: Веб-сервер

        CSS
        Image
        Pages(Java render )

4: Сервер приложений

        App Webapp (Java interaction)
        Others WebApps

5: Сервер баз данных

        Oracle, SQL, MySQL

6: Данные