Hmmm. Dobrý námět na qalitní blog-post, třeba mne to donutí zase
otevřít ORESTování...

Zkusím být teďka stručný:

verzování ve světě WebServis, o kterém mluvíš, je třeba rozlišit do
několika kategorií podle způsobu řešení a čeho tím chceme dosáhnout:
a) jsme na konferenci o Javě, takže začnu tady: typické řešení
verzování v Javě ala RMI, tedy s přístupem class->WSDL. Kdo chce danou
věc řešit na bázi Mám třídu, doplním anotace, udělám instanci a
vypublikuji, jediné řešení je KOMPLETNÍ oddělení classloaderů - nemusí
jít pouze o konkrétní třídu, ale může se změnit verze knihovny,...
Takže přímočaré řešení je rozstřílet do WARů, každé vlastní endpoint.
Prostě EJB jak vyšité.

verzí ze světa WS je hafo zkusím je letmo načrtnout. Nejdřív je nutné
si zodpovědět PROČ vlastně řešímě novou verzi plus pár dalších otázek
a
1) mění se jenom pajšl a to drobně - pak není nutné dávat světu vědět,
že se něco změnilo - prostě jenom nahradíme starou implementaci tou
novou
2) měníme výrazně vlastní chování - mění se chování při stejných
datech, nebo je změna pouze pro nová? Aneb stačí zpětná kompatibilita
či nikolivěk?
3) měníme datové schema - mění se výrazně schéma a mohlo by tedy
znemožnit starším klientům v používání nové verze, nebo se jedná jen o
rozšíření a opět stačí pouze zpětná kompatibilita?
4) Budou novou verzi využívat pouze nové verze klientů, nebo i ti stávající?

Teď něco o teorii, konkrétně o pojmu Kontrakt - klíčový termín pro verzování.
Na něm totiž závisí řešení (jeho qalita). Pod kontraktem rozumíme:
A) způsob, jakým klient zjišťuje cíl zprávy, kterou chce odeslat a na
kterou očekává odpověď - možností je několik - natvrdo URL endpointu,
přístup přes registry (typicku UDDI), broker, cíl je v obsahu zprávy
(třeba WS-Addressing)
B) těsnost vazby na data - jedná spíše o JAX-RCP, DocLit, nebo RESTový
message bus?
C) sémantická závislost - vyžaduje klient naprosto přesné chování
WebServisy či nikolivěk?

a teď k těm řešením, nebo vlastně doporučením:
b) maximálně zastřít verzi před klientem. Tedy navrhnout celou
architekturu tak, aby klienti i WebServisy byly co nejvíce autonomní a
nevyžadovali přesné chování druhých stran; co nejvíce rozhodovací
logiky přenést na příjemce zprávy;  napsat každou servisu tak, aby si
dokázala poradit se změnami schématu a rozšířením logiky
To znamená stabilní endpointy ve stabilních volných kontraktech.

c) dalším zastíracím manévrem je před různé verze implementací
předřadit brokera - tedy WebServisu, která akceptuje různé formáty dat
v různých požadavcích a sama se rozhoduje, kdo bude zavolán. Díky
tomu, že logika správy různých verzí by se měla řešit
samoregistrováním se WebServis, nikoli zakódovávat do zdrojáku, je
vhodné tento broker implementovat jako Registry nebo se k ní
připojovat. Vhodným kandidátem k použití se jeví UDDI nebo něco
trošičku více sofistikovaného (jako například HP SOA Center
https://h10078.www1.hp.com/cda/hpms/display/main/hpms_content.jsp?zn=bto&cp=1-11-130-27_4000_100__
 [ano, přihřívám si vlastní polívčičku, já vím, ale když na tomto
produktu jsem se podílel nejen vývojářsky, ale i "malinko"
architektonicky... :-)] )

d) když už je třeba verzovat i směrem ke klientům, tak bych se držel
starého osvědčeného BuzzWordu "Provisioning". Poskytnout klientům
možnost říct si, co chtějí. Velmi se mi líbí, jak tento problém
vyřešili ve specce UDDI - jedno jediné WSDL, které includuje
namespacem oddělené verze. Ve spojení s registry je to správné
použití. Když už tedy zveřejňujeme verze ven, umožněme klientovi, aby
si mohl vybrat. Je tedy třeba onu informaci o verzi nějak dohledatelně
vypublikovat. A to buď ve formě metadat držených v nějaké registry,
nebo ve formě množiny WSRF endpointů, kde si každý endpoint ve svých
atributech verzi propaguje. Udržovat znalost o verzích na úrovni
znalosti endpointů není verzování, ale pasqil.

e) z déčka přímo vyplývá způsob verzování datové struktury - namespace

f) je také si potřeba uvědomit, zda nová verze už není jinou servisou
se společnou implementační částí. Dost často to tak totiž je. Ano,
toto velmi zavání problémy s udržováním obrovského množství WebServis.
Jenomže když je špatně navržený kontrakt, dost často ani jiná možnost
není - jednou jsem viděl košatý acyklický graf "verzí" téže
WebServisy. Různé větvení a spojování verzí bylo pímo k zblití. A
přitom to šlo jednoduše rozdělit do několika málo různých WebServis,
které pod sebou využívaly opět několik málo sdílených ...

Fuj, to jsem se rozkecal, už raději skončím a zkusím to, až bude čas,
sesumírovat si a někde to shrnout.

Oto 'tapik' Buchta

2009/11/10 Michal Lašák <mla...@gmail.com>:
> Zdravím konferenciu!
>
>
>
> Píšem diplomovú prácu, ktorej téma je zhodná s názvom predmetu tejto správy,
> teda "Verzovanie webových služieb".
>
> Pravdupovediac, mám s daným "problémom" minimum praktických skúseností.
> Práve preto by som chcel poprosiť vás, odborníkov, o zopár cenných
> informácií.
>
>
>
> K riešeniu tejto problematiky ma viedla situácia vo firme, v ktorej
> pracujem. Budujeme webové služby, ktoré majú za cieľ sprostredkovať
> komunikáciu medzi informačným systémom (IS) a eshopmi. Platforma, na ktorej
> WS budujeme, je Java a ako aplikačný server nám slúži JBoss.
>
>
>
> Teraz k samotnému problému.
>
> Pri výmene verzie IS sa často mení DB štruktúra, preto musíme na dané zmeny
> reagovať upravením zdrojového kódu webovej služby (úprava SQL dotazov,
> prepared statementov...). Ďalší typ zmien je úprava stávajúcich algoritmov
> vo WS, prípadne nová funkcionalita. V jednom momente existuje viacero
> klientov s rôznymi verziami IS. Webová služba momentálne beží na aplikačnom
> serveri len ako 1 WAR inštancia (väčšina klientov totižto hosťuje priamo vo
> firme) a WS pracuje vlastne ako centrálny článok pre všetky eshopy (líšia sa
> len data sourcom, na ktorý sa WS pripája).
>
> Preto som chcel nájsť čo najlepší spôsob, ako začať WS verzovať, aby som čo
> najjednoduchšie vedel udržovať jej zdrojový kód (ideálny stav by bola stále
> jedna a jediná inštancia WS bežiaca v aplikačnom serveri - čo som zistil, že
> bude NEMOŽNÉ) a aplikácie by bežali bez problémov u každého z klientov
> (resp. s minimom zmien nutných na strane zákazníka).
>
>
>
> Začal som teda bližšie pátrať na internete. Dosť ma prekvapil fakt, že
> žiadne oficiálne stanovisko k verzovaniu WS neexistuje, našiel som len
> best-practices. Dospel som zatiaľ k nasledovným bodom:
>
>
>
> Čo všetko bude treba verzovať
>
> 1.            zdrojový kód - používame SVN, takže jednotlivé verzie by sa
> riešili formou vetiev.
>
> 2.            WSDL
>
> 3.            XSD
>
>
>
> Deployment z hľadiska zdrojákov a riešenie problémov s class loadingom
>
> 1.            Každá verzia do zvláštneho EAR súboru
>
> 2.            Jeden EAR s viacerými WAR súbormi (1 WAR = 1 verzia) - každá
> verzia by musela mať vlastný class loader
>
> 3.            Premenovanie packagov v Jave pri vzniku novej verzie (de-facto
> nová služba s novými triedami) - automaticky zavrhujem
>
> 4.            Použitie špecializovaných riešení, napr. OSGI - obtiažnosť?
> oplatí sa? -- mám s tým nulové skúsenosti
>
>
>
> Kedy sa budú vytvárať nové verzie => pri každej zmene, ktorá môže mať dopad
> na konzumenta služby
>
> =>          "major changes" = odstránenie operácie, premenovanie operácie,
> zmena parametrov operácie (dátový typ, poradie), zmena komplexného dátového
> typu v XSD
>
> =>          pozor na implementačné zmeny, ktoré "zvonka nevidíme": validácie
> vstupu/výstupu, security credentials, porušenie SLA (napr. náročnejším
> algoritmom sa zväčší doba vykonania)
>
>
>
> Nasadzovanie WS + volanie služieb zo strany konzumenta
>
> -              nasadzovať všetko na jeden endpoint alebo použiť pravidlo
> nová verzia = nový endpoint
>
> -              priamy prístup k endpointom alebo použitie routera, ktorý
> bude smerovať požiadavky podľa identifikátora (IP, parameter verzie v
> URL...)
>
> -              použitie UDDI registra Apache jUDDI
>
>
>
> Zaujímalo by ma, či máte skúsenosti s niektorými zo spomínaných bodov. Budem
> veľmi vďačný za akékoľvek informácie, s ktorými sa podelíte.
>
> Ďakujem za ochotu.
>
>
>
> S pozdravom
>
> --ml
>
> Michal Lašák
>
> __________ Informacia od ESET Smart Security, verzia databazy 4592
> (20091110) __________
>
> Tuto spravu preveril ESET Smart Security.
>
> http://www.eset.sk
>

Odpovedet emailem