http , rmi , soap a ďalšie akronymy pre výmenu dát medzi počítačmi
DESCRIPTION
HTTP , RMI , SOAP a ďalšie akronymy pre výmenu dát medzi počítačmi. Róbert Novotný [email protected]. Prečo? Začo? Načo?. výmena dát je takpovediac štandardom medzi ľuďmi medzi človekom a počítačom medzi počítačom a počítačom ak dáta neprúdia, niečo je zle - PowerPoint PPT PresentationTRANSCRIPT
HTTP, RMI, SOAP… 1BEZADIS, 12. 2. 2008
HTTP, RMI, SOAP a ďalšie akronymy pre výmenu dát medzi
počítačmiRóbert Novotný[email protected]
ingHT
es
apNET
PC
HTTP, RMI, SOAP… 2BEZADIS, 12. 2. 2008
Prečo? Začo? Načo?
• výmena dát je takpovediac štandardom– medzi ľuďmi– medzi človekom a počítačom– medzi počítačom a počítačom
• ak dáta neprúdia, niečo je zle• klasický príklad: výmena dát medzi
prehliadačom– protokol: HTTP– dáta: HTML, čistý text, binárny neporiadok
• človek dátam rozumie, čo však počítač?
Ako ustanoviť protokoly pre jednoduchú výmenu štruktúrovaných dát medzi dvoma počítačmi?
HTTP, RMI, SOAP… 3BEZADIS, 12. 2. 2008
Filozofia
• už od nepamäti (197x): filozofia vzdialeného volania procedúr (remote procedure call, RPC)
• viacero špecifikácií: RPC, CORBA, DCOM, SOAP...
• cieľ:– jednoduché nastavenie– jazykovo a platformovo nezávislé– zamlženie "lokálne volanie-vzdialené
volanie"– podpora prirodzených dátových typov
HTTP, RMI, SOAP… 4BEZADIS, 12. 2. 2008
Prihlasovanie sa na skúšky
• jednoduchý príklad prihlasovania sa na skúšku
• dohodnime sa na operáciách– zoznam termínov pre daný predmet– prihlásenie sa na daný predmet na daný dátum
• operácie budú reprezentované interfejsom
public interface ExamRegistration { List<Term> getTerms(String courseCode);
boolean signup(Student student, String courseCode, Date date);}
HTTP, RMI, SOAP… 5BEZADIS, 12. 2. 2008
Prečo interfejs?
• môžeme vyrobiť viacero implementácií– jednoduchú s napevno danými termínmi– databázovú– integrujúcu sa s AISom– používajúcu vzdialené volania
• implementácie môžeme vymieňať a aplikácia bude vyžadovať minimum zmien
public class SimpleExamRegistration implements ExamRegistration { ...}
HTTP, RMI, SOAP… 6BEZADIS, 12. 2. 2008
RMI – vzdialené volanie metód
• RMI – remote method invocationhttp://java.sun.com/javase/technologies/core/basic/rmi/index.jsp
• transportná vrstva: TCP• serializácia: binárna, prebratá z Javy• interop: len Java vs. Java
HTTP, RMI, SOAP… 7BEZADIS, 12. 2. 2008
RMI – základné pojmy
• vzdialený objekt: metódy sú volané klientom. Reprezentovaný service classom.
• registry: register objektov, ktoré dokážu obsluhovať vzdialené volania od klientov
• server: vykonáva registráciu vzdialených objektov• skeleton: špinavá práca na strane servera –
sieťová komunikácia, (de)serializácia objektov• stub: špinavá
práca na strane klienta
ServerKlient
Stub Skeleton
Registry Server
Klientskátrieda
Obslužnátrieda
HTTP, RMI, SOAP… 8BEZADIS, 12. 2. 2008
RMI – ako vyzerá komunikácia?
• ako vyzerá typická správa?• binárny neporiadok posielaný cez TCP• objekty sú serializované pomocou Java
Serialization• špecifikácia binárneho formátu:
http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html
HTTP, RMI, SOAP… 9BEZADIS, 12. 2. 2008
Postup krokov v klasickom RMI
Server:• vytvoriť vzdialený interface s
metódami (extends Remote, metódy throws RemoteException)
• vytvoriť implementačnú triedu• zaregistrovať triedu v RegistryKlient:• získať objekt Registry z daného servera• získať interfejs (za ním je stub)• na ňom volať metódy
HTTP, RMI, SOAP… 10BEZADIS, 12. 2. 2008
Ukážka kódu
public interface ExamRegistration extends java.rmi.Remote{ List<Term> getTerms(String courseCode) throws java.rmi.RemoteException;
boolean signup(Student student, String courseCode, Date date) throws java.rmi.RemoteException;}
• Hádzanie výnimiek musíme dodať aj do implementácie (teda do SimpleExamRegistration)
• všetky triedy používané vo volaniach musia implementovať interfejs java.io.Serializable!
– public class Student implements Serializable– public class Term implements Serializable
HTTP, RMI, SOAP… 11BEZADIS, 12. 2. 2008
Ukážka kódu servera
ExamService service = new SimpleExamService();
1. Vytvoríme inštanciu implementácie
ExamService skeleton = (ExamService) UnicastRemoteObject.exportObject(service, 0);
Registry registry = LocateRegistry.getRegistry();
2. Pretvoríme ju na skeleton, teda vzdialený objekt
registry.rebind("EXAM", skeleton);
3. Získame inštanciu registry
4. Zaregistrujeme skeleton v registry
HTTP, RMI, SOAP… 12BEZADIS, 12. 2. 2008
Ukážka kódu klienta
Registry registry = LocateRegistry.getRegistry("localhost");
1. získať objekt registry z daného servera
ExamService stub = (ExamService) registry.lookup("EXAM");
stub.getTerms("UINF/PAZ1c");
2. získať interfejs (za ním je stub)
ExamService stub = java.rmi.Naming.lookup("//localhost/EXAM")stub.getTerms("UINF/PAZ1C");
3. voláme metódy klasickým spôsobom
Alternatívne môžeme použiť aj:
HTTP, RMI, SOAP… 13BEZADIS, 12. 2. 2008
Výhody a nevýhody
+ jednoduché použitie, priamo v Jave, žiadne závislosti
+ v prípade, že sa u klienta nenachádzajú binárky tried, je možné ich dotiahnuť zo servera- pomerne náročná konfigurácia
- firewally blokujú komunikáciu+ možno tunelovať cez HTTP- náročná konfiguráciaAk nepotrebujeme interop a vieme, že firewally
nie sú problémom, je RMI najjednoduchšou cestou.
HTTP, RMI, SOAP… 14BEZADIS, 12. 2. 2008
Caucho Hessian / Burlap
• Hessianhttp://hessian.caucho.com/
• Burlaphttp://www.caucho.com/resin-3.0/protocols/burlap.xtp
• transportná vrstva: HTTP• serializácia:
– binárna (Hessian)– XML (Burlap)
• interop: – Hessian: implementácie v C++, C#, Python, PHP– Burlap: len Java-Java
HTTP, RMI, SOAP… 15BEZADIS, 12. 2. 2008
Hessian – základné pojmy
• HessianServlet (BurlapServlet): na strane servera spracováva HTTP požiadavky, (de)serializuje objekty a priamo volá implementačnú triedu.
• interfejs: zodpovedá interfejsu z príkladu. Hessian zaň na strane klienta i serveru dosadí implementáciu podporujúcu vzdialené volania
• proxy: na strane klienta rieši HTTP komunikáciu a (de)serializáciu objektov
Servletovýkontajner
Klient
proxy
<<interface>>
interfejs
HessianServlet
HTTP, RMI, SOAP… 16BEZADIS, 12. 2. 2008
Hessian / Burlap – ako vyzerá komunikácia?
• ako vyzerá typická správa?• Hessian: HTTP POST požiadavka, dáta v
binárnej forme• Burlap: HTTP POST požiadavka, dáta v XML
POST / HTTP/1.1Content-Type: text/xmlUser-Agent: Java/1.5.0_09Host: 127.0.0.1:8888Connection: keep-aliveContent-Length: 58
<burlap:call><method>getCurrentDate</method></burlap:call>
HTTP/1.1 200 OKContent-Length: 62Server: Jetty(6.1.5)
<burlap:reply><date>20080311T223714.671Z</date></burlap:reply>
HTTP, RMI, SOAP… 17BEZADIS, 12. 2. 2008
Postup krokov pri použití
Servletový kontajner:• vytvoriť inštanciu implementačnej triedy• nakonfigurovať HessianServlet
(BurlapServlet) a priradiť mu implementačný objekt
Klient:• vytvoriť továreň na proxy volajúcu
príslušnú URL adresu• získať z nej interfejs (za ním je stub)• na ňom volať metódy
HTTP, RMI, SOAP… 18BEZADIS, 12. 2. 2008
Ukážka kódu servera (Jetty)
ExamService service = new SimpleExamService();
1. Vytvoríme inštanciu implementácie
HessianServlet hessianServlet = new HessianServlet();hessianServlet.setHomeAPI(ExamService.class);hessianServlet.setHome(new SimpleExamService());
Server server = new Server(8080);
Context context = new Context(server, "/terms");context.addServlet(new ServletHolder(hessianServlet), "/*");
server.start();server.join();
2. Nakonfigurujeme HessianServlet, priradíme mu inštanciu
3. Nakonfigurujeme servletový kontajner a spustíme ho
Služba bude dostupná na http://localhost:8080/terms
HTTP, RMI, SOAP… 19BEZADIS, 12. 2. 2008
Alternatíva: nasadenie do servlet. kontajnera
• HessianServlet je klasický servlet, môžeme ho teda nasadiť do servletového kontajnera (Tomcat, Jetty...)
<servlet> <servlet-name>TermsServlet</servlet-name> <servlet-class> com.caucho.hessian.server.HessianServlet </servlet-class> <init-param> <param-name>home-class</param-name> <param-value>sk.novotnyr.SimpleExamService</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>sk.novotnyr.ExamService</param-value> </init-param></servlet>
<servlet-mapping> <url-pattern>/*</url-pattern> <servlet-name>TermsServlet</servlet-name></servlet-mapping>
Služba bude dostupná na http://localhost:8080/terms
web.xml
HTTP, RMI, SOAP… 20BEZADIS, 12. 2. 2008
Ukážka kódu klienta
HessianProxyFactory factory = new HessianProxyFactory();
1. vytvoriť továreň na proxy
String url = "http://localhost:8080/terms";TermService proxy
= (TermService) factory.create(TermService.class, url);
List<Term> terms = proxy.getTerms("UINF/PAZ1c");
2. získať interfejs pre danú URL adresu (za ním je proxy)
3. voláme metódy klasickým spôsobom
BurlapServlet a BurlapProxyFactory fungujú analogicky
HTTP, RMI, SOAP… 21BEZADIS, 12. 2. 2008
Výhody a nevýhody
+ jednoduché použitie, knižnica je 273 kB JAR, žiadne závislosti
+ ten je možné ešte zmenšiť (Hessian 83 kB)+ jestvuje aj minimalistická verzia aj pre J2ME
(mobily)+ slušný interop (len Hessian)+ čitateľné správy (len Burlap)- vlastný mechanizmus serializácie môže zlyhávať v
extrémnych prípadoch
Ak potrebujeme interop a RMI robí problémy, je to dobrá alternatíva.
Burlap = (Hessian + XML) - interop
HTTP, RMI, SOAP… 22BEZADIS, 12. 2. 2008
Spring HTTP Invoker
• Spring HTTP Invokerhttp://www.springframework.org/
• transportná vrstva: HTTP• serializácia: binárna, prebratá z Javy• interop: len Java-Java
HTTP, RMI, SOAP… 23BEZADIS, 12. 2. 2008
Spring HTTP Invoker – základné pojmy
• DispatcherServlet: servlet, cez ktorý idú všetky požiadavky v Spring Frameworku.
• HttpInvokerServiceExporter: vie zobrať ľubovoľnú triedu a interfejs a vytvoriť z neho vzdialene volateľný objekt. Obohatí ju o schopnosť (de)serializovať objekty
• proxy: na strane klienta rieši HTTP
komunikáciu a (de)serializáciu objektov
Servletovýkontajner
Klient
proxyKlientskátrieda
<<interface>>
interfejs
DispatcherServlet
Obslužnátrieda
HttpInvokerServiceExporter
HTTP, RMI, SOAP… 24BEZADIS, 12. 2. 2008
Spring HTTP Invoker – ako vyzerá komunikácia?
• ako vyzerá typická správa?
• HTTP POST požiadavka, za ňou dáta v binárnej forme
• objekty sú serializované pomocou Java Serialization
• posielané inštancie musia implementovať java.io.Serializable
HTTP, RMI, SOAP… 25BEZADIS, 12. 2. 2008
Postup krokov pri použití
Servletový kontajner:• nakonfigurovať DispatcherServlet• vytvoriť inštanciu implementačnej triedy• nakonfigurovať
HttpInvokerServiceExporter a asociovať s ním implementačnú triedu
Klient:• vytvoriť továreň na proxy volajúcu
príslušnú URL adresu• získať z nej interfejs (za ním je proxy)• na ňom volať metódy
HTTP, RMI, SOAP… 26BEZADIS, 12. 2. 2008
Ukážka kódu servera (Jetty)
DispatcherServlet dispatcher = new DispatcherServlet();dispatcher.setContextConfigLocation("classpath:ctx.xml");
1. Nakonfigurujeme DispatcherServlet
<bean name="/terms" class="org.springframework.[…].HttpInvokerServiceExporter"> <property name="service"> <bean class="sk.novotnyr.SimpleExamRegistration" /> </property> <property name="serviceInterface" value="sk.novotnyr.ExamRegistration" /></property></bean>
2. Nakonfigurujeme springovský aplikačný kontext
3. Nakonfigurujeme servletový kontajner a spustíme ho (viď príklad z konfigurácie Hessianu)
ctx.xml
HTTP, RMI, SOAP… 27BEZADIS, 12. 2. 2008
Ukážka kódu klienta
HttpInvokerProxyFactoryBean factory = new HttpInvokerProxyFactoryBean();
1. vytvoriť továreň na proxy
factory.setServiceInterface(ExamRegistration.class);factory.setServiceUrl("http://localhost:8080/");factory.afterPropertiesSet();
List<Term> terms = proxy.getTerms("UINF/PAZ1c");
2. nastaviť obslužný interfejs a URL (za ňou je proxy)
3. voláme metódy klasickým spôsobom
HTTP, RMI, SOAP… 28BEZADIS, 12. 2. 2008
Výhody a nevýhody Spring HTTP Invoker
+ ponecháva výhody RMI, odstraňuje jeho neduhy
+ možno exportnúť ľubovoľný interfejsv RMI sme museli dediť od Remote a hádzať výnimky
- žiadny interop- pomerne veľký JAR so závislosťami (1,7
MB), keďže používame Spring Framework
Ak používame Spring Framework, Spring HTTP Invoker je veľmi užitočným vylepšením RMI.
HTTP, RMI, SOAP… 29BEZADIS, 12. 2. 2008
SOAP / Web Services
• Web Services – webové službyhttp://www.w3.org/2002/ws/
• SOAP – protokol pre výmenu XML správ• transportná vrstva: HTTP, SMTP (maily),
JMS (Java Messaging), Jabber, JavaVM (v rámci virtuálneho stroja)
• serializácia: XML• interop: univerzálny
Posielame XML dáta z bodu A do bodu B.
HTTP, RMI, SOAP… 30BEZADIS, 12. 2. 2008
Web Services – základné pojmy
Endpoint
Service
PortgetCourses()
signup()
KlientSOAP správa
Popis služby(WSDL)
HTTP, RMI, SOAP… 31BEZADIS, 12. 2. 2008
Web Services – základné pojmy
• endpoint: spracováva SOAP správy a odpovedá na ne, rieši (de)serializáciu
• operácia: vzdialene volateľná metóda
• port: logická množina operácii. Analógia interfejsu z OOP
• služba: logická množina portov
• binding: určuje formát správ a používaný transport
• popis služby: metadáta o službe – zoznam služieb, portov, operácií, dátové typy, návratové hodnoty, špecifikácia transportného protokolu.
Popis služieb pomocou XML jazyka WSDL.
HTTP, RMI, SOAP… 32BEZADIS, 12. 2. 2008
SOAP – ako vyzerá komunikácia?
[HTTP POST hlavička][XML hlavička]<SOAP-ENV:Envelope> <SOAP-ENV:Body> <ns1:doubleAnInteger <param1 xsi:type="xsd:int">123</param1> </ns1:doubleAnInteger> </SOAP-ENV:Body></SOAP-ENV:Envelope>
[hlavička HTTP odpovede][XML hlavička]<SOAP-ENV:Envelope <SOAP-ENV:Body> <ns1:doubleAnIntegerResponse <return xsi:type="xsd:int">246</return> </ns1:doubleAnIntegerResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Otázka i odpoveď vyzerajú na prvý pohľad ešte horšie, toto
je zjednodušená verzia...
HTTP, RMI, SOAP… 33BEZADIS, 12. 2. 2008
SOAP a implementácie v Jave
• SOAP je všeobecný, jestvuje viacero Java implementácií
– Apache Axis 2 http://ws.apache.org/axis2/
– Apache CXF (zlúčenie CodeHaus XFire + ObjectWeb Celtix) http://incubator.apache.org/cxf
– každý aplikačný server poskytuje svoju implementáciu (JBoss, IBM WebSphere)
• v Jave existuje štandardizovaná sada interfejsov a tried: JAX-WS (http://java.sun.com/webservices/technologies)
• pre jednoduchosť ukážeme: CXF nad HTTP transportom
HTTP, RMI, SOAP… 34BEZADIS, 12. 2. 2008
Postup krokov v SOAP – zdola nahor
Server:• začneme od metadát – vytvoríme WSDL• vygenerujeme triedy pre serverovskú
časť• dodáme implementáciu• zverejníme WSDL a adresu koncového
bodu
Klient:• získame WSDL• vygenerujeme klientské triedy
Výhodné, ak máme v úmysle interop
HTTP, RMI, SOAP… 35BEZADIS, 12. 2. 2008
Postup krokov v SOAP – zhora nadol
Server:• vezmeme interfejs a oanotujeme ho• zverejníme ho (metadáta sa
vytvoria automaticky)Klient:• získame WSDL• vygenerujeme klientské triedy• alebo vezmeme továreň, ktorá vráti
proxy
Výhodné, ak chceme rýchlo niečo spustiť.
HTTP, RMI, SOAP… 36BEZADIS, 12. 2. 2008
Postup krokov v SOAP – zhora nadol s JAX-WS
Server:• vezmeme interfejs a oanotujeme ho
@WebServicepublic interface ExamRegistration { List<Term> getTerms(String courseCode);
boolean signup(Student student, String courseCode, Date date);}
• zverejníme ho (metadáta sa vytvoria automaticky)
import javax.xml.ws.Endpoint;
Endpoint.publish("http://localhost:8080/terms", new SimpleExamRegistration());
HTTP, RMI, SOAP… 37BEZADIS, 12. 2. 2008
Postup krokov v SOAP – zhora nadol s JAX-WS
• automaticky sa vytvorí endpoint na danej adrese• vytvorí sa:
– služba ExamRegistrationService– port ExamRegistration– operácie getTerms() a signup()– automatické mapovanie tried Student a Term na
XML reprezentácie a späť– binding pre HTTP protokol
• spustí sa HTTP server• metadáta sa zverejnia na
http://localhost:8080/terms?wsdl
Endpoint.publish("http://localhost:8080/terms", new SimpleExamRegistration());
HTTP, RMI, SOAP… 38BEZADIS, 12. 2. 2008
Ukážka kódu pre klienta s JAX-WS1. získame adresu WSDL metadát2. spustíme generovanie tried pre klienta
2. vygeneruje sa množstvo tried do balíčka sk.novotnyr
ExamRegistrationService service = new ExamRegistrationService()ExamService proxy = service.getPort(ExamService.class);
wsdl2java.bat -d d:\bezadis\src -p sk.novotnyr.client http://localhost:8080/terms?wsdl
3. vytvoríme inštanciu služby a z nej získame inštanciu proxy
4. na proxy voláme metódy
ExamRegistrationService, GetTerms, GetTermsResponse,...
ExamRegistrationService sa vytvorí nad adresou prebratou zo servera a nad príslušným
WSDL
HTTP, RMI, SOAP… 39BEZADIS, 12. 2. 2008
Výhody a nevýhody SOAP
+ buzzword
+ maximálna flexibilita
+ možno zvoliť ľubovoľný transport
+ neobmedzený interop
+ bezpečnosť - podpisovanie správ, šifrovanie, timestamping, garantované doručenie...
- často zložitá konfigurácia
- nutnosť uvážiť výkon (konverzia na XML reprezentáciu je náročná)
- pre samostatnú serverovskú aplikáciu treba často kopu JARov (CXF: 17MB!)
+ od Javy 6 je k dispozícii priama podpora pre SOAP
Ak vieme, že interop je prioritou, nemáme inú možnosť.
Všeobecnosť a komplexnosť = širšie a komplexnejšie problémy
HTTP, RMI, SOAP… 40BEZADIS, 12. 2. 2008
Sumár
ProtokolTranspor
tSerializáci
aInterop
Bezpečnosť
RMI TCPbinárna
Javanie nie
Spring HTTP Invoker
HTTPbinárna
Java nie nie
Hessian HTTPbinárna vlastná
významné platformy
nie
Burlap HTTPXML
vlastnánie nie
SOAPmnohorak
ý
XMLľubovoľná áno
podpisovanie, šifrovanie, timestampy
HTTP, RMI, SOAP… 41BEZADIS, 12. 2. 2008
Otázky?