Jämförda versioner

Nyckel

  • Dessa rader lades till.
  • Denna rad togs bort.
  • Formateringen ändrades.

Innehållsförteckning

Tillgång till källkoden

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.

Image RemovedImage Added

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.

Då Mule endast används i det interna flödet så skall Mule-headers i den mån det går inte skickas vidare till andra system i som HTTP-headers. Förutom rent estetiska och säkerhetstekniska orsaker så kan Mule-headers i vissa Mule-versioner ge oväntade konsekvenser om dem plockas upp av senare system som också använder Mule.

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. Konfigureringsinformation för en virtuell tjänst följer nedanstående konfiguration (vissa detaljer utelämnande), se även VP Anvisningar användare[7]:

Kodblock
languagexml
<mule ... >
  <!-- Name of this file is mandatory and may not be changed. -->

  	<flow name="clinicalprocess-health...." >
    <unikt namn beroende på tjänst>" >
		<composite-source>
      			<https:inbound-endpoint
        		address="https://${TP_HOST}:${TP_PORT}/${TP_BASE_URI}/clinical..."
        connector-ref="VPProducerConnector"
        exchange-pattern="request-response"
        responseTransformer-refs="featureKeepAliveResponse wsdlQueryResponse filterResponseHeaders">
        <properties>
          <spring:entry key="featureUseKeepAlive" value="${feature.keepalive.urn.riv.clinical..."/>
          <spring:entry key="featureResponseTimeout" value="${feature.featureresponsetimeout.urn.riv.clinicalprocess..."/>
        </properties>
      				...
				<response-transformers ...>
			</https:inbound-endpoint>

      			<http:inbound-endpoint
        				address="http://${TP_HOST}:${TP_PORT_HTTP}/${TP_BASE_URI}/clinicalprocess..."
        connector-ref="VPInsecureConnector"
        exchange-pattern="request-response"
        responseTransformer-refs="wsdlQueryResponse filterResponseHeaders">
        <properties>
          <spring:entry key="featureResponseTimeout" value="${feature.featureresponsetimeout.urn.riv.clinicalprocess..."/>
        </properties>
      				...
				<response-transformers ...>
			</http:inbound-endpoint>
    		</composite-source>

    		<cxf:proxy-service
      namespace="urn:riv:clinicalprocess:			wsdlLocation="..."
      payload="envelope"
      service="ProcessObservationsResponderService"
      wsdlLocation="classpath:/schemas/interactions/ProcessObservationsInteraction			..."  />   
		</cxf:proxy-service>

		<flow-ref name="vagval-dynamic-routing-flow" />
  	</flow>
</mule>
  • name i flow-transformer-taggen måste vara unikt. Används för att namnge en virtualisering unikt.
  • wsdlLocation måste anpassas till var i paketstrukturen wsdl-en ligger.
  • Parametrarna TP_HOST, TP_PORT_HPPT, TP_PORT_HTTPS, TP_BASE_URI hämtas från den generella konfigurationen av VP. Tillsammans med tjänstedomänens namn och tjänstens namn bildar de den kompletta URL:en till den virtuella tjänsten.

Virtualiseringsplatformen

...

 

...

 

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

Nedan redovisas de mest intressanta paketstrukturerna.

se.skl.tp.virtualisering.exceptionvp

  • 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 versionerexceptions - olika definerade fel som används i VP
  • util - Utilities som används av övriga komponenter i VP
  • vagvalagent - hanterar TAK information som behövs för att göra routing och behörighetskontroll
  • vagvalrouter - gör själva routingen i VP

se.skl.tp.

...

hsa

  • 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

...

  • cache - hanterar HSA information som används för att hitta verksamheter i en trädstruktur.

Intern inkommande "anslutningspunkt"

Den inkommande "anslutningspunkten" definieras med följande konfiguration som definierar ett Mule flöde (många detaljer är utelämnade).

Kodblock
languagexml
<model<mule ... >
    <flow name="vagval-dynamic-routerrouting-flow" >
	<service name="VagvalRouter">
		<inbound>
			<inbound-endpoint address="vm://vagval-router"
				synchronous="true">
				<response-transformers>
					<custom-transformer
						
		<!-- transformers --> 
		<!-- session handling -->

		<cxf:proxy-client payload="envelope" />

		<custom-processor class="se.skl.tp.virtualiseringvp.transformervagvalrouter.ExceptionTransformerVagvalRouter" />
				</response-transformers><!-- spring properties -->
			</inboundcustom-endpoint>processor>
		</inbound>
		<outbound><response>
			<custom<!-outbound-router class="se.skl.tp.virtualisering.VagvalRouter" transformers -->
				<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

  • Sammanställer all indata till vägvalet
    • Receiver - från RivHeadern.
    • Sender - från konsumentens certifikat, SERIALNUMBER i subject-attributet.
    • RIV-TA-profil - från den virtuella tjänstens konfigurationsfil.
    • Tjänstekontrakt - från den virtuella tjänstens konfigurationsfil.
    • Dagens datum
  • Anropar Vägvalsagenten för att få en lista på möjliga vägval(Logiska adresser) baserat på Tjänstekontrakt, Receiver och Sender..
  • Plockar det vägval som har matchande RIV-TA-profil
  • Skickar anropet vidare till den adress som vägvalet hade konfigurerat i Tjänstekatalogen.

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
languagexml
<spring:bean name="vagvalAgent" class="se.skl.tp.virtualisering.vagvalagent.VagvalAgent">
  <spring:property name="endpointAddress" value="${tp.sokVagvalsInfo.url}"/>
