Опишіть архітектуру, яку ви використовуєте для веб-додатків Java? [зачинено]


146

Давайте поділимось архітектурами веб-додатків на базі Java!

Існує безліч різних архітектур для веб-додатків, які потрібно реалізувати за допомогою Java. Відповіді на це запитання можуть слугувати бібліотекою різних дизайнів веб-додатків із їх плюсами та мінусами. Хоча я усвідомлюю, що відповіді будуть суб’єктивними, спробуємо бути максимально об'єктивними та мотивувати переліки, які ми перераховуємо.

Використовуйте рівень деталізації, який ви віддаєте перевагу для опису вашої архітектури. Щоб ваша відповідь мала будь-яку цінність, вам потрібно, принаймні, описати основні технології та ідеї, що використовуються в описуваній архітектурі. І останнє, але не менш важливе, коли ми повинні використовувати вашу архітектуру?

Почну ...


Огляд архітектури

Ми використовуємо трирівневу архітектуру, засновану на відкритих стандартах від Sun, таких як Java EE, Java Persistent API, Servlet та Java Server Pages.

  • Наполегливість
  • Бізнес
  • Презентація

Можливі комунікаційні потоки між шарами представлені:

Persistence <-> Business <-> Presentation

Що, наприклад, означає, що презентаційний шар ніколи не викликає і не виконує операції зі збереженням, він завжди робить це через бізнес-рівень. Ця архітектура призначена для задоволення запитів веб-програми високої доступності.

Наполегливість

Виконує операції зі створення, читання, оновлення та видалення ( CRUD ) збереження. У нашому випадку ми використовуємо ( Java Persistent API ) JPA, і в даний час ми використовуємо Hibernate як наш постачальник стійкості та використовуємо його EntityManager .

Цей шар розділений на кілька класів, де кожен клас має справу з певним типом сутностей (тобто сутностей, пов’язаних із кошиком для покупок, може оброблятись одним класом стійкості) і використовується одним та лише одним менеджером .

Крім того, цей шар також зберігає об'єкти JPA, які є такими Account, як ShoppingCartтощо.

Бізнес

Вся логіка, пов'язана з функціональністю веб-додатків, знаходиться в цьому шарі. Ця функціональність може ініціювати переказ коштів клієнту, який хоче оплатити продукт в режимі он-лайн за допомогою своєї / його кредитної картки. Це також може бути створення нового користувача, видалення користувача або обчислення результату битви у веб-грі.

Цей шар розділений на декілька класів, і кожен з цих класів позначається, @Statelessщоб перетворитись на сеанс без громадянства (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):

Якщо клієнт працює в рамках транзакції і використовує метод корпоративного боба, метод виконується в межах транзакції клієнта. Якщо клієнт не пов'язаний з транзакцією, контейнер починає нову транзакцію перед запуском методу.

Потрібний атрибут - це неявний атрибут транзакції для всіх методів бін підприємства, що працюють з розмежуванням транзакцій, керованих контейнерами. Зазвичай ви не встановлюєте атрибут "Обов'язковий", якщо вам не потрібно перекрити інший атрибут транзакції. Оскільки атрибути транзакцій є декларативними, їх можна легко змінити пізніше.

Презентація

Наш презентаційний шар відповідає за ... презентацію! Він відповідає за користувальницький інтерфейс і показує інформацію користувачеві, будуючи HTML-сторінки та отримуючи введення користувачів через GET та POST-запити. На даний момент ми використовуємо стару комбінацію сервертів + Java Server Pages ( JSP ).

Шар викликає методи в менеджерах бізнес-рівня для виконання операцій, запитуваних користувачем, і отримання інформації для показу на веб-сторінці. Іноді інформація, отримана від бізнес-рівня, має менш складні типи, як String's і integers', а в інший час об'єкти JPA .

Плюси і мінуси архітектури

