6 verktøy for en feilfri integrasjon

Dag Findal-Fossmo
Systek
Published in
8 min readOct 24, 2017

Integrasjon er noe av det mer krevende en utvikler eller arkitekt kan jobbe med, enten det er samarbeid med eksterne parter eller utvikling av distribuerte systemer. Feltet er fremdeles relativt umodent og har hatt flere store paradigmeskifter på kort tid. I tillegg er det ofte kommunikasjonsutfordringer mellom systemeierene samt kompleksitet og inkompatibilitet i en jungel av protokoller, standarder og implementasjoner. Oppå det hele skal sikkerheten ivaretas på en god måte, noe som legger til enda et lag med kompleksitet i form av kryptering, autentisering, autorisering, soneinndeling osv.

I et slikt landskap er det ikke bare lett å være utvikler og man kan til tider miste en del hår i ren frustrasjon, men gode verktøy kan ofte gjøre hverdagen noe enklere. Jeg har her samlet opp noen av mine favoritter som jeg har hatt mest bruk for i årens løp, og et par jeg kunne tenkt meg å få mer bruk for fremover:
1. XMLSpy
2. Tekstbehandlere
3. Curl
4. Wiremock
5. Postman
6. Spring Data REST

1. XMLSpy

XML-formatet har fått mye pes de siste åra, og mange har gått over til det mer lettbente JSON-formatet for å representere data som tekst. Det er likevel mye integrasjon som gjøres vha XML og de assosierte konseptene som BPEL, XPATH, XSD, XSLT, osv, og man må nok regne med at det kommer til å være i bruk en god stund fremover.

XMLSpy er et tekstredigeringsprogram med fokus på lesing og redigering av XML og co. Det er dessverre lisensbelagt, med en pris på ca 4000, men i dette tilfelle er det definitivt verdt det. Det finnes også dessverre bare til Windows, men det funker etter min erfaring fint med Windows-kompabilitetsprogrammet Wine, og i disse dager har man mange også tilgang til en virtuell Windows-maskin.

XMLSpy har et tonn med hendig funksjonalitet for å få oversikt over, redigere og validere, ikke bare xml-filer, men også til relaterte formater som xslt, xsd, wsdl osv. Du kan også få hjelp til å kjøre og teste xpath og xquery-script, samt teste og feilsøke tjenestekall.

Det jeg har hatt mest bruk for og mener er rosinen i pølsa er xsd-visningen. Denne er 100% grafisk og gjør om tekst som er ganske vanskelig å lese til fine og lettforståelige UML-aktige bokser og piler. Man kan også lett redigere skjemaene, og får hjelp til det ved at typer og enumer kan velges i nedtrekksmenyer.

Xsd kan også lett genereres fra en eksempel-xml og omvendt, noe som kan være kjekt når man skal teste en tjeneste eller lage en klientapplikasjon.

I senere versjoner har de også fått tilsvarende støtte for JSON og JSON-skjema. Det rettferdiggjør neppe kostnaden alene, gitt at JSON-skjema ikke er så mye i bruk ennå, men er fine tillegg til XML-funksjonaliteten.

2. Tekstbehandlere

Selv om det begynner å bli mindre av det, er det fremdeles en del filbasert integrasjon der ute. Disse filene kan ofte bli gigantiske og være kodet i diverse tegnsett, og da fungerer det dårlig å se på de i Notepad eller more/less. Et godt tekstbehandlingsverktøy bør også kunne vise deg hvordan ting virkelig ser ut. Særspråklige bokstaver, som æ,ø og å, kodes f.eks. som 2 byte i UTF-8, noe som kan tulle til integrasjon med filer der feltene har faste lengder. Et feilplassert linjeskift kan også være fatalt, for ikke glemme de mer skumle tegnene som myke linjeskift og tabulator.

Også for html/xml-basert integrasjon er det viktig å ha en god tekstbehandler, bl.a. for å kunne formatere til en mer lesbar struktur og for å ha funksjonalitet for (de)koding i tekstverktøyet. Du har kanskje sett tekst som dette: &lt;h1&gt;Tekst&lt;/h1&gt; i filer og URL’er. Dette er jo ikke så lesbart, men i et godt tekstbehandlingsverktøy skal det være lett å dekode til <h1>Tekst</h1>.

