**SOA** (lyhenne sanoista *Service Oriented Architecture*) eli **palvelukeskeinen arkkitehtuuri** on ohjelmistotekniikassa käytetty arkkitehtuuritason suunnittelutapa, jolla eri tietojärjestelmien toiminnot ja prosessit on suunniteltu toimimaan itsenäisinä, avoimina ja joustavina palveluina. Näitä palveluita tulisi pystyä aina käyttämään avoimien standardien rajapintojen kautta. Tämän avulla pyritään aikaansaamaan erilaisten tietojärjestelmien joustava ja järjestelmäriippumaton vuorovaikutus. SOA:n nähdään olevan yksi keskeinen paradigma Web 2.0 –sukupolven verkkopalveluiden kehityksessä. 

SOA-arkkitehtuurin mukaan palveluita käyttävinä osapuolina toimivat esimerkiksi toiset sovellukset tai palvelut, jotka käyttävät palveluita yleensä tietoverkkojen (esimerkiksi Internetin) kautta avointen rajapintojen ja tekniikoiden (esimerkiksi Web Services) avulla. SOA-arkkitehtuurin hyödyntämisellä pyritään saavuttamaan entistä avoimempien sekä helpommin integroitavien järjestelmien toteuttaminen. SOA:n odotetaan tuovan ohjelmistojen tuottamisprosesseihin tehokkuutta vähentämällä uusien järjestelmien toteuttamiseen kuluvaa aikaa ja kustannuksia. Helpommalla integroitavuudella tavoitellaan sitä, että uudet sovellukset pystyisivät kommunikoimaan vanhojen, jo olemassa olevien sovellusten kanssa, jolloin myös tietojärjestelmien jälleenkäytettävyys voi lisääntyä. 

SOA-arkkitehtuurin avulla voidaan saavuttaa etuja sekä (a) organisaatioiden olemassa olevien sisäisten, omien sovellusten välisessä vuorovaikutuksessa, että (b) ulkoisten sovellusten kanssa tapahtuvassa vuorovaikutuksessa. Tämän on tarkoitus toteutua riippumatta sovelluskehitystekniikoista (käyttöjärjestelmät, ohjelmointikielet ja -tekniikat jne.). Palveluiden pitäisi olla "läpinäkyviä" siten, että jos niiden sisäinen toiminta muuttuu (esimerkiksi palveluita kehitetään teknisesti tai uusia toimintoja lisätään), niiden käytön tulisi säilyä entisellään eikä tarvetta muutoksien tekemiseen palveluita käyttäviin sovelluksiin tulisi olla.

Tavoitteita
-----------

SOA on suunniteltu ratkaisemaan samalla kertaa ainakin kaksi keskeistä haastetta:

1. uusien järjestelmien nopeamman kehittämisen ja jakelun
2. eri järjestelmien välisen integroinnin.

Tietojärjestelmien integrointitarkoituksiin on toki ollut jo vuosikymmeniä mitä erilaisimpia tekniikoita ja ratkaisuja (mm. järjestelmäkohtaiset ratkaisut, COM/DCOM, CORBA, RMI (Java), XML-RPC), mutta yleinen ja yhteisesti käytettävä "standardi" on puuttunut, ja järjestelmien integrointi on jäänyt oikeinkin tehtynä hyvin työlääksi ja kalliiksi, mutta siitä huolimatta joustamattomia ratkaisuja tuottamattomaksi työksi.

SOA eroaa perinteisestä järjestelmien keskinäisestä integroinnista siten, että SOA-mallin mukaiset järjestelmät ovat toisiinsa heikosti sidottuja, mutta silti korkeatasoiseen, usein "älykkääseen" vuorovaikutukseen keskenään pystyviä sovelluspalveluita. SOA-mallissa ajatellaan siten jokaisen järjestelmän sisältävän palvelurajapinnan, minkä kautta sovellus voi tarjota toimintojaan "ulkopuolelle", periaatteessa verkon kautta kaikille sallimilleen järjestelmille.

SOA-mallin mukaan toteutettujen järjestelmien palveluiden yhteistoiminta pohjautuu rakenteellisiin ja järjestelmäriippumattomiin palvelukuvauksiin (esimerkiksi Web Service -ratkaisuissa käytetyt WSDL-kuvaukset). Palveluiden kuvaukset "piilottavat" palvelun tarjoajien järjestelmä- ja tekniikkaspesifit osat. Palvelun käyttäjällä ei pitäisi edes olla tarvetta tietää millä tekniikoilla palvelu on toteutettu. SOA on täysin "teknologianeutraali", sillä se ei ota kantaa tekniikoihin (esimerkiksi Java, .NET) tai ohjelmointikieliin (Java, C#, PHP, C++, Perl, Ruby jne.). Tämä neutraalius mahdollistaa riippumattoman järjestelmien välisen vuorovaikutuksen ja lisää huomattavasti ohjelmistojen jälleenkäytettävyyttä. Kerran hyvin tehtyä palvelua voidaan käyttää periaatteessa rajattomasti muissa sovelluksissa. 

Toinen SOA:an liittyvä käsite on dynaaminen integrointi. Sovellusten pitäisi pystyä automaattisesti paikantamaan tarvitsemansa palvelut, valita sopivista palveluista käyttökelpoisin ja kytkeytyä siihen automaattisesti palvelun sisältämää rajapintaa hyväksikäyttäen. Tähän käyttötarkoitukseen voidaan hyödyntää UDDI:n (*Universal Description, Discovery and Integration*) kaltaisia, palveluiden kuvaamiseen ja rekisteröintiin soveltuvia tekniikoita.

Palveluprosessien kuvaaminen ja hallinta
----------------------------------------

SOA-mallissa palvelukokonaisuuden kuvaamiseen ja hallintaan käytetään usein XML-kieleen pohjautuvaa BPEL-kieltä (*Business Process Execution Language*). BPEL-kielellä kuvataan yrityksen liiketoimintaprosesseja tietojärjestelmien palveluiden tasolla.

Katso myös
----------

* Mikropalvelu

Aiheesta muualla
----------------

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **Palvelukeskeinen arkkitehtuuri**.
* SOA (OASIS)
* Web Services - W3C
* BPEL (OASIS)
* SOA-toteutuksista (Arkistoitu – Internet Archive)