</spring:bean>

Adressen till tjänstekatalogen service skall finnas i den externa property filen. Vägvalsagenten notifieras när Mule startar så att den kan göra en initial laddning av vägval från tjänstekatalogen.

Kodblock
languagexml
<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>

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
languagexml
<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
languagexml
<context:property-placeholder location="classpath:tp-virtualisering.props, classpath*:tp-virtualisering-override.props" /></response>
   
		<catch-exception-strategy>
			<!-- transformers -->
		</catch-exception-strategy>
    </flow>
</mule>

VP + virtualiserade tjänster

För att ha en enda konfigurationsfil när mule startas så finns en fil som heter tpvp-virtualisering-PRODconfig.xml. Den laddar dels tp-virtualisering-config.xml (med allt ovanstående) + alla virtualiserade egna konfigurationsfiler och dels alla virtualiserade tjänster den kan hitta på classpathen. Bygger Detta bygger på att alla virtualiserade tjänster har valt rätt namn på sin configurationsfil nämligen tp-virtuell-tjanst-confignamngivit sin konfigurationsfil med följande namn tp2-service-mule-descriptor.xml

Kodblock
languagexml
<spring:beans>
  <spring:import resource="classpath:tp-virtualisering-config.xml"/>...
  <spring:import resource="classpath*:tptp2-virtuellservice-tjanstmule-configdescriptor.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:

...

Genom anrop av denna tjänst kan man på ett enkelt sätt kontrollera att virtualiseringsplattfomen VP inte har avslutats. Anropet sker via http://<host>:20000/monitor/ping. Pingtjänsten konfigureras i mule på följande sätt:

...

languagexml

...

HSA cache

Virtualiseringsplattformen har stöd för att läsa in och spara HSA information lokalt. Informationen läses in från en eller flera filer som kan hämtas från HSA.

HSA trädet för en HSA enhet ligger i en kommaseparerad lista i DN fältet där förälder är nästa del i listan. 

Exemplet nedan är ett utdrag från två filer (den ena innehåller endast root parent med HSA-id=SE)


Vi kan se att i filen nedan att både "Nässjö VC DLM" och "Nässjö VC DLK" ligger under "Nässjö Primärvårdsområde".

"Nässjö Primärvårdsområde" ligger i sin tur under "Höglandets sjukvårdsområde" osv.
Image Added


VP använder informationen för att kontrollera om det finns vägval och behörigheter för organisationer högre upp i trädet om den inte hittar ett för en specifik enhet.

Dvs. om VP i HSA trädet ovan kontrollerar en behörighet för SE0000000001-1234( Nässjö VC DLM) i TAK men inte får någon träff kommer den då att fortsätta med 

SE0000000002-1234(Nässjö Primärvårdsområde) osv. ända tills den hittar en behörighet eller når rooten SE.

Referensapplikation

I RIV TA finns en referensapplikation som mha en tjänst kan påvisa kommunikation mellan en tjänstekonsument och en tjänsteproducent.

...

  • 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.

SökVägvalsInfo

Denna tjänst använder ett internt meddelande format enligt bilden nedan.

Image Removed

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

 

Kodblock
languagetext
# Default log level
log4j.rootCategory=INFO,file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=../logs/vp.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p %d [%t] %c: %m%n
################################################
# You can set custom log levels per-package here
################################################
# Apache Commons tend to make a lot of noise which can clutter the log.
log4j.logger.org.apache=WARN
# Shuts up some innocuous messages if using the JBPM transport
log4j.logger.org.hibernate.engine.StatefulPersistenceContext.ProxyWarnLog=ERROR
# Reduce startup noise
log4j.logger.org.springframework.beans.factory=WARN
# Mule classes
log4j.logger.org.mule=WARN
log4j.logger.com.mulesource=WARN
# Your custom classes
log4j.logger.se.skl.tp=WARN

 

För att styra loggnivåer i virtualiseringsplattformen är det alltså sista raden som ändras till INFO eller DEBUG. Loggningen skapas i en fil som heter vp.log och ligger i foldern logs under MULE_HOME. Man kan också styra hur Mule själv loggar som står beskrivet i Readme under logs i muledistributionen "Application-level logging is configured in the file "conf/log4j.properties" (by default all output is sent to the console). System-level logging is configured in the file "conf/wrapper.conf" (by default all output is sent to the file "logs/mule.log" Note that, unless the application is run in the foreground (i.e., not as a daemon), this means that while the application itself is configured to send its output to the console, the wrapper receives the console output and sends it to the log file. In addition to the application's output, the wrapper also sends any JVM-level or OS-level errors/warnings to the log file. This means that if the JVM crashes and automatically restarts (enabled by default), the time and cause of the crash will remain in the log file after the JVM restarts."