A arquitetura cliente-servidor é um modelo de computação distribuída onde as tarefas são divididas entre dois tipos de entidades:
- Cliente: Solicita serviços ou recursos
- Servidor: Fornece serviços ou recursos
Esta arquitetura é a base da maioria das aplicações web e sistemas distribuídos modernos.
- Cliente: Interface do usuário, validações locais, apresentação
- Servidor: Lógica de negócio, acesso a dados, processamento
- Protocolo de comunicação (HTTP, HTTPS, TCP, UDP)
- Formato de dados (JSON, XML, HTML)
- Requisições e respostas estruturadas
- Múltiplos clientes podem conectar a um servidor
- Balanceamento de carga
- Distribuição geográfica
Cliente ←→ Servidor
- Cliente se conecta diretamente ao servidor de banco de dados
- Lógica de negócio pode estar no cliente ou servidor
- Exemplo: Aplicações desktop com banco de dados
Cliente ←→ Servidor de Aplicação ←→ Servidor de Banco de Dados
- Separação clara entre apresentação, lógica e dados
- Exemplo: Aplicações web tradicionais
Cliente ←→ Load Balancer ←→ Web Server ←→ App Server ←→ Database Server
- Arquitetura mais complexa com múltiplos serviços
- Microserviços, APIs, cache, etc.
O protocolo mais utilizado para aplicações web:
GET /usuarios/123 HTTP/1.1
Host: api.exemplo.com
Accept: application/json
Authorization: Bearer token123
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"nome": "João Silva",
"email": "joao@exemplo.com"
}Para comunicação de baixo nível:
- TCP: Confiável, conexão estabelecida
- UDP: Rápido, sem garantia de entrega
- Centralização: Dados e lógica centralizados no servidor
- Segurança: Controle de acesso centralizado
- Manutenibilidade: Atualizações no servidor beneficiam todos os clientes
- Escalabilidade: Possibilidade de aumentar recursos do servidor
- Compartilhamento: Múltiplos clientes acessam os mesmos recursos
- Ponto único de falha: Se o servidor falha, todos os clientes são afetados
- Dependência de rede: Comunicação depende da conectividade
- Gargalo do servidor: Servidor pode se tornar um bottleneck
- Complexidade: Gerenciamento de estado e sincronização
Veja ClienteHTTP.java
Veja ServidorSocket.java
Veja ClienteSocket.java
- Cliente envia requisição
- Servidor processa e retorna resposta
- Comunicação síncrona
- Clientes se inscrevem em tópicos
- Servidor publica eventos
- Comunicação assíncrona
- Model: Dados e lógica de negócio (Servidor)
- View: Interface do usuário (Cliente)
- Controller: Coordena comunicação
- Servlet API: Processamento de requisições HTTP
- JSP (JavaServer Pages): Páginas dinâmicas
- Spring Boot: Framework moderno
- Apache Tomcat: Servidor de aplicação
- Swing/JavaFX: Aplicações desktop
- HTTP Client: Requisições HTTP
- WebSocket: Comunicação em tempo real
- Servidor não mantém informações entre requisições
- Cada requisição é independente
- Mais escalável
- Servidor mantém informações do cliente
- Sessões HTTP, cookies
- Mais complexo de escalar
- Verificação de identidade
- Login/senha, tokens, certificados
- Controle de acesso a recursos
- Roles, permissões
- HTTPS/TLS para comunicação segura
- Criptografia de dados sensíveis
-
Execute os exemplos Java fornecidos
- Compile e teste o servidor HTTP simples
- Execute o cliente HTTP para fazer requisições
- Teste a comunicação com sockets
-
Modifique o servidor HTTP
- Adicione novos endpoints
- Implemente autenticação básica
- Adicione logs de requisições
-
Crie um sistema de chat
- Use sockets para comunicação
- Múltiplos clientes conectados
- Servidor distribui mensagens
- Registro de requisições e respostas
- Análise de performance
- Detecção de problemas
- Tempo de resposta
- Throughput (requisições por segundo)
- Uso de recursos (CPU, memória)
- JConsole, VisualVM (Java)
- Postman (teste de APIs)
- Wireshark (análise de rede)
Este módulo cobriu os fundamentos da arquitetura cliente-servidor. No próximo módulo, exploraremos:
- Sistemas de Múltiplas Camadas
- Separação de responsabilidades
- Padrões arquiteturais
- Escalabilidade horizontal e vertical