Det finnes en hel del å velge i her, og de har ofte forskjellige styrker og svakheter, så det kan være lurt å prøve ut flere. Jeg skal ikke gå så dypt inn i hvert enkelt verktøy, men heller gi en kjapp oversikt over de jeg har erfaring med.

Atom — Gratis og open source. Utvidbar.

Sublime Text — Veldig god på store filer, utvidbar men proprietær og lisensbelagt

Notepad++ — Enkel og bra. Windows-sentrisk. Gratis.

UltraEdit — Kraftplugg og veldig utbredt. Lisensbelagt ~1000kr.

Vim — Også kjent som vi. Klassiker fra UNIX. Veldig effektiv på å endre på store mengder av tekst. Gratis og åpen kildekode. Kan kjøre i alle miljøer, også noen ikke-grafiske (ssh/telnet). Ikke intuitiv å bruke, så les en tutorial før du begynner, f.eks. her http://www.openvim.com/.

3. Curl

Kalle tjenester fra kommandolinja. Det er ganske kult, og kan gjøres med det nå ekstremt utbredte verktøyet curl. Det støtter en hel busslast av protokoller og standarder — har du en url kan du ganske sikkert sende noe mot den vha curl, om det er http, ftp, ssh, etc.

Det enkleste bruksområde er å laste ned nettsider:

curl www.systek.no

Det finnes også mer nyttige ting, som å finne din eksterne ip-adresse

curl ifconfig.me

og andre har også litt wow-faktor

curl http://wttr.in/bergen

Da dette jo er et kommandolinjeverktøy så kan man dermed kombinere det med andre kommandoer, som denne som gir deg kjapt svar på om en nettside er oppe

curl -Is www.systek.no -L | grep HTTP/

Sammen med awk kan man hente ut og presentere nesten hva man vil fra en nettside, og man kan også følge med på ting som forandrer seg over tid. Hvis du f.eks. har kjøpt Apple-aksjer i det siste, kan du følge med på utviklingen av den slik:

while :;do curl -s ‘http://download.finance.yahoo.com/d/quotes.csv?s=aapl&f=l1';sleep 10;done

