Vad är Middleware?

Viktiga punkter

  • Mellanprogram erbjuder väldefinierade metoder för att sammankoppla applikationer, vilket förenklar utvecklingsprocessen och möjliggör sömlös integration.
  • Genom att använda mellanprogram kan ändringar implementeras snabbare och användarna får tillgång till användarvänliga verktyg.
  • Mellanprogram representerar en typ av modularitet som är fördelaktig inom alla programmeringsområden, oavsett om det handlar om hög- eller lågnivåprogrammering.

Du har kanske hört termen ”mellanprogram” nämnas i olika sammanhang och undrat över dess betydelse. Låt oss utforska den omfattande och mångfacetterade uppsättning av tekniker och processer som kan avses.

Vad är egentligen mellanprogram?

Mellanprogram är ett flexibelt begrepp som kan ha olika betydelser beroende på sammanhanget. I sin mest allmänna definition kan det beskrivas som ”program som körs mellan andra program”. Med andra ord är det all mjukvara som är beroende av extern kod för att ta emot indata och bearbeta utdata.

Vissa typer av mellanprogram fungerar som kompletta applikationer som omvandlar data från ett format till ett annat, med standardiserade protokoll och dataformat som andra program kan använda. Men mellanprogram kan också vara lika specifika som en enskild funktion som integreras i en serie av andra funktioner genom ett ramverk.

Precis som många andra program använder mellanprogram konceptet modularitet, vilket innebär att man delar upp en komplex process i mindre, mer hanterbara delar.

Hur fungerar mellanprogram?

Effektiviteten hos mellanprogram beror i stor utsträckning på dess protokoll och offentligt definierade funktionalitet. Genom att använda strikta kommunikationsprotokoll kan programmerare skapa programvara som följer fastställda standarder för att säkerställa korrekt funktion.

En webbapplikationsserver fungerar som mellanprogram genom att länka samman användarens interaktion med en webbplats (frontend) med den logik och datamodell som tillhandahålls av en backend-applikation och databas. Eftersom applikationsservern inte är direkt kopplad till de system den kommunicerar med, kan den (i teorin) bytas ut mot en kompatibel server utan att behöva skriva om applikationskoden eller omstrukturera databasen.

Mellanprogram använder ofta tekniker som JSON, REST, XML och SOAP. Dessa är etablerade, populära och textbaserade, vilket underlättar utbyte och omorganisering av komponenter. Deras textbaserade format och tillgång till omfattande verktygssatser gör även felsökning enklare och mer tillförlitlig.

Olika typer av mellanprogram

Eftersom termen är så pass bred finns det många olika exempel på och användningsområden för mellanprogram. Här är några av de vanligaste:

  • Meddelandeköer, som strukturerar kommunikationen mellan olika processer.
  • Webbapplikationsservrar och webbramverk.
  • Spelmotorer, som erbjuder standardfunktioner som kan användas, utökas eller bytas ut.
  • Plattformar för händelseströmmar, som till exempel Apache Kafka.

Mellanprogram inom mjukvaruutveckling

En av de tydligaste tillämpningarna av mellanprogram är genom webbramverk. De flesta ramverk erbjuder en grundläggande miljö som kan anpassas och utökas efter specifika behov. Ofta hanteras HTTP-förfrågningar genom en serie av inbyggda och anpassade funktioner i en bestämd ordning, vilket resulterar i ett HTTP-svar.

Express.js-ramverket utnyttjar denna modell för att stödja anpassning. Här är ett exempel på en mellanprogramfunktion skriven i JavaScript:

 app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
}) 

Funktionen är enkel:

  • Den hanterar specifika webbadresser som börjar med ”/user/”, följt av ett ID.
  • Den loggar vilken typ av begäran som gjorts (GET, POST, osv.).
  • Den anropar en funktion, ”next”, för att fortsätta bearbeta kedjan av mellanprogramfunktioner.

Anropet till ”next” är en viktig del av processen och visar hur flexibel metoden kan vara. Så länge varje mellanprogramfunktion fungerar oberoende kan de enkelt bytas ut för att anpassa hela kedjans beteende.

PHP-ramverket Laravel har en nästan identisk implementering av mellanprogram. Observera hur namnrymden explicit definierar denna klass som ”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);
    }
}
 

Även här är rollen för denna klass mycket specifik: den kontrollerar om begäran innehåller en giltig token. I det här fallet kan mellanprogramfunktionen avbryta kedjan, förhindra anropet till ”next” och istället skicka en omdirigering. Funktionen för omdirigering kommer att returnera ett lämpligt Response-objekt, som mellanprogramfunktionen bör returnera som en del av sitt kontrakt.

Detta sista exempel visar hur Django, ett Python-baserat webbramverk, hanterar mellanprogram. Django använder termen ”plugin” för att beskriva sin middleware-arkitektur, vilket liknar andra relaterade termer som ”hook” eller ”callback”. I grund och botten handlar det om en implementering av mellanprogram som erbjuder flexibilitet genom en strukturerad process.

 def simple_middleware(get_response):
    
    def middleware(request):
        
        

        response = get_response(request)

        
        

        return response
    return middleware
 

Du kan sedan kontrollera vilka mellanprogram som körs, och i vilken ordning, med hjälp av en enkel 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",
] 

Django erbjuder standardbeteende som via klassen CommonMiddleware, vilket de flesta applikationer har nytta av; den förhindrar åtkomst från vissa ”dåliga” användaragenter och hanterar URL-normalisering. Det är vanligt att verksamhetskritisk och säkerhetsfokuserad mellanprogram körs tidigt i bearbetningskedjan. Flexibiliteten gör det möjligt att anpassa ordningen efter behov.

Varför är mellanprogram användbart?

Mellanprogram underlättar anslutningen av applikationer som inte är designade för att kopplas samman. De tillhandahåller funktioner för integration, tillsammans med robusta och strukturerade protokoll för kommunikation.

Detta ger mellanprogram viktiga fördelar, inklusive:

  • Effektivare applikationsutveckling och snabbare lansering.
  • Sömlös anslutning.
  • Snabbare hantering av förändringar.
  • Tillgång till lättanvända verktyg.

Slutligen representerar mellanprogram en form av modularitet, ett koncept som är fördelaktigt för alla typer av programmering, oavsett om det handlar om hög- eller lågnivåkod.