DIGITALISERINGSSTYRELSEN POC PÅ ORKESTRERINGSKOMPONENTEN SYSTEMDOKUMENTATION AF POC Version: 1.1 Status: Endelig Godkender: Forfatter: Copyright 2019 Netcompany. All rights reserved
Dokumenthistorik Version Dato Forfatter Status Bemærkninger 1.0 2019-05-22 Endelig 1.1 2019-06-12 Endelig Tilrettet pba. review-kommentarer fra DIGST Referencer Reference Titel Forfatter Version [FDA] FDA guidelines for REST baserede services https://arkitektur.digst.dk/metoder/retningslinjerwebservices (pr. 12. juni 2019) Digitaliseringsstyrelsen 0.9 Indholdsfortegnelse 1 Introduktion... 3 2 Teknologier... 3 2.1 Docker... 3 2.2 Kubernetes... 3 2.3 GovCloud... 3 2.4 KrakenD... 3 2.5 Apache Camel... 3 2.6 MongoDB... 3 2.7 Azure... 3 3 Setup beskrivelse... 4 3.1 OK-applikation-container... 4 3.2 KrakenD-container... 4 3.3 MongoDB-container... 4 3.4 Arkitektur... 4 4 Funktionalitet... 5 4.1 Snitflade for dataaftagere... 5 4.2 Snitflade for dataleverandør... 6 5 Tekniske detaljer... 6 5.1 CPR-validering... 6 5.2 Circuit breaker... 7 5.3 Swagger... 7 5.4 Drift... 7 6 Datakilde-setup... 7 2019 Netcompany 2
1 Introduktion Formålet med dette dokument er at beskrive teknologier, arkitektur og funktionalitet i POC af Orkestreringskomponent (POC- OK). 2 Teknologier Dette afsnit beskriver kort de teknologier, der er brugt i POC-OK-løsningen. Teknologier er valgt ud fra, at det på sigt skal være muligt at afvikle applikationen på GovCloud. 2.1 Docker Docker er en open-source software containerization-platform, der gør det muligt at pakke en applikation i en container, der fungerer som en isoleret virtuel maskine. Ved brug af Docker kan man standardisere udviklings-, byg-, test- og produktionsmiljøer. POC-OK består af Docker-containere, der er sat op i et Kubernetes-miljø. 2.2 Kubernetes Kubernetes er en open-source container-orkestrator. Ved brug af Kubernetes kan man opsætte flere containere til at arbejde sammen, og den hjælper med at køre containere på flere virtuelle maskiner, skalere op og ned ved tilføjelse og fjernelse af containere, når efterspørgsel ændrer sig osv. POC-OK består af flere containere, og derfor er denne teknologi brugt i løsningen. 2.3 GovCloud GovCloud er et udviklings- og driftsmiljø, der tilbydes af Statens IT som Platform as a Service. Planen var at deployere POC-OKapplikationen til GovCloud, men platformen var desværre ikke klar til udvikling/drift af applikationer på tidspunktet, hvor udviklingsfase af POC-OK startede. På grund af det, var det nødvendigt at finde anden platform for drift og udvikling og Microsoft Azure blev valgt som alternativ. 2.4 KrakenD Kraken er en REST API Gateway, der er en del af GovCloud-platform. Tanken er, at den udviklede POC-OK skal være kompatibel med GovCloud-platformen. Derfor er KrakenD en del af POC-OK, hvor der opsættes endpoints til datakilder, og KrakenD bruge således som en simpel proxy mellem OK-applikationen og datakilder. 2.5 Apache Camel Apache Camel er et Java-baseret open-source framework, der tilbyder regelbaseret routing. Hvornår en datakildes endpoint skal kaldes er defineret ved brug af Camel-regler. POC-OK bruger foskellige Enterprise Integration Patterns, dvs. Splitter, Content Based Router, Dynamic Router og Aggregator, der alle er en standard-del af Apache Camel. Den er også brugt for at opsætte timeouts ved kald til datakilder og processering af flere parallelle kald. 2.6 MongoDB MongoDB er en open-source cross-platform NoSQL-database, der er nemt at bruge og at skalere. Den gemmer data i JSONdokument-format, der er standard og hurtigt at hente. I Orkestreringskomponent-løsningen blive MongoDB brugt til at gemme CPR-nummer-liste, der bliver brugt til CPR-filtrering, for forskellige datakilder. 2.7 Azure Microsoft Azure er en cloud-platform, hvor man kan bygge, administrere og deployere applikationer ved brug af forskellige frameworks. Platformen tilbyder forskellige services, og en af dem er en Azure Kubernetes Service (AKS), hvor POC-OK er deployeret. 2019 Netcompany 3
3 Setup beskrivelse POC af Orkestreringskomponent består af 3 Docker-containere, der kører i Azure Kubernetes Service: OK-applikation-container KrakenD-container MongoDB-container 3.1 OK-applikation-container OK-applikation-container er baseret på en Spring Boot-applikation, der indeholder en Java-applikation, der bl.a. gør brug af Apache Camel-frameworket. 3.2 KrakenD-container KrakenD-container indeholder KrakenD API Gateway version 0.9. 3.3 MongoDB-container MongoDB-container indeholder MongoDB-dokumentdatabase. 3.4 Arkitektur Dette afsnit giver en kort oversigt over og beskrivelse af arkitekturen i POC-OK. Portal POC-OK OK-applikation Apache Camel KrakenD Datakilde 1 Datakilde 2 MongoDB Datakilde 3 Flowet i løsningen, når en portal anvender data fra POC-OK på vegne af en borger, er som følger: 1. Kald fra en portal til POC-OK bliver modtaget i OK-applikation 2. OK-applikation tjekker, om CPR-nummeret er til stede i MongoDB for datakilder, der skal kaldes, for at hente data 3. OK-applikation kalder specifikke endpoints i KrakenD, der refererer til datakilder, der skal kaldes (dvs. de datakilder, der ikke benytter CPR-filtrering, eller hvor CPR-filtrering har givet et positivt svar ift. at skulle kalde datakilden) 4. KrakenD afvikler kaldet til datakilderne På grund af begrænsninger i KrakenD Gateway API er det ikke muligt at kommunikere med SOAP-baserede services og heller ikke med ASP.NET Web API-baserede services. Nogle af datakilder er derfor konfigureret direkte i OK-applikation (derfor er OKapplikation forbundet direkte til Datakilde 3). 2019 Netcompany 4
4 Funktionalitet Dette afsnit beskriver funktionalitet, der er udstillet i POC-OK. Funktionalitet er opdelt i to snitflader: Snitflade for dataaftagere Snitflade for dataleverandør Snitflader følger guidelines fra digitaliser.dk ([FDA] og helt generelle REST-koncepter. 4.1 Snitflade for dataaftagere En portal kan kalde POC-OK for at hente data på vegne af en borger. Det er muligt at hente data om borgeren ved brug af hent borgerdata -metode på to forskellige niveau: oversigtsniveau og detaljeret niveau. Detaljeret niveau returnerer alt data om en borger. Dette kan være en meget dyr operation for en datakilde. Derfor er det muligt at hente data på oversigtsniveau (for at en portal kan vise liste af sager i brugergræsefladen) og bageefter, når brugeren trykker på en enkelt sag i listen for at udfolde den, er det muligt at hente detaljer omkring specifik sag ved brug af hent sagsdata (da hent ydelsesdata er identificeret undervejs i projektet, blev det aftalt, at det ikke implementeres i POC en). Metode hent borgerdata har følgende flow: 1. En portal kalder POC-OK for at hente data på vegne af en borger 2. Kaldet fra portalen modtages i OK-applikationen 3. OK-applikationen validerer CPR-nummer modtaget i kaldet. Hvis det ikke er gyldigt, returnerer den kode 400 (Bad request) 4. OK-applikationen tjekker, om CPR-nummer modtaget i kaldet er til stede i filtreringsdatabasen og benytter denne information til at bestemme hvilke datakilder, der skal hentes data fra 5. OK-applikationen opdeler kaldet for hver datakilder, der skal kaldes, og udfører kald til datakilder parralelt (først til KrakenD endpoint, der redirekter kaldet til selve datakilden) 6. Når datakilde svarer med data (kommer gennem KrakenD, som sender data tilbage til OK-applikation), bliver data deserialiseret, sammenstillet med data fra andre datakilder i et samlet svar og sendt til den kaldende portal 2019 Netcompany 5
Metode hent sagsdata har følgende flow: 1. En portal kalder POC-OK for at hente data på vegne af en borger 2. Kaldet fra portalen modtages i OK-applikation 3. OK-applikation kalder KrakenD-endpoint, der redirekter kaldet til selve datakilden 4. Når datakilde svarer med data, sender KrakenD data tilbage til OK-applikation, hvor data bliver deserialiseret og sendt til portalen 4.2 Snitflade for dataleverandør Før Orkestreringskomponenten laver et kald ud til en datakilde, tjekker den om CPR-nummeret, der er sendt i kaldet, er til stede i databasen. Orkestreringskomponent udfører kun et kald til en datakilde, der supporterer CPR-filtrering, hvis CPR-nummeret er til stede i databasen for den givne service. Ellers svarer den til portalen, at datakilder ikke har noget data om borgeren (204 No content). Som en dataleverandør er det muligt at tilføje eller/og fjerne CPR-numre til og fra CPR-liste, der er gemt i databasen. Opdatering kan ske som en batch-opdatering ved brug af tilføj/fjern CPR-numre -metoden. Dog kræver metoden, at dataleverandør holder styr på, hvilke CPR-numre der allerede findes i database og medsender kun ændringer i CPR-liste. For at gøre det nemmere for dataleverandør er der udstillet en metode, der erstatter eksisterende CPR-liste med en CPR-liste der er medsendt i kaldet. Desuden er det muligt at rydde op i databasen og fjerne alle CPR -numre fra listen ved brug af denne metode med en tom CPR-liste. CPR-liste er gemt som en liste af dokumenter i MongoDB, der består af et CPR-nummer og et id for en dataleverandør. 5 Tekniske detaljer Dette afsnit beskriver tekniske detaljer om POC-OK-løsningen. 5.1 CPR-validering Orkestreringskomponenten udfører validering af CPR-nummeret, der er medsendt i kaldet. Validering tjekker, om CPR-nummer består af 10 cifre, men det er et check, der kan udvides til yderligere kompleksitet. 2019 Netcompany 6
5.2 Circuit breaker Der er udviklet et circuit breaker-pattern i POC-OK ved brug af Netflix Hystrix-bibliotek (der bliver brugt, hvis en datakilde bliver utilgængelig). 5.3 Swagger Der er for metoder, der er en del af snitfladen for dataleverandører, udviklet en brugergrænseflade ved brug af Swaggerbibliotek: HOST_ADDRESS:8080/swagger-ui.html#/ 5.4 Drift Der er udviklet et scripts for hver komponent, der udfører byg af projekt og Docker-images, tagging og upload af images til et Container Registry. 6 Datakilde-setup For at opsætte en ny datakilde i Orkestreringskomponenten, skal der udføres følgende steps: 1. Tilføje nye endpoints til OK-applikation, der udstiller CPR-filtreringsmetoder 2. Tilføje nye endpoints i KrakenD, der peger på datakilden 3. Tilføje nye endpoints i OK-applikation, der peger på endpoints i KrakenD 2019 Netcompany 7