Плюси

  • Маючи все, що стосується конкретного способу наполегливості в цьому шарі, це означає лише те, що ми можемо помінятися з використання JPA на щось інше, без необхідності переписувати щось на рівні бізнесу.
  • Нам легко поміняти наш презентаційний шар на щось інше, і цілком ймовірно, що ми зможемо знайти щось краще.
  • Дозволити контейнеру EJB керувати межами транзакцій - це приємно.
  • Використовувати серверт + JPA легко (для початку), а технології широко використовуються та впроваджуються на багатьох серверах.
  • Використання Java EE повинно полегшити нам створення системи високої доступності з балансуванням навантаження та відмовою . Обидва ми відчуваємо, що маємо мати.

Мінуси

  • Використовуючи JPA, ви можете зберігати часто використовувані запити як іменовані запити, використовуючи @NamedQueryпримітку до класу об'єктів JPA. Якщо ви якомога більше пов'язані зі стійкістю в класах стійкості, як і в нашій архітектурі, це розширить місця, де ви можете знайти запити щодо включення також і об'єктів JPA. Це буде складніше переглянути операції, що підтримують стійкість, і, таким чином, важче підтримувати.
  • У нас є структури Спільної спільної діяльності як частина нашої стійкості. Але Accountі ShoppingCart, що не вони на насправді бізнес - об'єкти? Це робиться так, як вам потрібно торкнутися цих класів і перетворити їх на сутності, з якими JPA знає, як поводитися.
  • Суб'єкти JPA, які також є нашими бізнес-об'єктами, створюються як об'єкти передачі даних ( DTO ), також відомі як об'єкти цінності (VO). Це призводить до анемічної моделі домену, оскільки бізнес-об'єкти не мають власної логіки, крім методів аксесуарів. Вся логіка виконується нашими менеджерами на рівні бізнесу, що призводить до більш процедурного стилю програмування. Це не гарний об'єктно-орієнтований дизайн, але, можливо, це не проблема? (Адже орієнтація на об'єкт - не єдина парадигма програмування, яка дала результати.)
  • Використання EJB та Java EE вносить трохи складності. І ми не можемо використовувати суто Tomcat (додавання мікроконтейнера EJB не є суто Tomcat).
  • Проблем із використанням Сервлета + JPA є багато. Використовуйте Google для отримання додаткової інформації про ці проблеми.
  • Оскільки транзакції закриваються під час виходу з бізнес-рівня, ми не можемо завантажувати будь-яку інформацію від об'єктів JPA, яка налаштована для завантаження з бази даних, коли це потрібно (використовуючи fetch=FetchType.LAZY) зсередини шару презентації. Це призведе до виключення. Перед поверненням сутності, що містить такі види полів, ми повинні бути обов'язково зателефонували до відповідних користувачів. Іншим варіантом є використання мови запиту на постійну підтримку Java ( JPQL ) і виконайте FETCH JOIN. Однак обидва ці варіанти трохи громіздкі.

1
Здається, ви встановили занадто високу планку своєю власною відповіддю - це, можливо, відштовхнуло інших :)
Jonik

5
Крім того, можливо, ваша думка має бути звичайною відповіддю, а не частиною питання, щоб за неї можна було проголосувати разом з іншими відповідями?
Jonik

Це питання посилалося на мета.
D4V1D

Відповіді:


20

Ок, я зроблю (коротший):

  • Frontend: Гобелен (3 для старих проектів, 5 для нових проектів)
  • Діловий шар: Весна
  • DAO: Ibatis
  • База даних: Oracle

Ми використовуємо підтримку транзакцій Sping та починаємо транзакції після введення рівня обслуговування, поширюючись до виклику DAO. Сервісний рівень володіє найбільш діловими знаннями про модель, і DAO виконують порівняно просту роботу CRUD.

Деякі складніші запити обробляються складнішими запитами в бекенді з міркувань продуктивності.

Переваги використання Spring у нашому випадку полягає в тому, що ми можемо мати екземпляри, залежні від країни / мови, які стоять за класом Spring Proxy. На основі користувача в сеансі під час дзвінка використовується правильна реалізація країни / мови.

