Descreve a arquitectura que usa para aplicações Web Java? [fechado]

Vamos compartilhar arquiteturas de aplicações web baseadas em Java!

existem muitas arquiteturas diferentes para aplicações web que devem ser implementadas usando Java. As respostas a esta pergunta podem servir como uma biblioteca de vários projetos de aplicações web com seus prós e contras. Embora eu perceba que as respostas serão subjetivas, vamos tentar ser o mais objetivas possível e motivar os prós e contras que listamos.

Use o nível de detalhe que prefere para a descrever a tua arquitectura. Para que a sua resposta seja de qualquer valor, terá pelo menos de descrever as principais tecnologias e ideias utilizadas na arquitectura que descreve. E por último, mas não menos importante, Quando devemos usar a tua arquitectura?

Eu começo...


panorâmica da arquitectura

Usamos uma arquitetura de 3 níveis baseada em padrões abertos como Java EE, Java Persistence API, Servlet e Java Server. Pagina.

  • persistência
  • Negócios
  • apresentação

os possíveis fluxos de comunicação entre as camadas são representados por:

Persistence <-> Business <-> Presentation
O que, por exemplo, significa que a camada de apresentação nunca chama ou executa operações de persistência, fá-lo sempre através da camada de Negócio. Esta arquitetura destina-se a satisfazer as exigências de uma aplicação web de alta disponibilidade.

persistência

executa criar, ler, actualizar e apagar (CRUD) operações de persistência. No nosso caso, estamos a usar a JPA (Java Persistence API ) e usamos actualmente Hibernate como nosso fornecedor de persistência e usamos o seu 'EntityManager' .

Esta camada é dividida em várias classes, onde cada classe lida com um certo tipo de entidades (i.e. entidades relacionadas a um carrinho de compras poderá obter manipulado por uma única classe de persistência) e usada por uma e apenas uma gerente .

além disso, esta camada também armazena entidades da APP que são coisas como Account, ShoppingCart etc.

Negócios

toda a lógica que está ligada à funcionalidade da aplicação web está localizada nesta camada. Esta funcionalidade pode ser iniciar uma transferência de dinheiro para um cliente que quer pagar por um produto on-line usando seu cartão de crédito. Pode muito bem ser a criação de um novo utilizador, a exclusão de um utilizador ou o cálculo do resultado de uma batalha em um jogo baseado na web.

Esta camada é dividida em várias classes, e cada uma destas classes é anotada com @Stateless para se tornar um Stateless Session Bean (SLSB). Cada SLSB é chamado de um manager e, por exemplo, um manager pode ser uma classe anotada como mencionado chamado AccountManager.

Quando AccountManager Precisa de realizar operações CRUD faz as chamadas apropriadas para uma instância de AccountManagerPersistence, que é uma classe na camada de persistência. Um esboço de dois métodos em AccountManager pode ser:

...
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
}

usa-se recipiente gerenciador de transações então, nós não temos de fazer a demarcação da transação nosso self. O que basicamente acontece sob o capô está a iniciar uma transação quando entrar o SLSB método e cometê-lo (ou reversão-lo) imediatamente antes de sair do método. É um exemplo de Convenção sobre configuração, mas não tivemos necessidade de nada além do padrão, exigido, ainda.