I dag leverer jo mange tjenester data på JSON-formatet som man kan håndtere vha jq. Dette er et veldig kraftig og nyttig verktøy som bruker filtre til å plukke ut de bitene du vil ha fra dataene. API’et til Ruter (http://reisapi.ruter.no og http://devi.ruter.no) er tjenester jeg liker å leke meg litt med. Eksempelvis kan denne gi deg når neste tog fra Hauketo stasjon i Oslo har avgang:

curl http://reisapi.ruter.no/StopVisit/GetDepartures/3010910 | jq '.[0]|.["MonitoredVehicleJourney"]|.["MonitoredCall"]|.["ExpectedDepartureTime"]'

Selv om disse eksemplene er kule og kanskje nyttige, kommer den store nytten når man lager script eller baker det inn i applikasjoner. Det siste gjøres vha libcurl, som er det navnet tilsier et bibliotek man kan importere inn og bruke fra kode.

I jobbsammenheng er det definitivt nyttig til å kjapt kunne teste endepunkter og request’er eller lage større opplegg for automatisert tester og overvåking.

4. Wiremock

Lite er mer irriterende for utviklere enn å komme på jobb om morgenen, åpne innboksen og finne en ekkel melding om at bygget/utrullingen har feilet pga feilende integrasjonstester. Det må i så fall være at man finner ut at det har feilet fordi en tjeneste utenfor huset eller prosjektet er endret eller er utilgjengelig.

For de i prosjektledelsen kan det også bli litt kleint når de får meldinger fra integrasjonspartnere som lurer på hvorfor i all verden tjenestene deres blir kalt midt på natta, eller hvorfor de må kalle samme tjenesten tusenvis av ganger i løpet av noen minutter.

For de som ikke har jobbet med integrasjon så mye fortoner nok dette seg litt rart, men jeg skal love deg at dette er veldig utbredt i applikasjoner med mange systemkritiske integrasjoner. Det er ikke trivielt å kunne godkjenne en ny versjon av systemet uten å ha testet det mot alle endepunktene, og heller ikke så enkelt å skulle lage og vedlikeholde kopier av disse til eget bruk.

Å bruke et mock-rammeverk for tjenestekall kan være en god løsning, og det finnes flere av disse. Wiremock er et jeg har hatt litt erfaring med, og det virker ganske lovende. Det er hovedsaklig ment å brukes ifm med systemer på Java-plattformen, men det finnes også tilsvarende til .Net som f.eks. Moq.

Wiremock funker ganske enkelt ved at det tar imot en http-request, sparer på den til senere, venter litt og så evt returnerer en response med den status du måtte ønske. Dette kan den gjøre fra en kjørende prosess som kan konfigureres kontinuerlig, du kan starte opp en prosess pr test eller test-suite vha junit-regler. Man kan også sette opp mock-tjenestene til å returnere feilkoder, eller sette responstiden, for å sjekke hvordan systemet håndterer avvik. Dette er spesielt nyttig i distribuerte systemer med mange tjenester hvor feilsituasjoner kan kaskade og ta ned store deler av systemet.

På denne måten kan du med sikkerhet verifisere at din applikasjon integrerer som forventet med eksterne og interne API’er, men man mister testen av de eksterne endepunktene. Selv om dette er utenfor ens ansvarsområde, så hjelper det lite når brukerne dine hamrer på døra og krever ditt hode fordi de ikke får gjort jobben sin. Det er fremdeles lurt å ta overvåking og testing av eksterne grensesnitt ut av byggeprosessen, men man burde fremdeles følge litt med, og et verktøy for den type arbeid er Postman, som vi skal se litt på i neste punkt.

5. Postman

Med Postman kan man lage og kjøre kall til tjenesteendepunkter ved hjelp av noen enkle grep i et oversiktlig og lettfattelig brukergrensesnitt.

Dette er en litt ny vri på SoapUI, som noen kanskje drar kjensel på, med et mer oppdatert utseende og et skarpere fokus på http-protokollens muligheter. Postman kan man litt enkelt si er for REST det SOAPUI var for SOAP, men begge verktøyene kan brukes til begge typer.

I Postman velger man seg først en http-operasjon, get, post, put, osv, og skriver så inn adressen til endepunktet. Så fyller man ut andre påkrevde data avhengig av hva slags operasjon man har valgt, parametere, autorisering, header og body. Når man trykker på send-knappen og responsen kommer tilbake ser man dette i vinduet under.

Trenger man å gjøre noen forberedende skritt i forkant kan man kjøre kode i det innebygde node.js-kjøremiljøet, og man kan også gjøre visse sjekker og valideringer på responsen. Kodeeksempler for de mest brukte aktivitetene og testene er gjort lett tilgjengelig i programmet, noe som gjør at man kjapt kommer i gang.

Historikk over de siste kall man har gjort samt en favoritt-funksjon gjør at man lett har tilgang på ting man har gjort før, og man kan også eksportere de til byggesystemet sånn at man kan kjøre disse automatisk. På den måten kan man både følge med på sine egne tjenester og andres uten at dette trenger å brekke bygget ditt eller plage andre på rare tider av døgnet.

6. Spring Data REST

Til slutt vil jeg ta med et av mange rammeverk for å lage REST-grensesnitt — et som er nært knyttet opp til datamodellen og persisteringsmekanismen: Spring Data REST hjelper deg med å lage et REST-grensesnitt, som er utforskbart med HAL-lenker, mot et datalager satt opp med Spring Data. Spring Data er enkelt sagt er et rammeverk som lager dataaksessobjektene for deg og binder disse opp i Spring-konteksten.

Verdien av dette, og andre lignende opplegg, er at du kjapt kan sette opp dataoverføring fra applikasjonen din til et datalager. Strengt tatt trenger du bare definere opp modellen din og litt kjappe konfigtriks, som du kan få pakket ferdig i Spring Boot, så har du fiks ferdig persistering med CRUD-operasjoner tilgjengelig via http. For mindre prosjekter med korte tidsrammer og relativt små modeller er dette en fin måte å få opp en Java-backend, med all den støtten denne plattformen gir deg til videre utvidelser og utvikling. Det kan jo hende at noen etterhvert kommer med ønsker om litt forretningslogikk, og det er vel ikke sjeldent at små prosjekter over tid vokser seg til å bli store og komplekse beist. Hvis man da har lagt eggene sine i en mindre moden og mindre utvidbar plattform så kan man bli sittende med skjegget i innboksen.

--

--