Управління транзакціями майже прозоре. Виключення під час виконання. Ми максимально використовуємо неперевірені винятки. Ми звикли робити перевірені винятки, але із впровадженням Spring я бачу переваги неперевірених винятків, лише обробляючи винятки, коли можна. Це дозволяє уникнути великої кількості предметів котла «ловити / знову» або «кидати».

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


Гарна відповідь! Здається, ця нитка притягує деякий трафік, шкода, що інші люди не відчувають, що у них є час описати свої архітектури, або є інші причини не брати участь.

19

Сьогодні ідеальні технології веб-розробки на основі Java.

Веб-шар:

HTML + CSS + Ajax + JQuery

Веб-контролер RESTFul / шар обробки / дії / запиту:

Play Framework

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

Використовуйте чистий Java-код якомога довше. Тут можна злити веб-сервіси.

Шар трансформації даних XML / JSon:

XMLTool (пошук за кодом Google), JSoup, Google GSon, XStream, JOOX (пошук за кодом Google)

Шар стійкості:

CRUD: JPA або SienaProject або QueryDSL / Складні запити: JOOQ, QueryDSL


9

Ось мої 5 копійок

Презентація

Android, Angular.JS WebClient, OAUTHv2

API

REST, Джерсі (JAX-RS), Джексон (де-серіалізація JSON), об'єкти DTO (відмінні від моделей ділової логіки)

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

Пружина для обробки DI та подій. DDD-ish підхід модельних об'єктів. Більш довгі завдання завантажуються за допомогою SQS в робочих модулях.

DAO

Модель сховища з весняними JDBC-шаблонами для зберігання об'єктів. Redis (JEDIS) для таблиць лідерів, використовуючи упорядковані списки. Пам'ятка для магазину Token.

База даних

MySQL, Memcached, Redis


Це щось подібне до того, що ми також дотримуємося в наших проектах! Крім того, JBPM для робочого процесу бізнесу. Чому я не дивуюсь весни?
ininprsr

Я повинен зробити оновлення з нашою поточною аркою: В даний час ми використовуємо шаблони Spring DI і JDBC для шару доступу до даних.
Пепстер

6

Ми слідували в нашому проекті:

Фасадні технології

  • КутовийJS
  • HTML5
  • css3
  • Javascript
  • Завантаження 3

API

  1. ВІДОМОСТІ
  2. JERSEY (JAX-RS)
  3. ЗАБУДОВА ЗАБЕЗПЕЧЕНО
  4. ВЕСНОВНИЙ КУРТ
  5. Джексон
  6. весняна безпека

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

  • ВЕСНІ ДАНІ

  • ВЕСНІ дані MongoDB

База даних

  • MongoDB

Сервер (для кешування)

  • redis

4

Ми все ще використовуємо звичайний стек Struts-Spring-Hibernate.

Для майбутніх додатків ми розглядаємо Spring Web Flow + Spring MVC + Hibernate або Spring + Hibernate + Web Services з передньою частиною Flex.

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

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

  1. Інтерфейс, який презентація використовує як клієнт
  2. Інтерфейс, який використовують інші модулі, коли вони є клієнтом модуля.
  3. Інтерфейс, який можна використовувати в адміністративних цілях модуля.

Часто 1 розширюється 2. Таким чином, легко замінити одну реалізацію модуля іншою. Це допомагає нам приєднуватися до різних клієнтів та легше інтегруватися. Деякі клієнти купуватимуть лише певні модулі, і нам потрібно інтегрувати функціонал, який вони вже мають. Оскільки інтерфейс та шар реалізації розділені, реалізацію ad-hock модуля для цього конкретного клієнта легко, не впливаючи на залежні модулі. І Spring Framework полегшує інженерію різної реалізації.

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


3

Ось ще одна веб-архітектура, над якою я працював:

Однією з основних вимог було те, що програма повинна підтримувати мобільні телефони / інші пристрої. Додаток також має бути розширюваним або гнучким до змін у виборі технологій.

Рівень презентації:

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

  • Весняні контролери REST (можна змінити на JAX-RS)

Рівень бізнес-послуг:

Spring @Service (може змінитись на EJB без громадянства)

Рівень доступу до даних:

Spring @Repository (може змінитися на EJB без громадянства)

Рівень ресурсу:

Спільна історія (JPA) (може змінюватися на будь-яку ORM)

Ви можете знайти більше інформації про книгу, яка відповідає цій архітектурі тут .


2

ІМХО, більшість із нас мають спільний знаменник. Принаймні, в задньому плані, ми маємо певну форму контейнера IOC / DI та стійкість. Особисто я використовую для цього Guice та Mybatis. Відмінності полягають у тому, як ми реалізуємо шар перегляду / інтерфейсу користувача / презентації. Тут є дві основні опції (може бути більше). На основі дії (URL-адреси, зіставлені з контролерами) та на основі компонентів. В даний час я використовую компонентний шар презентації (використовуючи калитку). Це чудово імітує робоче середовище, де я використовую компоненти та події на відміну від URL-адрес та контролерів. В даний час я шукаю причину, чому мені слід перейти до цього типу архітектури URL-контролерів (саме так я опинився на цій сторінці). Чому галас про RESTful та бездержавні архітектури.

Щоб відповісти на це запитання коротко: я пишу стаціонарні веб-програми, використовуючи структуру, орієнтовану на компоненти, поверх контейнера Guice IOC і ввожу дані у реляційну базу даних за допомогою Mybatis.


1

Трохи інакше, і я б тут претендував на більш модульну архітектуру Java. Ми маємо:

  1. Весна WS / Відпочинок / JSP передній кінець
  2. Spring MVC для логіки бізнес-сервісу, що містить логіку шару презентації, а також операції Spring
  3. Компонентний інтерфейс комунікаційного сервісу, розглянутий бізнес-службами через EJB. EJB встановлюють власні межі транзакцій, які можуть приєднатися до весняних транзакцій.
  4. Реалізація компонентних служб, знову ж таки Spring компоненти
  5. Інтеграційний рівень, MyBatis для інтеграції баз даних, Spring WS для інтеграції веб-служб, інші технології інтеграції для інших служб
  6. Мейнфрейми, бази даних, інші послуги на інших серверах ...

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

Використання різних шарів дозволяє нам повну розв'язку та потрібну нам модульність. Ми також можемо повністю використовувати потужність Java EE, а також Spring. Ніщо не заважає нам використовувати JSF, наприклад, для переднього кінця, якщо потрібно.

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


0

Я працював над проектами, які використовують жорстку схему менеджера. Історично я був величезним прихильником жорсткої ієрархії, де все вписувалося в акуратний ящик. Коли я просуваюся у своїй кар'єрі, я вважаю, що це вимушено у багатьох випадках. Я вважаю, що прийняття більш спритного мислення до дизайну додатків призводить до кращого продукту. Що я маю на увазі під цим створенням набору класів, які вирішують проблему. Замість того, щоб сказати: "Чи ви створили менеджера для цього і того?"

Поточний проект, над яким я працюю, - це веб-додаток із поєднанням Spring MVC та RestEasy JSON / Ajax. На стороні сервера, вбудованої в наші контролери, є чудовий рівень даних на основі фасаду з JPA / Hibernate для прямого доступу до бази даних, деякого доступу до EJB та деяких дзвінків на веб-службі на основі SOAP. Зв’язуючи все це разом - це якийсь спеціальний код контролера java, який визначає, що серіалізувати як JSON та повернутись клієнту.

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


0

Компоненти архітектури веб-додатків включають:

1: Браузер: взаємодія з клієнтом

        HTML
        JavaScript
        Stylesheet

2: Інтернет

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

        CSS
        Image
        Pages(Java render )

4: Сервер додатків

        App Webapp (Java interaction)
        Others WebApps

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

        Oracle, SQL, MySQL

6: Дані

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.