Aqui está como o Tutorial Java EE 5 do Sun explica o atributo de transacção exigido para a empresa JavaBeans (Ejb's):

Se o cliente estiver a correr dentro de um transacção e invoca a empresa método do bean, o método executa dentro da transacção do cliente. Se o cliente não está associado a transacção, o contentor inicia um Nova transacção antes de executar a metodo.

o atributo requerido é o implícito atributo da transacção para todos métodos de feijão da empresa em execução com transacção gerida por contentores demarcacao. Você normalmente não define o atributo requerido a menos que precise para substituir outra transacção atributo. Porque a transacção os atributos são declarativos, você pode muda - os facilmente mais tarde.

apresentação

A nossa camada de apresentação está encarregada... apresentação! É responsável pela interface do Usuário e mostra informações para o usuário, construindo páginas HTML e recebendo entrada do Usuário através de GET e POST solicitacao. Estamos actualmente a usar a antiga combinaçãoServlet's + Java Server Pages (JSP ).

Os Métodos de chamadas de camada emgestores da camada de negócio para realizar as operações solicitadas pelo utilizador e para receber informações a mostrar na página web. Por vezes, as informações recebidas da camada de negócio são tipos menos complexos como String's e integers, e noutras vezes entidades da APP.

Prós e contras com o arquitectura

prós

    Ter tudo relacionado com uma forma específica de fazer persistência nesta camada só significa que podemos trocar de usar a APP por outra coisa, sem ter que reescrever nada na camada de Negócio. É fácil para nós trocar a nossa camada de apresentação em outra coisa, e é provável que o façamos se encontrarmos algo melhor. Deixar o contentor da EJB gerir os limites da transacção é bom.
  • usando Servlet's + JPA é fácil (para começar) e as tecnologias são amplamente utilizadas e implementadas em muitos servidores.
  • utilizar Java EE é suposto tornar mais fácil para nós criar um sistema de alta disponibilidade comequilíbrio de carga efalha acima de . Ambos achamos que devemos ter.

conts

  • usando o JPA, poderá armazenar as consultas usadas com frequência, tal como as chamadas consultas, usando a anotação @NamedQuery na classe de entidades JPA. Se você tem tanto quanto possível relacionado para a persistência nas aulas de persistência, como em nossa arquitetura, isso irá espalhar os locais onde você pode encontrar consultas para incluir as entidades da App também. Será mais difícil de visualizar as operações de persistência e, portanto, mais difícil de manter.
  • Temos entidades da APP como parte da nossa camada de persistência. Mas não são realmente objectos de negócios? É feito desta forma, pois você tem que tocar essas classes e transformá-las em Entidades que a APP sabe como manipular.
  • as entidades da APP, que são também os nossos objectos de negócio, são criadas como objectos de transferência de dados (DTO's), também conhecidos como objectos de valor (VO's). Isso resulta em um modelo de domínio anêmico como os objetos de negócio não têm lógica própria, exceto métodos de accessor. Toda a lógica é feita por nossos gerentes na camada de negócios, o que resulta em um estilo de programação mais processual. Não é um bom design orientado a objetos, mas talvez isso não seja um problema? (Afinal de contas objecto a orientação não é o único paradigma de programação que produziu resultados.)
  • O uso de EJB e Java EE introduz um pouco de complexidade. E não podemos usar puramente Tomcat (adicionar um micro-container da EJB não é [[24]}puramente Tomcat).
  • há muitos problemas com o uso de Servlet + JPA. Use o Google para obter mais informações sobre estes problemas.
  • Como as transacções são encerradas ao sair da camada de negócio, não podemos carregar qualquer informação das entidades da APP que é configurado para ser carregado a partir da base de dados quando necessário (usando fetch=FetchType.LAZY) a partir do interior da camada de apresentação. Vai despoletar uma excepção. Antes de devolver uma Entidade contendo estes tipos de campos, temos de ter a certeza de ligar para o getter relevante. outra opção é usar a linguagem Java Persistence Query Language (JPQL) e fazer um FETCH JOIN. No entanto, ambas as opções são um pouco pesadas.
Author: user14070 , 2008-11-13

10 answers

Está bem, vou fazer uma mais Curta.
  • Interface: Tapeçaria (3 para projectos mais antigos, 5 para projectos mais recentes)
  • camada de Negócio: Primavera
  • DAO's: Ibatis
  • Base De Dados: Oracle

Usamos o Suporte de transação Sping, e iniciamos as transações ao entrar na camada de serviço, propagando-se para o DAO call'S. A camada de serviço tem o maior conhecimento do modelo bussines, e os DAO fazem um trabalho CRUD relativamente simples.

Um pouco mais complicado o material da consulta é tratado por consultas mais complicadas na infra-estrutura por razões de desempenho.

As vantagens de usar a primavera no nosso caso é que podemos ter instâncias dependentes de país/língua, que estão por trás de uma classe de Proxy Primavera. Com base no usuário na sessão, a implementação de país/língua correta é usada ao fazer uma chamada.

A gestão das transacções é quase transparente, com excepções em tempo de execução. Usamos o máximo possível de exceções não controladas. Nós costumávamos fazer assinalei excepções, mas com a introdução da Primavera vejo os benefícios de excepções não controladas, apenas lidando com excepções quando possível. Ele evita um monte de boilerplate "catch/rethrow" ou "lance" coisas.

Desculpa ser mais curto do que o teu post, espero que aches isto interessante...
 18
Author: Rolf, 2016-10-31 20:09:31

Ideal Java Based Web Development Technologies Today.

Camada Web:

HTML+CSS+Ajax+JQuery

Controller Web/Action/Request Processing Layer:

Play Framework

Business Logic/Service Layer:

Usar código Java puro o máximo possível. Pode-se fazer fusão de serviços web aqui.

XML / JSon camada de transformação de Dados:

XMLTool (procurar no código Google), JSoup, Google GSon, XStream, JOOX (procurar no Google Código)

Camada De Persistência:

CRUD: JPA, SienaProject ou QueryDSL / Consultas complexas: JOOQ,QueryDSL

 18
Author: Rakesh Waghela, 2011-08-22 12:08:54
Aqui estão os meus 5 cêntimos.

Apresentação

Andróide, Angular.JS WebClient, OAUTHv2

API

REST, Jersey (JAX-RS), Jackson (JSON de-/serialisation), DTO-objects (different from business logic models)

Lógica Empresarial

Primavera para a manipulação de DI e de eventos. Abordagem DDD-ish de objetos modelo. Os trabalhos de longa duração são descarregados com SQS em módulos de trabalhadores.

DAO

Modelo de repositório com modelos JDBC De Primavera para armazenar entidades. Redis (JEDIS) para Leaderboards, usando listas ordenadas. Memcache para Token Store.

Base de dados

MySQL, Memcached, Redis
 9
Author: Pepster, 2015-08-23 16:42:44

O que temos seguido no nosso projecto é :

Tecnologia de Front-end

  • AngularJS
  • HTML5
  • css3
  • Javascript
  • Bootstrap 3

API

  1. descanso
  2. JERSEY (JAX-RS)
  3. FIQUE DESCANSADO
  4. BOTA DE MOLA
  5. Jackson Segurança da primavera

Lógica De Negócios

  • DADOS DA PRIMAVERA

  • Dados da primavera MongoDB

Base de Dados

  • MongoDB

Servidor (para cache)

  • redis
 7
Author: CandleCoder, 2015-09-28 11:38:40
Ainda estamos a usar o habitual Struts-Spring-Hibernate stack.

Para aplicações futuras, estamos a analisar o fluxo Web Primavera + MVC Primavera + hibernar ou Spring + Hibernate + Web Services with Flex front end.

Uma característica distinta da nossa arquitectura é a modularização. Temos uma série de módulos, alguns começando com 3 a max 30 tabelas na base de dados. A maioria dos módulos consiste em negócios e projeto web. Projecto empresarial mantém a lógica de negócios e persistência enquanto web tem lógica de apresentação.
A nível lógico, existem três níveis: negócios, persistência e apresentação.
Dependências:
A apresentação depende do negócio e da persistência.
A persistência depende do negócio.
O negócio não depende de outras camadas.

A maioria dos projectos empresariais tem três tipos de interfaces (nota: não é GUI, é uma camada de interface java programática).

  1. Interface que a apresentação está a usar como cliente
  2. Interface que outros módulos estão usando quando eles são o cliente do módulo.
  3. Interface que pode ser utilizada para fins administrativos do módulo.

Frequentemente, 1 estende-se por 2. Desta forma, é fácil substituir uma implementação do módulo por outra. Isso nos ajuda a adotar para diferentes clientes e integrar mais facilmente. Alguns clientes irão comprar apenas alguns módulos e precisamos integrar funcionalidade que já têm. Uma vez que a interface e a camada de implementação estão separadas, é fácil implantar módulo ad-hock para esse cliente específico sem afetar módulos dependentes. E o Framework da primavera torna mais fácil injetar diferentes implementações.

A nossa camada de negócio baseia-se em POJOs. Uma tendência que observo é que estes POJOs se assemelham a DTOs. Nós sofremos de modelo de domínio anémico . Eu não tenho certeza por que isso está acontecendo, mas pode ser devido à simplicidade do domínio de problema de muitos dos nossos módulos, a maioria do trabalho é CRUD ou devido a desenvolvedores prefiro colocar a lógica noutro lugar.
 4
Author: Dan, 2009-03-17 16:37:05

Aqui está mais uma arquitetura web em que eu trabalhei:

Um dos principais requisitos era o pedido de apoio a Telemóveis/Outros dispositivo. O pedido também deve ser extensível ou flexível para mudanças nas escolhas tecnológicas.

Nível De Apresentação:

  • JSP/JQuery (MVC do lado do cliente)
  • Andróide Nativo IPhone nativo
  • Web móvel (HTML5/CSS3 / Responsive concepção)

  • Controladores de repouso de primavera (podem mudar para JAX-RS)

Nível De Serviço Às Empresas:

Spring @Service (pode mudar para Stateless EJB)

Nível De Acesso Aos Dados:

Spring @Repository (pode mudar para EJB sem Estado)

Nível De Recursos:

Entidades hibernadas (JPA) (podem mudar para qualquer ORM)

Você pode encontrar mais informações sobre o livro que segue esta arquitetura aqui .

 3
Author: Amritendu De, 2014-11-02 18:17:32
IMHO, a maioria de nós tem um denominador comum. Pelo menos na parte de trás, temos alguma forma de recipiente IOC/DI e uma estrutura de persistência. Pessoalmente, uso Guice e Mybatis para isto. As diferenças estão em como implementamos a camada view/UI/presentation. Existem duas opções principais aqui (pode ser mais) .. Baseado em ação (URLs mapeados para controladores) e baseado em componentes. Atualmente a am usa a camada de apresentação baseada em componentes (usando wicket). Imita perfeitamente um ambiente de trabalho onde eu use Componentes e eventos em oposição a URLs e controladores. Estou atualmente à procura de uma razão para eu migrar para este tipo de arquitetura de controlador de URL (foi assim que eu acabei nesta página). Porquê a agitação sobre arquitecturas repousantes e apátridas?

Para responder a esta pergunta em resumo: eu escrevo aplicações web stateful usando um framework orientado a componentes em cima do container de Guice IOC e coloco dados em banco de dados relacional usando Mybatis.

 2
Author: joshua, 2013-12-17 18:56:55

Um pouco diferente, e eu reivindicaria uma arquitetura java mais modular aqui. Temos:

  1. Spring ws/Rest / JSP front end
  2. [[4]] MVC de Primavera para a lógica dos Serviços empresariais, contendo a lógica da camada de apresentação, bem como transacções de primavera
  3. Interface de comunicação do serviço de componentes, pesquisada através da EJB pelos serviços empresariais. A EJBs define seus próprios limites de transação que são capazes de se juntar às transações de Primavera.
  4. implementações do serviço de componentes, mais uma vez Primavera Componentes
  5. camada de integração, MyBatis para integração de bases de dados, ws de Primavera para integração de serviços web, outras tecnologias de integração para outros serviços
  6. Mainframes, bases de dados, Outros serviços noutros servidores...

Além do acima, temos os módulos de biblioteca compartilhada que é um provedor de funcionalidade comum para todos os srevices.

A utilização de diferentes camadas permite-nos a dissociação total e a modularidade de que precisamos. Nós também somos capazes de utilizar plenamente o poder de Java EE, bem como Primavera. Nada nos impede de usar JSF, por exemplo, para a frente, se necessário.

Comparado com a arquitetura exemplo por OP, acho que isto pode ser descrito como tendo quatro camadas principais em vez de três, embora com uma reviravolta.

 1
Author: eis, 2014-06-02 20:21:47
Trabalhei em projectos que usam esse padrão rígido de gestão. Historicamente, eu era um grande defensor da hierarquia rígida, onde tudo se encaixava numa caixa limpa. À medida que avanço na minha carreira, vejo-a forçada em muitos casos. Acredito que a adoção de uma mentalidade mais ágil para o design de aplicações leva a um produto melhor. O que quero dizer com isso criando um conjunto de classes que resolvem o problema em mãos. Em vez de dizer: "construíste um gerente para isto e aquilo?"

A o projecto actual em que estou a trabalhar é um aplicativo web com uma combinação de chamadas de Mvc da primavera e de chamadas RestEasy JSON/Ajax. No lado do servidor, embutido em nossos controladores é uma camada de dados baseada em fachada sensata com JPA / Hibernate para acesso direto a banco de dados, algum acesso EJB, e algumas chamadas de serviço web baseadas em sabonetes. Atar tudo isso junto é algum código de controle java personalizado que determina o que serializar como JSON e retornar ao cliente.

Não passamos quase nenhum tempo a tentar criar uma unidade padrão em vez de optar por adotar a ideia de" pior é melhor " da filosofia de Design Unix. Sendo que é muito melhor para colorir fora das linhas e construir algo sensível, rapidamente do que é para construir algo que adere a um monte de mandatos de design rigoroso.
 0
Author: nsfyn55, 2011-08-22 12:41:52

Os Componentes da Arquitectura de aplicações web incluem:

1: navegador: interacção com o cliente

        HTML
        JavaScript
        Stylesheet

2 : Internet

3: Servidor Web

        CSS
        Image
        Pages(Java render )

4: Servidor De Aplicações

        App Webapp (Java interaction)
        Others WebApps

5: Servidor De Bases De Dados

        Oracle, SQL, MySQL

6: Dados

 0
Author: iCrazybest, 2014-09-14 16:36:05