Projektowanie i Konstrukcja Systemów Rozproszonych. ServiceStack

Podobne dokumenty
Programowanie Komponentowe WebAPI

Aplikacje webowe z wykorzystaniem Node.js oraz Express

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Kurs ASP.NET ASP.NET CORE APLIKACJE WEBOWE

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

JAX-RS czyli REST w Javie. Adam Kędziora

Program szkolenia: REST i Microservices w PHP

Architektury Usług Internetowych. Laboratorium 2 RESTful Web Services

Specyfikacja interfejsów usług Jednolitego Pliku Kontrolnego

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

MeetingHelper. Aplikacja Android ułatwiająca przekazywanie materiałów pomiędzy uczestnikami spotkania. Instrukcja obsługi dla programisty

Dostęp do komponentów EJB przez usługi Web Services

Wywoływanie metod zdalnych

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

Technologie internetowe ASP.NET Core. Paweł Rajba

Tworzenie i wykorzystanie usług sieciowych

Programowanie w Internecie

Gatesms.eu Mobilne Rozwiązania dla biznesu

Programowanie i projektowanie obiektowe

Spis treści. Wprowadzenie 13

Wstęp. Ale po co? Implementacja

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Aplikacje RMI

1 Wprowadzenie do J2EE

JAVA NA SERWERZE SPRING. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Programowanie poprzez testy z wykorzystaniem JUnit

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

1. CZYM JEST SERIALIZACJA

Wywoływanie metod zdalnych

METODY PROGRAMOWANIA

Programowanie w Internecie

Aplikacje RMI Lab4

Tajniki ASP.NET Core 2.0 : wzorzec MVC, konfiguracja, routing, wdrażanie i jeszcze więcej / Ricardo Peres. Warszawa, 2018.

Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Programowanie Systemów Rozproszonych - WCF REST

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

SOAP. Autor: Piotr Sobczak

Program szkolenia: Symfony, nowoczesny framework PHP

Wzorce logiki dziedziny

Klasy cd. Struktury Interfejsy Wyjątki

Podejście obiektowe do budowy systemów rozproszonych

Programowanie zorientowane obiektowo. Mateusz Kołecki

Walidacja danych w ASP.NET MVC

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Wojciech Dworakowski. Zabezpieczanie aplikacji. Firewalle aplikacyjne - internetowych

Remote Method Invocation 17 listopada 2010

Technologie dla aplikacji klasy enterprise. Wprowadzenie. Marek Wojciechowski

Ogólnopolskie Repozytorium Prac Dyplomowych

Usługi sieciowe REST. Instytut Informatyki Politechnika Poznańska


Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017

AXIS2 - tworzenie usługi sieciowej i klienta Axis Data Binding. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Przygotowanie do nowoczesnego programowania po stronie przeglądarki. (HTML5, CSS3, JS, wzorce, architektura, narzędzia)

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Java wybrane technologie

Szkolenie wycofane z oferty

Wybrane działy Informatyki Stosowanej

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Ruby i Ruby on Rails. Mateusz Drożdżyński

Część I Dostęp do danych oraz moŝliwości programowe (silnik bazy danych)

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wykład 6 Dziedziczenie cd., pliki

Rozproszone systemy internetowe

Podręcznik Integracji

Technologie Obiektowe PK WFMI 2010/2011

Orange Send MMS. Autoryzacja. Metoda HTTP. Parametry wywołania. API wyślij MMS dostarcza wiadomości MMS. Basic POST

Spring Web MVC, Spring DI

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

Tworzenie i wykorzystanie usług

Dokumentacja techniczna API systemu SimPay.pl

EPI: Interfejs Graficzny Wykład nr 4 Podstawy frameworku Rails

Paweł Rajba

