Pontos Chave
- O middleware oferece estruturas de comunicação padronizadas entre diferentes aplicações, simplificando o desenvolvimento e promovendo uma conectividade eficaz.
- A utilização de middleware acelera a adaptação a mudanças e disponibiliza ferramentas de trabalho de fácil acesso.
- O middleware é um exemplo de modularidade que agrega valor a todas as abordagens de programação, desde as mais abstratas até as mais concretas.
É provável que você já tenha se deparado com o termo “middleware” em diversas situações e se questionado sobre o seu significado. Vamos explorar o universo de tecnologias e processos que ele engloba.
O Que Significa Middleware?
Middleware é um conceito multifacetado, empregado em variados contextos. De maneira geral, podemos entendê-lo como “software que opera entre outros softwares”. Em outras palavras, qualquer componente que necessite de um código independente para receber dados e entregar um resultado processado.
Alguns middlewares são aplicações completas que transformam dados, seguindo protocolos e formatos bem definidos para interação com outros códigos. No entanto, um middleware pode ser tão específico quanto uma função individual, interagindo com outras funções dentro de uma arquitetura.
Assim como muitos softwares, o middleware se beneficia da modularidade: um processo complexo é decomposto em partes menores e mais gerenciáveis.
Como o Middleware Funciona?
A eficácia de um middleware reside na solidez de seus protocolos e comportamentos publicamente definidos. Protocolos de comunicação bem estabelecidos permitem que desenvolvedores criem softwares que se alinhem com os padrões para operar de forma correta.
Um servidor de aplicações web funciona como um middleware, conectando a interface do usuário de um site com a lógica e o modelo de dados providenciados por um aplicativo back-end e um banco de dados. Graças a essa comunicação não fortemente acoplada, é possível, teoricamente, substituir um servidor de aplicações por outro compatível sem precisar reescrever o código do aplicativo ou reestruturar seu banco de dados.
Os componentes de middleware geralmente se valem de tecnologias como JSON, REST, XML e SOAP. Estas são tecnologias consolidadas, populares e baseadas em texto, o que facilita a substituição e reorganização de componentes. Seu formato textual e vasta gama de ferramentas também contribuem para uma depuração mais simples e confiável.
Tipos Distintos de Middleware
Devido à abrangência do termo, existem inúmeros exemplos e aplicações de middleware. Alguns dos mais comuns incluem:
- Corretores de mensagens, que conferem estrutura à comunicação entre processos.
- Servidores de aplicações web e frameworks web.
- Engines de jogos, que fornecem funcionalidades padrão que podem ser usadas, ampliadas ou substituídas.
- Plataformas de streaming de eventos, como Apache Kafka.
Middleware no Desenvolvimento de Software
Uma das aplicações mais notáveis do middleware é em frameworks web. A maioria desses frameworks oferece um ambiente centralizado que pode ser personalizado e expandido conforme necessário. O modelo comum envolve o processamento de requisições HTTP através de uma série de funções, tanto integradas quanto personalizadas, em uma ordem predefinida, resultando em uma resposta HTTP ao final.
O framework Express.js utiliza esse modelo para oferecer customização. Veja este exemplo de função de middleware escrita em JavaScript:
app.use('/user/:id', (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
Esta função é bastante simples:
Esta última invocação é fundamental no processo de middleware, mostrando sua versatilidade. Desde que cada função de middleware opere de maneira independente, elas podem ser facilmente substituídas, adicionadas, removidas ou reordenadas, alterando o comportamento de toda a cadeia.
O framework PHP, Laravel, possui uma configuração de middleware praticamente idêntica. Note como o namespace define explicitamente esta classe como “Middleware”.
namespace App\Http\Middleware;use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;class EnsureTokenIsValid
{
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next): Response
{
if ($request->input('token') !== 'my-secret-token') {
return redirect('home');
}return $next($request);
}
}
O papel desta classe é bem específico: verificar se a requisição contém um token. Se a condição não for satisfeita, o middleware interrompe a cadeia, recusando-se a invocar a próxima função e, em vez disso, redireciona o usuário. A função de redirecionamento retorna um objeto Response adequado, que o middleware deve retornar conforme seu contrato.
Este último exemplo mostra como o Django, um framework web baseado em Python, lida com middleware. O Django utiliza o termo “plugin” para descrever sua arquitetura de middleware, que é similar a outros termos como “hook” ou “callback”. Em essência, é mais um exemplo de configuração de middleware que oferece flexibilidade dentro de um processo estruturado.
def simple_middleware(get_response):
def middleware(request):
response = get_response(request)
return response
return middleware
A ordem de execução dos middlewares é controlada por meio de um array:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
O Django oferece funcionalidades padrão, como a classe CommonMiddleware, que beneficia a maioria dos aplicativos. Essa classe impede o acesso de certos user agents considerados “ruins” e normaliza URLs. É comum que middlewares focados em segurança e cruciais sejam executados no início do processo, mas essa flexibilidade permite personalizar a ordem conforme as necessidades de cada aplicação.
Por Que o Middleware é Útil?
O middleware facilita a conexão de aplicações que não foram projetadas para interagir diretamente. Ele provê funcionalidades para integrá-las, juntamente com protocolos robustos e padronizados para sua comunicação.
Consequentemente, o middleware oferece benefícios importantes, como:
- Desenvolvimento de aplicativos simplificado e redução do tempo de lançamento no mercado.
- Conectividade eficiente.
- Adaptação mais rápida a mudanças.
- Disponibilidade de ferramentas de trabalho acessíveis.
Em última análise, o middleware é uma forma de modularidade, um conceito que agrega valor em todas as abordagens de programação, do nível mais abstrato ao mais concreto.