...
Se Instruktioner för utvecklare.
Produktval som påverkar implementationen
Valet av Mule ESB
För att uppnå robusthet, skalbarhet, möjlighet till framtida utökningar, och utnyttja redan skriven och testad kod nyttjar vi en ESB som grundplattform. Produkten Mule ESB har valts.
Strategin för bakom beslutet var att utgå ifrån marknadens mest etablerade öppen-källkod-ESB. Mule ESB intar här en särställning helt utan konkurrens. Mule ESB har sedan utvärderats med avseende på de krav som ställdes på virtualiseringsplattformen. Utvärderingen genomfördes inkrementellt under projektet, där kraven realiserades i prioritetsordning fram tills en eventuell signifikant brist i Mule ESB upptäckts. Även om Mule ESB bedömdes vara marknadens i särklass mest utbredda ESB inom öppen källkod, är stödet för just tjänstevirtualisering relativt nytt. Det kan förmodligen förklara att en defekt kring hanteringen av ömsesidig identifiering med SSL/TLS upptäcktes under lasttest. Efter att ha kontaktat leverantören Mule Source och klargjort betydelsen av detta projekt, prioriterade leverantören den inrapporterade defektrapporten och levererade en uppdatering till projektet inom 24 timmar.
Hur Mule ESB tillämpas
För att tillmötesgå kravet på enkel installation av nya virtuella tjänster paketeras varje virtualiserad tjänst som en komponent. Denna komponent (paketerad virtuell tjänst) hör samman med det tjänstekontrakt den virtualiserar snarare än en specifik instans av virtualiseringsplattformen. Den kan sedan installeras i alla förekommande driftsinstanser av virtualiseringsplattformen utan någon ytterligare konfiguration. som tillförs ESB'n. Vägvalsroutern är den komponent som alla virtualiserade tjänster kommunicerar med via ett internt protokoll.
...
Den virtuella tjänsten exponerar en anslutningspunkt in till vår ESB för ett visst tjänstekontrakt. Vid ett anrop från en tjänstekonsument anropas virtualiseringsplattformen internt med ett meddelande som innehåller all inkommande information. Virtualiseringsplattformen exponerar en intern anslutningspunkt för inkommande anrop från den virtuella tjänsten. Alla virtuella tjänster skickar anropen vidare till samma interna anslutningspunkt. En routing sker i virtualisringsplattformen till en extern tjänsteproducent när alla villkor för denna routing är uppfyllda.Om villkoren inte är uppfyllda returneras ett SoapFault. Virtualiseringsplattformen anropar tjänstekatalogen för att få nödvändig virtualiserings- och behörighetsinformation vid uppstart av ESB'n.
Virtuell tjänst
Nödvändiga delar att paketera blir enbart en konfigurationsfil samt tjänstekontraktet (WSDL) med dess tjänsteschema. Detta paketeras i en jar-fil. Konfigureringsinfomation för en virtuell tjänst skall följa denna mall, se även VP Anvisningar användare[7]:
...
- name i message-properties-transformer-taggen måste vara unikt. Används för att tala om för VP vilken RIV-TA-profil som den virtuella tjänsten implementerar. Samma namn skall refereras i transformer-refs längre ner.
- name i model-taggen måste vara unikt. Likaså name i service-taggen.
- wsdlLocation måste anpassas till var i paketstrukturen wsdl-en ligger.
- Parametrarna tp.host, tp.port, tp.baseUri hämtas från den generella konfigurationen av VP. Tillsammans med servicen namn bildar de den kompletta URL:en till den virtuella tjänsten.
Virtualiseringsplatformen
Den interna strukturen i virtualiseringsplattformen definieras med följande konfiguration som har namnet tp-virtualisering-config.xml (några detaljer är utelämnade).
...
language | xml |
---|
...
Paketstrukturer för virtualiseringsplattformen
se.skl.tp.virtualisering
- VagvalsRouter – utför vägvalet
- VagvalInput - ett simpelt TO (transferobjekt) för parametrar som är input till vägvalet
se.skl.tp.virtualisering.exception
- VpSematiskException - kastas typiskt vid felkonfiguration, behörighet saknas mm
- VpTechnicalException - kastas vid runtime fel
se.skl.tp.virtualisering.transformer
- ExceptionTransformer - formatterar om exceptions till konsumenten
- ObjectArrayToStreamXmlTransformer - skall bort i framtida versioner
se.skl.tp.virtualisering.vagvalagent
- VagvalAgent - vägvalsagenten
- MuleStartupNotificationHandler – initerar vägvalsagenten vid uppstart
- SokVagvalsInfoTestStub - möjliggör test med en stubbad sökvagvalstjänst
- VagvalInfo - används av SokVagvalsInfoTestStub för att kunna simulera konfiguration i tjänstekatalogen
Intern inkommande anslutningspunkt
Den interna strukturen i virtualiseringsplattformen definieras med följande konfiguration som har namnet tp-virtualisering-config.xml (några detaljer är utelämnade).
Kodblock | ||
---|---|---|
| ||
<model name="vagval-router">
<service name="VagvalRouter">
<inbound>
<inbound-endpoint address="vm://vagval-router"
synchronous="true">
<response-transformers>
<custom-transformer
class="se.skl.tp.virtualisering.transformer.ExceptionTransformer" />
</response-transformers>
</inbound-endpoint>
</inbound>
<outbound>
<custom-outbound-router class="se.skl.tp.virtualisering.VagvalRouter">
<spring:property name="vagvalAgent" ref="vagvalAgent" />
<spring:property name="senderIdPropertyName" value="${tp.senderIdPropertyName}" />
</custom-outbound-router>
</outbound>
</service>
</model> |
Inkommande endpoint är den intern anslutningspunkt som nämnts tidigare dit alla virtuella tjänster skickar sina anrop. Den är en virtuell kö som Mule intern implementerar på ett mycket effektivt sätt.
ExceptionTransformer
ExceptionTransformer är en klass som kontrollerar om det kastats någon exception av typ VpSematicException eller VpTechnicalException (virtualiseringsplattformens egen-definierade exceptions). I så fall formateras returmeddelandet om så att det klienten får feltexten från original exceptionen i sitt SoapFault.
VagvalRouter
VagvalRouter är en klass som
...
VagvalRouter har också en enkel property injicerad senderIdPropertyName som avgör vilket delfält i subjectattributet som skall parsas fram för att identifiera konsumenten. Bör vara satt till tp.senderIdPropertyName=SERIALNUMBER i den externa property filen.
VagvalAgent
VagvalRouter har en VagvalAgent injicerad. VagvalAgent är en klass som cachar all vägval genom att anropa tjänstekatalogen och svarar på frågor om vilka vägval som matchar en viss kombination av sender, receiver, tjänstekontrakt och datum. Vägvalsagenten definieras via följande konfiguration
...
Kodblock | ||
---|---|---|
| ||
<spring:bean name="muleStartupNotification" class="se.skl.tp.virtualisering.vagvalagent.MuleStartupNotificationHandler”> <spring:property name="vagvalAgent" ref="vagvalAgent"/> </spring:bean> <notifications> <notification event="CONTEXT"/> <notification-listener ref="muleStartupNotification"/> </notifications> |
Certifikat
...
Gemensamt hjälpbibliotek
Projektet heter tp-util.
Gemensamt schemabibliotek
Projektet heter tp-schemas.
Certifikat
Det certifikat och truststore som VP använder pekas ut via följande konfiguration som i sin tur styrs av den externa propertyfilen.
Kodblock | ||
---|---|---|
| ||
<https:connector name="myHttpsConnector" clientSoTimeout="8000" >
<https:tls-client path="${tp.tls.store.location}/tp.jks" storePassword="${tp.tls.store.password}"/>
<https:tls-key-store path="${tp.tls.store.location}/tp.jks"storePassword="${tp.tls.store.password}" keyPassword="${tp.tls.store.password}" />
<https:tls-server path="${tp.tls.store.location}/truststore.jks" storePassword="$ {tp.tls.store.password}" requireClientAuthentication="true"/>
</https:connector> |
Externa properties
Genom följande konfiguration tas den externa propertyfilen tp-vitualisering-override.props in
Kodblock | ||
---|---|---|
| ||
<context:property-placeholder location="classpath:tp-virtualisering.props, classpath*:tp-virtualisering-override.props" /> |
VP + virtualiserade tjänster
För att ha en enda konfigurationsfil när mule startas så finns en fil som heter tp-virtualisering-PROD.xml. Den laddar dels tp-virtualisering-config.xml (med allt ovanstående) + alla virtualiserade tjänster den kan hitta på classpathen. Bygger på att alla virtualiserade tjänster har valt rätt namn på sin configurationsfil nämligen tp-virtuell-tjanst-config.xml
Kodblock | ||
---|---|---|
| ||
<spring:beans>
<spring:import resource="classpath:tp-virtualisering-config.xml"/>
<spring:import resource="classpath*:tp-virtuell-tjanst-config.xml"/>
</spring:beans> |
Paketstrukturer för virtualiseringsplattformen
se.skl.tp.virtualisering
- VagvalsRouter – utför vägvalet
- VagvalInput - ett simpelt TO (transferobjekt) för parametrar som är input till vägvalet
se.skl.tp.virtualisering.exception
- VpSematiskException - kastas typiskt vid felkonfiguration, behörighet saknas mm
- VpTechnicalException - kastas vid runtime fel
se.skl.tp.virtualisering.transformer
- ExceptionTransformer - formatterar om exceptions till konsumenten
- ObjectArrayToStreamXmlTransformer - skall bort i framtida versioner
se.skl.tp.virtualisering.vagvalagent
- VagvalAgent - vägvalsagenten
- MuleStartupNotificationHandler – initerar vägvalsagenten vid uppstart
- SokVagvalsInfoTestStub - möjliggör test med en stubbad sökvagvalstjänst
- VagvalInfo - används av SokVagvalsInfoTestStub för att kunna simulera konfiguration i tjänstekatalogen
Monitorering
Tjänsteplattformen innehåller 2 enkla web tjänster för monitorering av virtualiseringsplattformen.
Ping tjänst
Systemet exponerar en enkel sk ping tjänst som anropas via ett http. Parametrar till detta anrop anges i en virtualiseringsplattformens externa propertyfil. Dessa properties är följande:
Kodblock | ||
---|---|---|
| ||
tp.ping.port=20000
tp.ping.uri=monitor/ping
tp.ping.response=TP is alive! |
Genom anrop av denna tjänst kan man på ett enkelt sätt kontrollera att virtualiseringsplattfomen inte har avslutats. Anropet sker via http://<host>:20000/monitor/ping. Pingtjänsten konfigureras i mule på följande sätt:
Kodblock | ||
---|---|---|
| ||
<service name="pingService">
<inbound>
<http:inbound-endpoint address="http://${tp.host}:${tp.ping.port}/${tp.ping.uri}" synchronous="true">
<response-transformers>
<expression-transformer>
<return-argument expression="${tp.ping.response}" evaluator="string"/>
</expression-transformer>
</response-transformers>
</http:inbound-endpoint>
</inbound>
</service> |
Dasboard
Denna tjänst exponerar statistik på anrop genom virtualiseringsplattformen. Nedan en skärmdump som visar vilken data som redovisas.
...
="${tp.tls.store.password}" keyPassword="${tp.tls.store.password}" />
<https:tls-server path="${tp.tls.store.location}/truststore.jks" storePassword="$ {tp.tls.store.password}" requireClientAuthentication="true"/>
</https:connector> |
Externa properties
Genom följande konfiguration tas den externa propertyfilen tp-vitualisering-override.props in
Kodblock | ||
---|---|---|
| ||
<context:property-placeholder location="classpath:tp-virtualisering.props, classpath*:tp-virtualisering-override.props" /> |
VP + virtualiserade tjänster
För att ha en enda konfigurationsfil när mule startas så finns en fil som heter tp-virtualisering-PROD.xml. Den laddar dels tp-virtualisering-config.xml (med allt ovanstående) + alla virtualiserade tjänster den kan hitta på classpathen. Bygger på att alla virtualiserade tjänster har valt rätt namn på sin configurationsfil nämligen tp-virtuell-tjanst-config.xml
Kodblock | ||
---|---|---|
| ||
<spring:beans>
<spring:import resource="classpath:tp-virtualisering-config.xml"/>
<spring:import resource="classpath*:tp-virtuell-tjanst-config.xml"/>
</spring:beans> |
Monitorering
Tjänsteplattformen innehåller en enkel web tjänst för monitorering av virtualiseringsplattformen.
Ping tjänst
Systemet exponerar en enkel sk ping tjänst som anropas via ett http. Parametrar till detta anrop anges i en virtualiseringsplattformens externa propertyfil. Dessa properties är följande:
Kodblock | ||
---|---|---|
| ||
tp.dashboardping.port=20000 tp.ping.uri=monitor/dashboardping tp.dashboardping.port=9191response=TP is alive! |
Genom anrop av denna tjänst kan man på ett enkelt sätt kontrollera att virtualiseringsplattfomen inte har avslutats. Anropet sker via http://<host>:919120000/monitor/dashboard och Dashboard sidan uppdateras automatiskt var 60:e sekund. Dashboarden ping. Pingtjänsten konfigureras i mule på följande sätt:
Kodblock | ||
---|---|---|
| ||
<service name="htmlDashboardServicepingService"> <inbound> <http:inbound-endpoint address="http://${tp.host}:${tp.dashboardping.port}/${tp.dashboardping.uri}" synchronous="true" />> <response-transformers> <expression-transformer> </inbound> <component> <spring<return-objectargument beanexpression="HtmlDashboardComponent${tp.ping.response}" evaluator="string"/> </component> </service> |
Paketstruktur för monitorering
se.skl.tp.virtualisering.dashboard
- HtmlDashboard – huvudansvar för dashboarden, hämtar info i mule registry
- HtmlDashboardRenderer – rendrerar html-sidan
- CssProvider – läser in css-fil som används vid rendreringen
Gemensamt hjälpbibliotek
Projektet heter tp-util.
Gemensamt schemabibliotek
Projektet heter tp-schemas.
Referensapplikation
Den syftar till att
- illustrera hur en virtuell tjänst paketeras
- ge möjlighet att provköra virtualiseringsplattformen med en virtuell tjänst
- titta på exempel på hur en tjänstekonsument och tjänsteproducent kan se ut
- verifera en installation av virtualiseringsplattformen
Referensapplikationen består av nedanstående projekt, som var och ett byggs till komponenter.
tp-journalinfo-apoteket-test-virtualisering
Innehåller den konfigurations-fil som alla virtualiserade tjänster måste ha: tp-virtuell-tjanstconfig. xml. Projektet innehåller även tjänsteinteraktionens wsdl, tjänstescheman och meddelandescheman, samt WS-addressing-core-schema. När man bygger detta projekt paketeras en jar. Denna jar representerar en virtuell tjänst och syftar till att installeras på virtualiseringsplattformen.
tp-journalinfo-apoteket-test-consumer
Innehåller en java-klass som gör ett anrop till den virtualiserade tjänst som tp-journalinfo-apotekettest-virtualisering representerar
tp-journalinfo-apoteket-test-producer
Innehåller en java-klass som svara på ett anrop från den virtualiserade tjänsten som tp-journalinfoapoteket-test-virtualisering representerar.
Certs
...
expression-transformer>
</response-transformers>
</http:inbound-endpoint>
</inbound>
</service> |
Referensapplikation
I RIV TA finns en referensapplikation som mha en tjänst kan påvisa kommunikation mellan en tjänstekonsument och en tjänsteproducent.
VP's referensapplikation består av följande komponenter:
- RIV TA rivta-bp21-refapp-consumer som tjänstekonsument
- RIV TA rivta-bp21-refapp-producer som tjänsteproducent
- Virtualiseringen MakeBooking i tjänstedomänen crm:scheduling, se nedan
använder en virtualisering för denna tjänst och knyter ihop en tjänstekonsument med en tjänsteproducent mha konfiguration i en driftssatt VP instans.
Referensapplikationen syftar till att
- illustrera hur en virtuell tjänst paketeras
- ge möjlighet att provköra virtualiseringsplattformen med en virtuell tjänst
- verifera en installation av virtualiseringsplattformen
crm-scheduling-makebooking-virtualisering
Innehåller den konfigurations-fil som alla virtualiserade tjänster måste ha: tp-virtuell-tjanstconfig. xml. Projektet innehåller även tjänsteinteraktionens wsdl, tjänstescheman och meddelandescheman, samt WS-addressing-core-schema. När man bygger detta projekt paketeras en jar. Denna jar representerar en virtuell tjänst och syftar till att installeras på virtualiseringsplattformen.
Meddelande struktur
Alla meddelande strukturer som används av tillförda virtualiserade tjänster följer RIV-TA-profilen. Meddelande formatet åtföljer WSDL bekrivningen för en virtuell tjänst.
...
Denna tjänst använder ett internt meddelande format enligt bilden nedan.
Exceptions
Felsituationer rapporteras av virtualiseringsplattformen enligt /wiki/spaces/SKLTP/pages/3187836516 . Om ett fel uppstår loggas det och ett VpSemanticException kastas. Det görs senare om till SoapFaultException vilket är den exception som når klienten.
Loggning
Eftersom virtualiseringsplattformen är baserad på Mule används mekanismerna i Mule för att styra loggning. Mule använder log4j vilket beskrivs i http://ricston.com/blog/?p=81. Ett förslag på log4j.properties är som följer
...