PRZETWARZANIE ROZPROSZONE ZADAN` Mariusz Gil 4Developers 2012, Poznań

SOAP i alternatywy. 1. WSDL. 2. Protokoły tekstowe XML-RPC. JSON-RPC. SOAPjr. 3. Protokoły binarne Google Protocol Bufers. Apache Thrift.

Komunikacja międzysystemowa

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

4 Web Forms i ASP.NET Web Forms Programowanie Web Forms Możliwości Web Forms Przetwarzanie Web Forms...152

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHNICZNA 1

Jak widzisz w powyższym przykładzie, mimo że operacja nie powiodła się (otrzymaliśmy status Błąd ), serwer zwrócił nam kod 200 OK.

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Testowanie aplikacji Java Servlets

Definicja. Not Only SQL

Programowanie obiektowe

Enterprise JavaBeans

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Aplikacje WWW. Krzysztof Ciebiera. 3 kwietnia 2014

Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Transkrypt:

Projektowanie i Konstrukcja Systemów Rozproszonych ServiceStack 1

Resource Oriented Architecture Architektura oprogramowania i styl programowania kładący nacisk na zasoby oraz interfejsy do ich modyfikacji REST nakłada dodatkowe ograniczenia wzorowane na sieci WWW na architekturę oprogramowania ROA 2

ROA cechy Rezygnacja z podejścia RPC na rzecz udostępniania zasobów Reprezentacja zasobu powinna zawierać odnośniki do innych powiązanych zasobów Każdy zasób powinien udostępniać własne URI Kombinacje zasobów powinny być reprezentowane pod własnym URI 3

REST cechy Wykorzystanie głównie HTTP/1.1 i URI Preferowanie danych w URI, niż w nagłówkach HTTP Klient-serwer Bezstanowość Zdolność do przechowywania podręcznego (Cacheability) Tolerancja systemów warstwowych (np. proxy) 4

REST cechy (2) Założenia co do interfejsów zasobów Identyfikacja zasobów w żądaniach (np. URI) Reprezentacja zasobów (np. JSON, XML) Manipulacja zasobami poprzez ich reprezentację Samoopisujące wiadomości (np. MIME) Hiperlinki jako podstawowy mechanizm zmiany stanu klienta 5

ROA/REST zalety Łatwe sterowanie wydajnością i skalowalnością (np. poprzez dobrze poznane mechanizmy dla HTTP) Prostota interfejsów (ograniczenie do HTTP verbs) Łatwa modyfikacja zasobów i ich reprezentacji Jasna i przejrzysta komunikacja 6

ROA/REST wady Założenie o bezstanowości serwerów Konieczność przesyłania pełnych reprezentacji zasobów W praktyce: ograniczenia płynące z działania w ramach HTTP Sesja wyłącznie po stronie klienta (odporność na awarie, trwałość) 7

ServiceStack Framework do tworzenie usług webowych, nastawiony na REST Konwencja nad konfiguracją Brak generowania kodu Dedykowane POCO DTO.NET i mono Łatwy w testowaniu Zorientowany na wiadomości (Request/Reply) OpenSource (v3.x) 8

ServiceStack cechy Formatowanie do XML, JSON, SOAP i innych Wbudowane narzędzia walidacji żądań Automatyczna obsługa wyjątków Caching (Memcached i Redis wspierane standardowo) Uwierzytelnianie i autoryzacja (wbudowany OAuth dla Twitter/Facebook) 9

ServiceStack HelloWorld Każda usługa składa się z następujących elementów Request DTO Implementacja usługi Response DTO URI usługi (routing żądań) 10

ServiceStack HelloWorld (2) DTO Request using ServiceStack.ServiceHost; [Route("/hello")] [Route("/hello/{Name}")] public class Hello : DTO Reply class HelloResponse { public string Result { get; set; } } IReturn<HelloResponse> { public string Name { get; set; } } 11

ServiceStack HelloWorld (3) Usługa public class HelloService : Service { public HelloResponse Get(HelloRequest request) { return Hello + request.name; } } Klient string response = client.get(new HelloRequest( Chuck )); 12

ServiceStack tworzenie API W usłudze implementacja metod odpowiadających czasownikom HTTP Możliwe dodawanie niestandardowych Różne typy DTO dla różnych czasowników [Route("/reqstars")] public class AllReqstars : IReturn<List<Reqstar>> { } public class ReqstarsService : Service { public List<Reqstar> Any(AllReqstars request) {return Db.Select<Reqstar>();} } 13

ServiceStack tworzenie API (2) [Route("/users", "GET,POST")] [Route("/api/admin/users/{Name}", "GET,PUT,DELETE")] public class User : IReturn<IList<UserDto>> { } [Route("/myUser", "GET")] public class MyUser : IReturn<UserDto> { } Public class UsersService : Service { public UserDto Get (MyUser request) {} public object Delete (User request) {} public object Put (User request) {} [SetStatus(HttpStatusCode.Accepted, "New user was created")] public object Post (User request) {} } 14

ServiceStack Metadane Generowane pod adresem /metadata Lista usług i punktów wejścia Adresy dla każdego formatu danych (z przykładami) WSDL dla usług SOAP Adresy opisów XSD typów danych DTO Adresy do przykładowych implementacji klienckich 15

ServiceStack Metadane (2) Możliwe formatowanie do: XML, JSON, JSV, CSV, SOAP Wykorzystuje najszybszy dostępny serializator JSON ServiceStack.Text 16

Hosting IIS Self-hosting Linux: daemon i FastCGI public class AppHost : AppHostHttpListenerBase { public AppHost() : base("httplistener Self-Host", typeof(helloservice).assembly) {} public override void Configure(Funq.Container container) { Routes.Add<Hello>("/hello").Add<Hello>("/hello/{Name}"); Plugins.Add ( ); } } 17

Hosting (2) static void Main(string[] args) { var listeningon = args.length == 0? "http://*:1337/" : args[0]; var apphost = new AppHost(); apphost.init(); apphost.start(listeningon); Console.WriteLine("AppHost Created at {0}, listening on {1}", DateTime.Now, listeningon); } Console.ReadKey(); 18

Routing żądań Dopasowanie zmiennych i czasowników HTTP [Route("/hello/{Name}", "GET POST")] Wildcard [Route("/hello/{Name*}")] /hello /hello/name /hello/my/name/is //Name = my/name/is Ścieżki ignorowane [Route("/contacts/{Id}/{ignore}", "GET")] /contacts/1/john-doe dopasje tylko 1 19

Odpowiedzi Usługa może zwrócić: Obiekt DTO serializowany do wybranego formatu Ręcznie wybrane: HttpResult, HttpError, CompressedResult Dopasowanie formatu odpowiedzi Nagłówek Accept lub /srv?format=[json xml...] 20

Odpowiedzi (2) public object Get(Hello request) { //1. Returning a custom Response Status and Description with Response DTO body: var responsedto =...; return new HttpResult(responseDto, HttpStatusCode.Conflict) { StatusDescription = "Computer says no", }; //2. Throw or return a HttpError: throw new HttpError(HttpStatusCode.Conflict, "SomeErrorCode"); //3. Modify the Request's IHttpResponse base.response.statuscode = (int)httpstatuscode.redirect; base.response.addheader("location", "http://path/to/new/uri"); } //4. Using a Request or Response Filter [AddHeader(ContentType = "text/plain")] public string Get(Hello request) { return "Hello, {0}!".Fmt(request.Name); } 21

Wtyczki Standardowe Metadane HTML Info Format Razor Markdown Opcjonalne MVC Razor Validation Authentication Registration Request Logger 22

Kontener IoC Kontener IoC używany dla wszystkich zależności Usług Filtrów żądań Walidatorów Domyślnie singleton Przykład rejestracji własnego typu public override void Configure(Container container) { container.registerautowired<mytype>(); container.registerautowiredas<mytype,imytype>(); } 23

Obsługa błędów Wyjątki CLR przekazywane end-to-end, ale z serializacją po drodze (np. JSON) Biblioteka do obsługi błędów w JavaScript Przykład (ważna konwencja nazw) public class Hello {} public class HelloResponse //Follows naming convention and is in the same namespace as 'Hello' { public ResponseStatus ResponseStatus { get; set; } //Exception gets serialized here } 24

Obsługa błędów (2) Wyjątki CLR mapowane na kody HTTP MyEx : ArgumentException > 400 BadRequest UnauthorizedAccessException > 403 Forbidden MyEx : NotImplementedException > 405 MethodNotAllowed Inne wyjątki > 500 InternalServerError Ręczne zwrócenie błędu zamiast DTO public object Get(User request) { throw HttpError.NotFound("User {0} does not exist".fmt (requst.name)); } 25

Obsługa błędów (3) Wyjątki odtwarzane po stronie klienta try { var client = new JsonServiceClient(BaseUri); var response = client.send<userresponse>(new User()); } catch (WebServiceException webex) { /* webex.statuscode = 400 webex.errorcode webex.message = ArgumentNullException = Value cannot be null. Parameter name: Name webex.stacktrace = (Server StackTrace if DebugMode is enabled) webex.responsedto = (populated Response DTO) webex.responsestatus = (your populated Response Status DTO) webex.getfielderrors() = (individual errors for each field if any) 26

Walidacja Fluent Validation Separacja logiki biznesowej od walidacji przychodzących żądań Przykład [Route("/users")] public class User { } public string Name { get; set; } public string Company { get; set; } public int Age { get; set; } public int Count { get; set; } 27

Walidacja Fluent Validation (2) public class UserValidator : AbstractValidator<User> { public UserValidator() { //Validation rules for all requests RuleFor(r => r.name).notempty(); RuleFor(r => r.age).greaterthan(0); //Validation rules for GET request RuleSet(ApplyTo.Get, () => { RuleFor(r => r.count).greaterthan(10);}); //Validation rules for POST and PUT request RuleSet(ApplyTo.Post ApplyTo.Put, () => { RuleFor(r => r.company).notempty();}); } } 28

Walidacja Fluent Validation (3) Request: POST localhost:50386/validated { "Name": "Max" } Response: { "ErrorCode": "GreaterThan", "Message": "'Age' must be greater than '0'.", "Errors": [ { "ErrorCode": "GreaterThan", "FieldName": "Age", "Message": "'Age' must be greater than '0'." }, { "ErrorCode": "NotEmpty", "FieldName": "Company", "Message": "'Company' should not be empty." }]} 29

Bezpieczeństwo Powiązanie kilku aspektów Uwierzytelnianie i autoryzacja Zarządzanie użytkownikami Standardy uwierzytelniania Sesja użytkownika Cache Przechowywanie 30

Bezpieczeństwo (2) 31

Bezpieczeństwo (3) Uwierzytelnianie Credentials usługa uwierzytelniająca Basic Auth HTTP Basic Authentication Digest Auth HTTP Digest Authentication Custom Credentials własne implementacje OAuth: Twitter, Facebook, Yammer OpenId: Google, Yahoo OAuth2: Google, LinkedIn 32

Bezpieczeństwo (4) Przechowywanie danych uwierzytelniania OrmLite Redis In Memory Mongo DB Raven DB NHibernate Caching: In Memory, Memcached, Redis, AWS, Azure 33

Bezpieczeństwo przykład Konfiguracja public override void Configure(Container container) { Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new CredentialsAuthProvider() })); Plugins.Add(new RegistrationFeature()); container.register<icacheclient>(new MemoryCacheClient()); var userrep = new InMemoryAuthRepository(); container.register<iuserauthrepository>(userrep); } 34

Bezpieczeństwo przykład (2) Żądanie uwierzytelnienia (CredentialsAuthProvider) POST localhost:6339/auth/credentials?format=json { "UserName": "admin", "Password": "test", "RememberMe": true } 35

Bezpieczeństwo przykład (3) Po uwierzytelnieniu klient otrzymuje Auth Cookie, na jego podstawie znajdowana jest sesja Możliwe własne implementacje IUserAuthSession Obsługa sesji public class SecuredService : Service { } public object Get(Secured request) { } IAuthSession session = this.getsession(); return new SecuredResponse() { Test = "Hi " + session.firstname }; 36

Bezpieczeństwo przykład (4) Wbudowane podstawowe zarządzanie prawami, możliwe do określenia na poziomie DTO lub usługi [Authenticate] [RequiredRole("Admin")] [RequiredPermission("CanAccess")] [RequiredPermission(ApplyTo.Put ApplyTo.Post, "CanAdd")] [RequiredPermission(ApplyTo.Delete, "AdminRights", "CanDelete")] public class Secured { public bool Test { get; set; } } public class SecuredService : Service { public object Get(Secured request) {... 37

Request / response filters Globalne filtrowanie żądań lub odpowiedzi, np. this.requestfilters.add((httpreq, httpresp, requestdto) => { var sessionid = httpreq.getcookievalue("user session"); if (sessionid == null) httpresp.returnauthrequired(); }); this.responsefilters.add((req, res, dto) => { if (req.responsecontenttype == ContentType.Csv) res.addheader(httpheaders.contentdisposition, string.format("attachment;filename={0}.csv", req.operationname)); }); 38

Klienci usług Usługi silnie typowane na podstawie DTO HelloResponse response = client.get(new Hello { Name = "World!" }); response.result.print(); client.getasync(new Hello { Name = "World!" }, r => r.result.print(), (r, ex) => { throw ex; }); var client = new JsonServiceClient(baseUri) { UserName = UserName, Password = Password }; var request = new Secured { Name = "test" }; var response = client.send<secureresponse>(request); 39

Inne Auto Mapper Wspiera konwersję między DTO a obiektami biznesowymi var dto = viewmodel.translateto<mydto>(); var dto = new MyDto { A = 1, B = 2 }.PopulateWith(viewModel); var dto = new MyDto { A = 1, B = 2 }.PopulateWithNonDefaultValues(viewModel); 40

Inne OrmLite Prosty ORM: 1 klasa 1 tabela Wspiera SQL Server, Oracle, MySQL, PostgreSQL, SQLite, Firebird Przykład: var people = db.selectparam<person>(q => q.age == 27); var person = db.getbyidparam<person>(1); db.createtable<employee>(); db.insert(new Employee { Id = 1, Name = "Employee 1" }); 41

Inne Wewnętrzne logowanie na podstawie wielu dostawców logu Automatyczne logowanie żądań Wbudowany mini profiler Cache również dla odpowiedzi usług Klient w JavaScript 42