Qual a diferença entre Servidor Web e Servidor de Aplicação? – terminologia webserver servidor-de-aplicação

Pergunta:


Qual a diferença entre Servidor Web e Servidor de Aplicação? Onde cada um é/deve ser utilizado? Há alguma interação entre eles (um software pode utilizar as 2 tecnologias em conjunto)?

Autor da pergunta Ricardo

Piovezan

Um servidor de aplicação é simplesmente um servidor, no sentido da arquitetura cliente-servidor: um processo que atende um ou mais aplicativos clientes que lhe enviam requisições. Coloque para rodar um processo que abre uma porta para atender conexões TCP ou UDP, e voilà!, você tem um servidor de aplicação.

No nosso mundo Web precisamos de vários tipos de servidores. Um que entenda requisições feitas no protocolo HTTP, por exemplo, para se comunicar com clientes espalhados pela Internet. Minimamente esse servidor pode ser capaz de servir dados estáticos, como páginas HTML estáticas, arquivos e imagens. É o chamado “Servidor Web”. Exemplo: o “Apache HTTP Server” ou simplesmente Apache.

Mas só isso não é suficiente. É comum precisarmos que ele sirva dados dinâmicos, como páginas HTML personalizadas, cadeias de bytes, arquivos e até imagens construídos com base em informação variável como os parâmetros da própria requisição ou no resultado de uma consulta a um banco de dados (este por si só um servidor de aplicação também, como o @bigown disse, especializado em armazenar dados).

Uma forma de resolver isso é implementar un servidor Web que tenha comportamento dinâmico. Não é muito prático: dependendo do porte dos serviços que ele se propuser a prestar vamos ter que nos dedicar a implementar muita lógica digamos de “infraestrutura” para o construirmos, como por exemplo separar as requisições em threads para economizar recursos e melhorar performance, lógica de segurança (autenticação, autorização) preferencialmente declarativa (isto é, baseada por exemplo em um arquivo-texto que alguém possa modificar sem ter que recompilar o código todo do servidor), comportamento de filtragem de requisições (por exemplo, o comportamento de sempre autenticar as requisições destinadas a atender usuários logados antes de executar sua lógica), logging, a própria lógica de se interpretar uma página dinâmica e gerar o HTML (isso tudo eu estou descaradamente pegando do livro Head First Servlets & JSP que explica por quais razões é melhor fazer de forma diferente, usando um Container).

Outra forma de fazer é delegar a parte dinâmica para scripts escritos em Perl, PHP ou alguma outra linguagem. Também pode bater de frente com algumas das limitações citadas, inclusive a de abrir um processo separado para cada requisição, o que é mais custoso que usar threads.

Outra forma é usando um Container (também chamado Web Container ou Servlet Container), que é a solução proposta pelas tecnologias Java e que eu conheço melhor. Ele é um servidor também, que recebe as requisições de um servidor HTTP (vulgo servidor Web, lembra?) e cuida de toda a lógica de infraestrutura anteriormente citada, deixando você livre para implementar somente a lógica de negócio que interessa à sua aplicação específica. O Container repassa as requisições para Servlets, que são basicamente classes Java, e cada Servlet executa a requisição em uma thread. Você pode programar um Servlet para atender requisições de login, outro para incluir itens em um pedido, outro para excluir pedidos, e assim por diante.

Isso também costuma ser chamado de “Servidor de Aplicação”, no sentido que eu acredito que você tinha em mente quando fez sua pergunta. Ele é composto por um servidor Web, e também por um servidor extra, o Container, que é responsável pela geração de conteúdo dinâmico. Então podemos dizer que nessa segunda definição de servidor de aplicação, o dito servidor de aplicação contém um servidor Web.

(Note que nessa arquitetura combinada não é preciso que seja um servidor Web, nem que o protocolo seja HTTP; mas é o mais comum no mundo Web).

Exemplo de servidor de aplicação: Apache Tomcat (servidor web Apache + container de servlets). Nota: o Tomcat também tem um servidor HTTP alternativo chamado “Apache Tomcat HTTP Server”.

No Java, uma aplicação destinada a rodar em um container (que costuma ser chamada “aplicação web”) é um arquivo .WAR (abreviatura de “Web ARchive”) que é basicamente composto pelos Servlets que o container irá executar mais algum conteúdo estático (imagens, arquivos de configuração, etc).

Um web server é um application server para atender necessidades web. Por exemplo, ao contrário do que muita gente pensa, o IIS da Microsoft é um application server, sendo que uma das suas funções é servir web.

Um servidor de aplicação “hospeda” processos de um sistema que permitem clientes fazerem requisições e receberem respostas.

Fica óbvio que o servidor web precisa trabalhar com protocolos HTTP e derivados. Ele tem algumas funções pré-definidas que só fazem, ou pelo menos fazem muito sentido para o fluxo normal de soluções web. Em geral, várias das tarefas que um servidor web precisa são as mesmas de qualquer outro tipo de servidor aplicação, incluindo atividades de acesso à banco de dados e/ou delegação de parte da tarefa para um mecanismo fora do servidor em si (chamada de um executável ou script).

Você pode ter um web server que delega o processamento específico para um application server sem especialização (ou não) que delega a manipulação e armazenamento de dados para um database server.

Então algumas pessoas podem usar o termo application server apenas para o host da lógica de negócios (roda o ambiente da aplicação no geral). Alguns vão considerar então que todo web server é um application server neste sentido, já que ele executa lógica de negócios através de scripts.

Outros consideram que apenas o conteúdo estático é o que o servidor web trata e qualquer conteúdo dinâmico faz parte do servidor de aplicação.

As pessoas esquecem que HTTP é uma aplicação com regras específicas.

É basicamente isto. Eu sei que alguns stacks de tecnologias preferem usar definições próprias, mas as acho restritivas. Aprender da forma apresentada por uma tecnologia é seguir a receita de bolo imposta e algumas pessoas se prendem à isto. Em alguns casos eu vejo o termo application server sendo usado para um conjunto de serviços disponíveis. Está certo, aquilo é um app server com algumas funções definidas.

Não gosto, por exemplo, das definições dadas no SO. Eles se prendem à tecnologias específicas, consideram o termo como o mercado usa e não como sugere a computação como um todo.

Você pode escrever um servidor de aplicação com poucas linhas de código. Depende dos requisitos. Um servidor web, por exemplo já não é tão simples. Existem requisitos definidos que não são nada simples. Mas também não digo que seja tão difícil escrever um.

Como complemento podemos dizer que um database server é um application server específico para dar acesso à dados armazenados.

E assim por diante. Um é especialização do outro.

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *