DIZAJN SOA Informacioni sistemi 2 dr Miloš CVETANOVIĆ dr Miloš CVETANOVIĆ dr Vladimir BLAGOJEVIĆ
1. Kako definisati API servisa, koji su uobičajni API stilovi i kada treba određeni stil biti1. Kako definisati API servisa, koji su uobičajni API stilovi i kada treba određeni stil bitiupotrebljen?
2. Kako klijenti i servisi mogu da komuniciraju, i koje su osnove za kreiranje kompleksnih konverzacija u kojima veći broj strana razmenjuje podatke u toku dužeg perioda vremena?
3. Koje opcije postoje kada je reč o implementaciji servisne logike i kada određeni pristup treba da bude korišćen?
4. Kako klijent može da postane slabije vezan za sistem koji se koristi na strani servisa?j p j j
5. Kako informacije o servisu mogu biti otkrivene?
6. Kako generičke funkcije poput autentikacije, validacije, keširanja i logovanja mogu biti podržane na klijentskoj i servisnoj strani?klijentskoj i servisnoj strani?
7. Koje promene na strani servisa dovode do prestanka rada klijenata?
8. Koji si uobičajni načini za verzionisanje servisa?
9. Kako servisi treba da budu dizajnirani kako bi podržali kontinuirani razvoj poslovne logike bez potrebe da i klijenti budu stalno nadograđivani?
API Stil servisaKako klijent može da poziva udaljene procedure preko HTTP?
Naziv procedurese koristi
za selekciju...
Poruka zahteva sadrži ...
Naziv procedureŠalje zahtev
I
Asinhronost moguća interekacijom po principu zahtev/obaveštenje (Request/Acknowledge)
j
Servis
Argumente procedure
Klijent
Blokiranje klijenta se može izbeći asinhronom obradom odgovora(Asynchronous Response Handler)
Rezultati procedureVraćanjerezultata
Poruka odgovora sadrži ...
Stil inspirisan RPC (Remote Procedure Call)Interakcija po principu zahtev/odgovor (Request/Response) → klijent se blokiraUpotreba servis deskriptora (Service Descriptors) npr. WSDL
API nalik klasičnim potpisima metoda → osetljiv na promeneUporeba proksija (Proxies) → lokacijska transparentnostDelimični otkazi sistema? npr. otkaz mrežePromene propagiraju od potpisa, prekog deskriptora do proksija
Klijent Proksi
Poruka
Servis deskriptor
Udaljena procedura (servis)
Primer 16Primer 16. Posmatra se servis za proveru dostupnosti avio leta. Servis je zasnovan na JAX‐WS uz upotrebu Document‐Literal‐Wrapped SOAP.
Definicija porta koristeći WSDL 1.1 (Web Service Description Language)
<wsdl:portType name=“AvioPonudaServisPort"><wsdl:portType name= AvioPonudaServisPort ><wsdl:operation name=“DohvatiRasporedLetova">
<wsdl:input message="DohvatiRasporedLetova"/><wsdl:output message="DohvatiRasporedLetovaOdgovor"/>
/</wsdl:operation></wsdl:portType>
...
<wsdl:message name=“DohvatiRasporedLetova"><wsdl:part name="parameters"
element="tns:DohvatiRasporedLetova"/>p /</wsdl:message><wsdl:message name=“DohvatiRasporedLetovaOdgovor">
<wsdl:part name="parameters"element "tns DohvatiRasporedLetovaOdgovor"/>element="tns:DohvatiRasporedLetovaOdgovor"/>
</wsdl:message>
Definicija poruka u odgovarajućem XSD (XML Schema Document)
<xs:element name=“DohvatiRasporedLetova"> <!‐‐ Naziv procedure ‐‐><xs:element name= DohvatiRasporedLetova > <! Naziv procedure ><xs:complexType>
<xs:sequence><xs:element name=“polazakDetalji" <!‐‐ Prvi argument ‐‐>
/type=“DetaljiPutovanja"/><xs:element name=“povratakDetalji" <!‐‐ Drugi argument ‐‐>
type=" DetaljiPutovanja"/></xs:sequence>/xs:sequence
</xs:complexType></xs:element>...
<xs:element name=“DohvatiRasporedLetovaOdgovor"><xs:complexType>
<xs:sequence><xs:sequence><xs:element name=“DohvatiRasporedLetovaRezultat"
type=“OpcijePutovanja" <!‐‐ Ovo je tip odgovora ‐‐> minOccurs="0" nillable="true" />
/</xs:sequence></xs:complexType>
</xs:element>
Definicija Java SEI (Service Endpoint Interface)
@WebService(name=" AvioPonudaServisPort"@WebService(name= AvioPonudaServisPort ,targetNamespace="http://www.primer.rs/schemas",wsdlLocation="WEB‐INF/wsdl/AvioPonudaServis.wsdl")
public interface AvioPonudaServisPort{@WebMethod@WebResult(name=“OpcijePutovanja",
targetNamespace="http://www.primer.rs")@RequestWrapper(localName=“DohvatiRasporedLetova",@RequestWrapper(localName DohvatiRasporedLetova ,
targetNamespace=" http://www.primer.rs/Schemas",className=“rs.primer.DohvatiRasporedLetova")
@ResponseWrapper(localName=“DohvatiRasporedLetovaOdgovor",t tN "htt // i /S h "targetNamespace="http://www.primer.rs/Schemas",className=“rs.primer.DohvatiRasporedLetovaOdgovor")
public OpcijePutovanja DohvatiRasporedLetova(p p j j p (@WebParam(name=“polazakDetalji" //prvi argument
targetNamespace="http://www.primer.rs/Schemas")DetaljiPutovanja polazakDetalji,
@WebParam(name=“povratakDetalji" //drugi argument@WebParam(name= povratakDetalji //drugi argumenttargetNamespace="http://www.primer.rs/Schemas")DetaljiPutovanja povratakDetalji); }
Implementacija Java SEI
@WebService(@WebService(targetNamespace="http://www.primer.rs/Schemas",endpointInterface=“rs.primer.AvioPonudaServisPort")
public class BargainAirService implements AvioPonudaServisPort{@ResourceWebServiceContext wscontext;
public OpcijePutovanja DohvatiRasporedLetova(DetaljiPutovanja polazakDetalji,DetaljiPutovanja povratakDetalji)
{{// implementacija
}}}
API Stil servisaKako klijent može da šalje komande, obaveštenja i druge informacijeKako klijent može da šalje komande, obaveštenja i druge informacije
udaljenom sistemu preko HTTP uz izbegavanje vezivanja za udaljene procedure?
Sadržaj poruke k i ti
Identifikator teme, zadatka ili događajaŠ lj
Poruka zahteva sadrži ...
Klijent
se koristiza selekciju...
Servis
g j
Strukturiranisadržaj poruke
Šalje zahtev I
Procedura
Procedura
Standardizovani ili specifičan sadržaj
Vraćanjerezultata
Poruka odgovora sadrži ...Procedura
Stil inspirisan razmenom poruka (tzv. dokumenata)Servis ima ulogu dispečera koji svoju ulogu obavlja na osnovu sadržaja porukeInterakcija po principu zahtev/odgovor (Request/Response) ali i zahtev/obaveštenje (Request/Acknowledge)Upotreba standardizovanih poruka npr. SOAP/XSD , ili POX (Plain Old XML)
Kao kod stila inspirisanog RPC:→ automatsko generisanje koda (upotreba servis deskriptora) npr. WSDL→ binarno enkodiranje poruka→ asinhronost interakcije Za razliku od stila inspirisanog RPC:→ izbegavanje blokiranja klijenta → zahtev se sastoji samo od jedne poruke
→ delegacija posla uz pozivanje komandi (Command Invoker)→ podrška za komplikovane radne tokove (Workflow Connector)→ kasno vezivanje (Late binding) postupkom nadovezivanja (Service Connector)
API Stil servisaKako klijent može da manipuliše podacima kojima upravlja udaljeni sistemKako klijent može da manipuliše podacima kojima upravlja udaljeni sistem
uz izbegavanje vezivanja za udaljene procedure i uz minimalno poznavanje domena?
Standardizovana metoda servera (GET, PUT, POST ...)
Poruka se sastoji od ...
HTTP protokol za CRUD (Create/Retrieve/Update/Detele):GET – dohvatanjePUT dodavanje ili menjanje
Klijent
URI
Servis
Koriste seza odabir ...
Šalje zahtev
I
OPCIONO IStandardizovani
ili specifičan tip medijaPUT – dodavanje ili menjanjeDELETE – brisanjePOST – specifične namene, tunelovanje PUT i DELETE
OPTIONS – provera podržanih HTTP metoda na ciljnoj URIHEAD – dohvatanja meta‐podataka o resursu bez dohvatanja resursa
Standardizovani ili specifičan tip medija Vraćanje
rezultata
Odgovor može da sadrži ...
I, ILIStandardizovani
Stil inspirisan upotrebom resursa uz upotrebu HTTP kao aplikativnog protokolaStilovi inprisani PRC i porukama koriste HTTP kao transaportni protokolResursi: tekst, video materijal, red u relacionoj tabeli, kolekcija podataka, procedura, izvršni program itd.
j p jkod statusa
Kao kod stilova inspirisanih RPC i porukama:→ asinhronost interakcije→ izbegavanje blokiranja klijenta→ kasno vezivanje (Late binding) postupkom nadovezivanja (Service Connector)→ kasno vezivanje (Late binding) postupkom nadovezivanja (Service Connector)
Za razliku od stilova inspirisanih RPC i porukama:→ nemogućnost automatskg generisanje koda (nema servis deskriptora)→ adresibilnost resursa (izloženost napadima i kontrola pristupa?)→ fl k ibil t d bi klij t ( č bil i đ j bil k ji đ j b )→ fleksibilnost u odabiru klijenta (npr. računar, mobilni uređaj, bilo koji uređaj sa brauzerom)→ prilagodljivost prikaza željama klijenta (npr. jedan resurs – više pristupnih tačaka)→ mogućnost upotrebe rasprostranjenih tehnika keširanja
S iPosrednikKlijent
Klijentski Serverski k š
ServisPosrednik(npr. reverzni proksi)
Posredničkik š
Prednost standardizovanosti protokola:→ standardizovani povi resursa npr. MIME (Multipurpose Internet Mail Extensions)
/ / /
keš keškeš
→ definicija kodova statusa ( www.w3.org/Protocols/rfc2616/rfc2616‐sec10.html )npr. 200‐uspešan zahtev, 301‐resurs uklonjen, 400‐loš format zahteva
Primer 17. Uslovno dohvatanje resursa:GET /proizvodi/cenovnik HTTP/1 1GET /proizvodi/cenovnik HTTP/1.1Host: primeri.rsIf‐Modified‐Since: Fri, 27 Sep 2013 18:00:00 GMTPrimer 18. Uslovna promena resursa:
REST (Representa onal State Transfer) → RESTful:Klijent/Server (Client/Server)Bez čuvanja konteksta (Stateless)Keširanje odgovora (Cacheable resposnes)Uniforman interfejs (Uniform interface)
( )p
PUT /proizvodi/cenovnik/123 HTTP/1.1Host: primeri.rsIf‐Unmodified‐Since: Fri, 27 Sep 2013 18:00:00 GMT
Slojevit sistem (Layer System)Kod na zahtev (Code on demand)
Primer 19Primer 19. Posmatra se servis za dohvatanje liste proizvoda. Servis je implementiran u vodu servis kontrolera koji na osnovu tipa traženog proizvoda i početnog slova proizvoda , dobijenih u zahtevu, poziva odgovarajuću metodu za pretragu, a klijentu vraća rezultat koji je pozvana metoda vratila. Pretpostaviti da metoda za pretragu vraća rezultat u vidu objekta za transfer podataka (DTO – Data Transfer Object) pod nazivom Proizvodi, a da servis treba da vraća klijentu rezultat u JSON formatu. Servis je zasnovan na JAX‐RS.Servis je zasnovan na JAX RS.
Implementacija REST servisa u Javi
@Path("/tip")@Path( /tip )public class TipProizvodaKontroler {
private String NEXT_URI ="http://www.primeri.rs/ServisPretrage/proizvodi";
@GET@Path("/{nazivTipa}/{pocetnoSlovoProizvoda}")@ProduceMime("application/json")@ProduceMime( application/json )
public JAXBElement<Proizvodi> DohvatiProizvodeUnutarTipa (
@P thP (“ i Ti ") St i i Ti@PathParam(“nazivTipa") String nazivTipa,@PathParam(“pocetnoSlovoProizvoda") String pocinjeSa){
PretrazivacProizvoda pretrazivac = new PretrazivacProizvoda(NEXT_URI);p ( _ )
Proizvodi proizvodi = pretrazivac.dohvatiProizvode (nazivTipa, pocinjeSa);return new JAXBElement<Proizvodi>(new QName(“Proizvodi"),
Proizvodi class proizvodi);Proizvodi.class, proizvodi);}
Primer upotrebe REST servisa
Klijent šalje zahtev:Klijent šalje zahtev:
GET ServisPretrage/proizvodi/tip/tv/sa HTTP/1.1Host: primeri.rs
Klijent dobija odgovor:
{"@pocetnoSlovoProizvoda":“sa","@nazivTipa":“tv",{ @pocetnoSlovoProizvoda : sa , @nazivTipa : tv ,“Proizvod":[{“Naziv":“Samsung","URI" "htt // i i /S i P t / i di/S "}"URI":"http://www.primeri.rs/ServisPretrage/proizvodi/Samsung"},{"Name":“Sanyo","URI":" http://www.primeri.rs/ServisPretrage/proizvodi/Sanyo "}]}]}