Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
01049 015545 17216479 na godz. na dobę w sumie
Mikrousługi w Javie. Poradnik eksperta - ebook/pdf
Mikrousługi w Javie. Poradnik eksperta - ebook/pdf
Autor: Liczba stron: 216
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-3219-5 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> java - programowanie
Porównaj ceny (książka, ebook (-45%), audiobook).
Chmury obliczeniowe otworzyły nowe możliwości projektowania aplikacji korporacyjnych. Obecnie konstruuje się je z małych, lekkich i zorientowanych na proces komponentów, nazywanych mikrousługami. Tworzone w ten sposób aplikacje są skalowalne i łatwe do zarządzania, a przy tym niezwykle elastyczne i wykorzystujące dostępne zasoby w wyjątkowo efektywny sposób. Jak łatwo się przekonać, projektowanie i implementacja mikrousług otwierają przed programistami Javy bardzo obiecujące perspektywy!

Niniejsza książka jest przeznaczona dla programistów Javy, którzy znają podstawowe pojęcia dotyczące mikrousług i chcą tworzyć funkcjonalne aplikacje biznesowe w tej technologii. Przedstawiono tu najważniejsze zasady realizacji dużych projektów, zaprezentowano ważne szczegóły dotyczące konfiguracji środowiska programistycznego i ciągłej integracji, które ułatwią wdrażanie mikrousług. Opisano zalety i sposoby wykorzystania biblioteki Spring Security. Przedstawiono dobre praktyki projektowania mikrousług, a także techniki ich debugowania, tak aby bez problemu można było zaprojektować i wdrożyć aplikację w środowisku korporacyjnym.

Niektóre zagadnienia omówione w książce:

Mikrousługi — sprytne rozwiązania biznesowe dla dużych korporacji!


Sourabh Sharma tworzy aplikacje od ponad 10 lat. Jest cenionym ekspertem w dziedzinie tworzenia, wdrażania i testowania wielowarstwowych aplikacji internetowych. Opracował i wdrożył wiele rozwiązań samodzielnych i chmurowych dla klientów z listy Fortune 500. Jest autorem wielu systemów opartych na mikrousługach. Sharma jest pasjonatem Javy. Uwielbia analizowanie skomplikowanych problemów i poszukiwanie niestandardowych rozwiązań.
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Mastering Microservices with Java Tłumaczenie: Krzysztof Rychlicki-Kicior ISBN: 978-83-283-3218-8 Copyright © Packt Publishing 2016 First published in the English language under the title ‘Mastering Microservices with Java – (9781785285172)’. Polish edition copyright © 2017 by Helion SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/mikjav Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorach O recenzencie Przedmowa Rozdzia(cid:239) 1. Koncepcja rozwi(cid:200)zania Rozwój mikrous(cid:239)ug Omówienie architektury monolitycznej Problemy architektury monolitycznej i ich rozwi(cid:200)zania w mikrous(cid:239)ugach Jednowymiarowa skalowalno(cid:258)(cid:202) Wycofanie wersji produkcyjnej w razie problemów Problemy zwi(cid:200)zane z wdra(cid:285)aniem nowych technologii Mikrous(cid:239)ugi a metodyki zwinne (cid:146)atwo(cid:258)(cid:202) tworzenia oprogramowania — da si(cid:218) lepiej! Budowanie mikrous(cid:239)ug — kolejno(cid:258)(cid:202) wykonywania dzia(cid:239)a(cid:241) Wdra(cid:285)anie mikrous(cid:239)ug w kontenerach na przyk(cid:239)adzie Dockera Podsumowanie Rozdzia(cid:239) 2. Konfiguracja (cid:258)rodowiska programistycznego Konfiguracja Spring Boot Omówienie technologii Spring Boot Dodajemy Spring Boot do przyk(cid:239)adowego projektu Dodajemy wbudowany serwer Jetty Przyk(cid:239)adowa aplikacja typu REST Piszemy klas(cid:218) kontrolera REST Uruchamianie przyk(cid:239)adowej aplikacji Konfiguracja procesu budowania aplikacji Uruchomienie narz(cid:218)dzia Maven Wykonywanie polecenia w terminalu 9 10 11 15 16 17 17 20 21 21 22 23 24 25 28 29 30 30 31 33 34 35 38 39 39 40 Poleć książkęKup książkę Spis tre(cid:286)ci Testowanie API za pomoc(cid:200) rozszerzenia Postman Prawid(cid:239)owe przypadki testowe Nieprawid(cid:239)owe przypadki testowe Instalacja i konfiguracja (cid:258)rodowiska NetBeans (cid:189)ród(cid:239)a Podsumowanie Rozdzia(cid:239) 3. Projektowanie sterowane modelem dziedziny Podstawy projektowania sterowanego modelem dziedziny Poj(cid:218)cia, terminy, definicje Wszechobecne s(cid:239)ownictwo Wielowarstwowa architektura Artefakty zwi(cid:200)zane z projektowaniem sterowanym modelem dziedziny Projektowanie strategiczne i jego za(cid:239)o(cid:285)enia Ograniczony kontekst Integracja ci(cid:200)g(cid:239)a Mapa kontekstu Przyk(cid:239)adowa us(cid:239)uga dziedziny Implementacja encji Implementacja repozytorium Implementacja us(cid:239)ugi Podsumowanie Rozdzia(cid:239) 4. Implementujemy mikrous(cid:239)ug(cid:218) Omówienie systemu OTRS Opracowywanie i implementacja mikrous(cid:239)ug Mikrous(cid:239)uga Restaurant Us(cid:239)ugi u(cid:285)ytkowników i rezerwacji Rejestracja i wykrywanie us(cid:239)ug (us(cid:239)uga Eureka) Wykonanie Testowanie (cid:189)ród(cid:239)a Podsumowanie Rozdzia(cid:239) 5. Wdra(cid:285)anie i testowanie Podstawy architektury mikrous(cid:239)ug w Netflix OSS Równowa(cid:285)enie obci(cid:200)(cid:285)enia Równowa(cid:285)enie obci(cid:200)(cid:285)enia po stronie klienta Równowa(cid:285)enie obci(cid:200)(cid:285)enia po stronie serwera Wy(cid:239)(cid:200)cznik automatyczny a monitorowanie Stosowanie metod awaryjnych aplikacji Hystrix Monitorowanie us(cid:239)ug Konfiguracja pulpitu Hystrix Konfiguracja aplikacji Turbine Wdra(cid:285)anie mikrous(cid:239)ug za pomoc(cid:200) kontenerów Instalacja i konfiguracja (cid:189)ród(cid:239)a Podsumowanie 4 40 43 44 45 48 49 51 52 53 53 54 55 63 64 64 65 68 69 70 72 73 75 76 77 78 87 87 88 88 91 91 93 93 95 95 98 101 101 102 103 105 106 106 115 116 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 6. Mikrous(cid:239)ugi a bezpiecze(cid:241)stwo Dodanie obs(cid:239)ugi protoko(cid:239)u SSL Uwierzytelnianie i autoryzacja OAuth 2.0 Specyfikacja OAuth 2.0 — krótko i na temat Implementacja OAuth z wykorzystaniem Spring Security (cid:189)ród(cid:239)a Podsumowanie Rozdzia(cid:239) 7. U(cid:285)ytkowanie mikrous(cid:239)ug za pomoc(cid:200) aplikacji webowej Ogólne za(cid:239)o(cid:285)enia frameworka AngularJS MVC MVVM Modu(cid:239)y Dostawcy i us(cid:239)ugi Zakresy Kontrolery Filtry Dyrektywy Router interfejsu u(cid:285)ytkownika — UI-Router Implementacja funkcji systemu OTRS Lista restauracji/strona domowa Wyszukiwanie restauracji Widok szczegó(cid:239)ów restauracji z opcj(cid:200) rezerwacji Strona logowania Potwierdzenie rezerwacji Konfiguracja aplikacji webowej (cid:189)ród(cid:239)a Podsumowanie Rozdzia(cid:239) 8. Dobre praktyki i istotne regu(cid:239)y tworzenia mikrous(cid:239)ug W(cid:239)a(cid:258)ciwy sposób my(cid:258)lenia Dobre praktyki i przydatne regu(cid:239)y Nanous(cid:239)uga (niezalecana), rozmiar i monolityczno(cid:258)(cid:202) Ci(cid:200)g(cid:239)a integracja i wdra(cid:285)anie Automatyzacja testów end-to-end Automonitorowanie i logowanie Oddzielny magazyn danych dla ka(cid:285)dej mikrous(cid:239)ugi Granice transakcji Narz(cid:218)dzia i frameworki do tworzenia mikrous(cid:239)ug Netflix Open Source Software (OSS) (cid:189)ród(cid:239)a Podsumowanie 117 117 120 121 122 138 147 148 149 150 150 150 151 152 153 153 153 154 154 155 155 167 168 169 172 172 183 184 185 185 187 187 188 189 190 191 192 193 193 199 199 5 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 9. Rozwi(cid:200)zywanie problemów Obs(cid:239)uga logów i stos ELK Krótkie wprowadzenie Konfiguracja stosu ELK Zastosowanie skorelowanych ID dla wywo(cid:239)a(cid:241) us(cid:239)ug Jak rozwi(cid:200)za(cid:202) ten problem? Zale(cid:285)no(cid:258)ci i wersje Zale(cid:285)no(cid:258)ci cykliczne i ich wp(cid:239)yw Zarz(cid:200)dzanie ró(cid:285)nymi wersjami Dowiedz si(cid:218) wi(cid:218)cej (cid:189)ród(cid:239)a Podsumowanie Skorowidz 201 201 202 204 207 207 207 207 208 208 209 209 211 6 Poleć książkęKup książkę 4 Implementujemy mikrous(cid:239)ug(cid:218) W tym rozdziale przejdziemy od projektu do implementacji naszej przyk(cid:239)adowej aplikacji — internetowego systemu rezerwacji stolików (Online Table Reservation System — OTRS). Skorzystamy z projektu opracowanego w poprzednim rozdziale i rozszerzymy go, aby stwo- rzy(cid:202) mikrous(cid:239)ug(cid:218). Poznasz tu zasady implementacji projektu, ale tak(cid:285)e inne wa(cid:285)ne aspekty tworzenia mikrous(cid:239)ug — budowanie, testowanie i tworzenie archiwów aplikacji. Cho(cid:202) skon- centrujemy si(cid:218) na implementacji us(cid:239)ugi restauracji, podobne podej(cid:258)cie mo(cid:285)na zastosowa(cid:202) równie(cid:285) przy tworzeniu innych us(cid:239)ug wchodz(cid:200)cych w sk(cid:239)ad OTRS. W tym rozdziale zajmiemy si(cid:218) nast(cid:218)puj(cid:200)cymi zagadnieniami: (cid:81) Omówimy ogólne za(cid:239)o(cid:285)enia systemu OTRS. (cid:81) Zaimplementujemy mikrous(cid:239)ug(cid:218). (cid:81) Przeprowadzimy testy. Skorzystamy z kluczowych konceptów DDD, które omówili(cid:258)my w poprzednim rozdziale. Zastosowali(cid:258)my je wtedy do stworzenia modelu dziedzinowego w j(cid:218)zyku Java. Teraz przej- dziemy od prostej implementacji dziedziny do implementacji opartej na frameworku Spring. Skorzystamy z technologii Spring Boot, aby zaimplementowa(cid:202) koncepcje wynikaj(cid:200)ce z pro- jektowania sterowanego modelem dziedziny, a tak(cid:285)e przekszta(cid:239)cimy je z j(cid:218)zyka Java do mo- delu opartego na frameworku Spring. U(cid:285)yjemy tak(cid:285)e frameworka Spring Cloud, który pozwoli nam na stworzenie rozwi(cid:200)zania chmurowego. Spring Cloud równie(cid:285) wykorzystuje Spring Boot, dzi(cid:218)ki któremu mo(cid:285)emy za- stosowa(cid:202) wbudowany kontener aplikacji (Tomcat lub Jetty) wewn(cid:200)trz Twojej us(cid:239)ugi, opakowanej Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta jako JAR lub WAR. Archiwum jest uruchamiane jako osobny proces, a mikrous(cid:239)uga zajmie si(cid:218) dostarczaniem odpowiedzi dla wszystkich (cid:285)(cid:200)da(cid:241), które zosta(cid:239)y opisane na li(cid:258)cie ko(cid:241)cówek w danej us(cid:239)udze. Spring Cloud mo(cid:285)na zintegrowa(cid:202) tak(cid:285)e z us(cid:239)ug(cid:200) Netflix Eureka — rejestrem us(cid:239)ug. OTRS skorzysta z tej us(cid:239)ugi do rejestracji i wykrywania mikrous(cid:239)ug. Omówienie systemu OTRS Znaj(cid:200)c zasady tworzenia mikrous(cid:239)ug, mo(cid:285)emy stwierdzi(cid:202), (cid:285)e ka(cid:285)da cz(cid:218)(cid:258)(cid:202) aplikacji, która jest w stanie funkcjonowa(cid:202) niezale(cid:285)nie, powinna by(cid:202) odr(cid:218)bn(cid:200) mikrous(cid:239)ug(cid:200). W przypadku systemu OTRS mo(cid:285)emy wyró(cid:285)ni(cid:202) trzy g(cid:239)ówne mikrous(cid:239)ugi — restauracj(cid:218), rezerwacj(cid:218) i u(cid:285)ytkownika. Oczywi(cid:258)cie, mo(cid:285)na definiowa(cid:202) równie(cid:285) inne mikrous(cid:239)ugi, jednak my skupimy si(cid:218) na tych trzech. Aby by(cid:239)y one w pe(cid:239)ni niezale(cid:285)ne, utworzymy dla nich odr(cid:218)bne bazy danych. Zakres funkcjonalny wymienionych us(cid:239)ug mo(cid:285)na opisa(cid:202) nast(cid:218)puj(cid:200)co: (cid:81) Us(cid:239)uga restauracji (Restaurant): umo(cid:285)liwia podstawowe zarz(cid:200)dzanie zasobami restauracji — tzw. CRUD (ang. Create, Read, Update, Delete — dodawanie, odczyt, modyfikacja i usuni(cid:218)cie), a dodatkowo ich przeszukiwanie z wykorzystaniem rozmaitych kryteriów. Pozwala równie(cid:285) na wi(cid:200)zanie restauracji i stolików. Restauracja udost(cid:218)pni tak(cid:285)e encje stolika (Table). (cid:81) Us(cid:239)uga u(cid:285)ytkownika (User): pozwoli na wykonanie operacji typu CRUD dla encji User. (cid:81) Us(cid:239)uga rezerwacji (Booking): pozwoli na dokonywanie rezerwacji (operacje typu CRUD) na podstawie us(cid:239)ug Restaurant i User. Przeszukiwanie dost(cid:218)pne w us(cid:239)udze Restaurant pozwoli na znalezienie wybranej restauracji; lista powi(cid:200)zanych z restauracj(cid:200) stolików umo(cid:285)liwi wybór konkretnego stolika na podstawie informacji o dost(cid:218)pno(cid:258)ci stolików. Us(cid:239)uga ta utworzy zwi(cid:200)zek pomi(cid:218)dzy encj(cid:200) Restaurant/Table a User. Rysunek 4.1 podkre(cid:258)la fakt, (cid:285)e ka(cid:285)da z mikrous(cid:239)ug dzia(cid:239)a niezale(cid:285)nie. To w(cid:239)a(cid:258)nie dlatego mikrous(cid:239)ugi mog(cid:200) by(cid:202) tworzone, rozwijane i zarz(cid:200)dzane niezale(cid:285)nie, bez wp(cid:239)ywu na inne. Ka(cid:285)da z us(cid:239)ug ma odr(cid:218)bn(cid:200) architektur(cid:218) warstwow(cid:200) i baz(cid:218) danych. Nie ma ogranicze(cid:241) co do stosowanych do tworzenia technologii, frameworków czy j(cid:218)zyków programowania. W dowolnym momencie mo(cid:285)esz te(cid:285) tworzy(cid:202) nowe mikrous(cid:239)ugi, np. do celów ksi(cid:218)gowych, które by(cid:239)yby wykorzystywane przez us(cid:239)ug(cid:218) Restaurant. To samo dotyczy us(cid:239)ug analitycz- nych i do raportowania. Do celów demonstracyjnych zajmiemy si(cid:218) implementacj(cid:200) ograniczon(cid:200) do trzech wymienio- nych powy(cid:285)ej us(cid:239)ug. 76 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) Rysunek 4.1. Mikrous(cid:239)ugi a rejestracja i wykrywanie Opracowywanie i implementacja mikrous(cid:239)ug Teraz zajmiemy si(cid:218) implementacj(cid:200) sterowan(cid:200) modelem dziedziny, a tak(cid:285)e podej(cid:258)ciem przed- stawionym w poprzednim rozdziale w celu implementowania mikrous(cid:239)ug za pomoc(cid:200) frame- worka Spring Cloud. Przypomnijmy sobie kluczowe artefakty naszego projektu: (cid:81) Encje: s(cid:200) to obiekty identyfikowalne i niezmienne przez czas (cid:285)ycia produktu/us(cid:239)ugi. Obiekty te nie s(cid:200) definiowane za pomoc(cid:200) swoich atrybutów — maj(cid:200) odr(cid:218)bn(cid:200) to(cid:285)samo(cid:258)(cid:202) i zachowan(cid:200) ci(cid:200)g(cid:239)o(cid:258)(cid:202) istnienia. Encje maj(cid:200) swoj(cid:200) to(cid:285)samo(cid:258)(cid:202) i zachowuj(cid:200) ci(cid:200)g(cid:239)o(cid:258)(cid:202), a tak(cid:285)e atrybuty, które jednak nie maj(cid:200) wp(cid:239)ywu na ci(cid:200)g(cid:239)o(cid:258)(cid:202). Obiekty warto(cid:258)ci (ang. Value Objects — VO) maj(cid:200) za to tylko atrybuty, nie dysponuj(cid:200)c w(cid:239)asn(cid:200) to(cid:285)samo(cid:258)ci(cid:200). Dobr(cid:200) praktyk(cid:200) jest unikanie zmian w obiektach warto(cid:258)ci. We frameworku encje stanowi(cid:200) zwyk(cid:239)e obiekty j(cid:218)zyka Java (POJO), dlatego b(cid:218)dziemy ich u(cid:285)ywa(cid:202) tak(cid:285)e jako obiektów warto(cid:258)ci. (cid:81) Us(cid:239)ugi: stanowi(cid:200) typowy element wielu projektów. S(cid:200) u(cid:285)ywane w warstwie dziedziny w projektowaniu sterowanym modelem dziedziny. Obiekt us(cid:239)ugi nie zawiera wewn(cid:218)trznego stanu — jego jedynym celem jest udost(cid:218)pnianie zachowania dziedziny. Obiekty us(cid:239)ug udost(cid:218)pniaj(cid:200) zachowania, które nie s(cid:200) zwi(cid:200)zane z konkretnymi encjami lub obiektami warto(cid:258)ci. Obiekty us(cid:239)ug udost(cid:218)pniaj(cid:200) jedno lub wiele zachowa(cid:241) jednej lub wi(cid:218)kszej liczbie encji lub obiektów warto(cid:258)ci. Najlepiej jest definiowa(cid:202) us(cid:239)ugi jawnie w modelu dziedziny. 77 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta (cid:81) Obiekt repozytorium: obiekt ten stanowi element modelu dziedziny, który obs(cid:239)uguje pami(cid:218)(cid:202) trwa(cid:239)(cid:200), tak(cid:200) jak bazy danych, zewn(cid:218)trzne (cid:283)ród(cid:239)a itd., aby pozyskiwa(cid:202) utrwalone obiekty. Po otrzymaniu (cid:285)(cid:200)dania przez repozytorium w celu uzyskania referencji do obiektu, je(cid:258)li obiekt jest dost(cid:218)pny bezpo(cid:258)rednio w repozytorium, zwracana jest do niego referencja. W przeciwnym razie najpierw jest on wczytywany z zewn(cid:218)trznego (cid:283)ród(cid:239)a. Pobieranie przyk(cid:239)adowego kodu Przyk(cid:239)adowy kod jest dost(cid:218)pny na serwerze FTP wydawnictwa Helion, pod adresem ftp://ftp.helion.pl/ przyklady/mikjav.zip. (cid:81) API ka(cid:285)dej mikrous(cid:239)ugi stanowi us(cid:239)ug(cid:218) sieciow(cid:200) typu REST. API naszego systemu wykorzystuje metody protoko(cid:239)u HTTP, takie jak GET i POST, a tak(cid:285)e typow(cid:200) struktur(cid:218) ko(cid:241)cówki typu REST. (cid:191)(cid:200)dania i odpowiedzi s(cid:200) zdefiniowane za pomoc(cid:200) formatu JSON. Mo(cid:285)na równie(cid:285) stosowa(cid:202) j(cid:218)zyk XML. Mikrous(cid:239)uga Restaurant Mikrous(cid:239)uga Restaurant zostanie udost(cid:218)pniona za pomoc(cid:200) ko(cid:241)cówek typu REST. Poni(cid:285)sze ko(cid:241)cówki s(cid:200) dost(cid:218)pne w mikrous(cid:239)udze Restaurant. Oczywi(cid:258)cie, liczba ko(cid:241)cówek nie jest ograniczona: GET /v1/restaurants/ Restaurant_ID Opis Parametr (cid:258)cie(cid:285)ki, który reprezentuje unikaln(cid:200) restauracj(cid:218) skojarzon(cid:200) z tym ID. Typ Opis Typ Obiekt typu Restaurant Opis Obiekt restauracji skojarzony z danym ID Ko(cid:241)cówka Parametry Nazwa Restaurant_ID (cid:191)(cid:200)danie W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Brak Odpowied(cid:283) W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Restaurant 78 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) GET /v1/restaurants Opis Typ String Opis Parametr zapytania, który okre(cid:258)la nazw(cid:218) lub fragment nazwy restauracji. Typ Tablica obiektów restauracji Opis Zwraca wszystkie restauracje, których nazwy zawieraj(cid:200) warto(cid:258)(cid:202) parametru. POST /v1/restaurants Opis Typ Obiekt restauracji Typ Obiekt restauracji Opis Reprezentacja obiektu restauracji w formacie JSON Opis Nowo utworzony obiekt typu Restaurant Ko(cid:241)cówka Parametry Nazwa Brak (cid:191)(cid:200)danie W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Name Odpowied(cid:283) W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Restaurants Ko(cid:241)cówka Parametry Nazwa Brak (cid:191)(cid:200)danie W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Restaurant Odpowied(cid:283) W(cid:239)a(cid:258)ciwo(cid:258)(cid:202) Restaurant Na tej samej zasadzie mo(cid:285)emy dodawa(cid:202) rozmaite ko(cid:241)cówki i ich implementacje. Do celów demonstracyjnych powy(cid:285)sze ko(cid:241)cówki zostan(cid:200) zaimplementowane za pomoc(cid:200) technologii Spring Cloud. Klasa kontrolera Kontroler us(cid:239)ugi Restaurant wykorzystuje adnotacj(cid:218) @RestController, aby wygenerowa(cid:202) ko(cid:241)- cówki us(cid:239)ugi. Szczegó(cid:239)y dzia(cid:239)ania tego mechanizmu omówili(cid:258)my w rozdziale 2. @RestController to adnotacja na poziomie klasy, która jest u(cid:285)ywana wobec klas zasobów. Jest to po(cid:239)(cid:200)czenie ad- notacji @Controller i @ResponseBody. Zwraca ona obiekt dziedziny. 79 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta Wersjonowanie API Id(cid:200)c naprzód, chcia(cid:239)bym wyja(cid:258)ni(cid:202) obecno(cid:258)(cid:202) prefiksu v1 w ko(cid:241)cówce typu REST. Oznacza ona wersj(cid:218) API. Jest to niezwykle wa(cid:285)na kwestia. Wersjonowanie API jest kluczowe, poniewa(cid:285) API z czasem ulegaj(cid:200) zmianom. Twoja wiedza i do(cid:258)wiadczenie zmieniaj(cid:200) si(cid:218) z up(cid:239)ywem czasu, co prowadzi do wprowadzania zmian w API. Ka(cid:285)da zmiana w API mo(cid:285)e spowodowa(cid:202) problemy z dzia(cid:239)aniem aplikacji klienckich. Zarz(cid:200)dzanie wersjami API mo(cid:285)na zrealizowa(cid:202) na kilka sposobów. Jednym z nich jest podawanie wersji w (cid:258)cie(cid:285)ce lub w nag(cid:239)ówku HTTP. Nag(cid:239)ówek HTTP mo(cid:285)e zawiera(cid:202) specjalny nag(cid:239)ówek (cid:285)(cid:200)dania lub nag(cid:239)ówek Accept, dzi(cid:218)ki czemu mo(cid:285)na okre(cid:258)li(cid:202) wersj(cid:218) API. Wi(cid:218)cej informacji znaj- dziesz w ksi(cid:200)(cid:285)ce REST. Najlepsze praktyki i wzorce w j(cid:218)zyku Java Bhaktiego Mehty (Helion, 2015). @RestController @RequestMapping( /v1/restaurants ) public class RestaurantController { protected Logger logger = Logger.getLogger(RestaurantController.class.getName()); protected RestaurantService restaurantService; @Autowired public RestaurantController(RestaurantService restaurantService) { this.restaurantService = restaurantService; } /** * Pobiera restauracje o okre(cid:286)lonej nazwie. Niewra(cid:298)liwo(cid:286)(cid:252) na wielko(cid:286)(cid:252) znaków jest cz(cid:266)(cid:286)ciowo obs(cid:225)ugiwana. * Wywo(cid:225)anie code http://…/restaurants/rest /code znajdzie wi(cid:266)c dowolne restauracje zawieraj(cid:261)ce * cz(cid:225)on rest lub REST w nazwie. * * @param name * @return Niepusta kolekcja restauracji. */ @RequestMapping(method = RequestMethod.GET) public ResponseEntity Collection Restaurant findByName(@RequestParam( name ) (cid:180)String name) { logger.info(String.format( Wywo(cid:239)anie metody restaurant-service findByName():{} (cid:180)dla {} , restaurantService.getClass().getName(), name)); name = name.trim().toLowerCase(); Collection Restaurant restaurants; try { restaurants = restaurantService.findByName(name); } catch (Exception ex) { logger.log(Level.WARNING, Wyj(cid:200)tek metody findByNameREST , ex); return new ResponseEntity Collection Restaurant (HttpStatus.INTERNAL_ (cid:180)SERVER_ERROR); } return restaurants.size() 0 ? new ResponseEntity Collection Restaurant (cid:180)(restaurants, HttpStatus.OK): new ResponseEntity Collection Restaurant (cid:180)(HttpStatus.NO_CONTENT); } /** * Pobiera restauracj(cid:266) dla zadanego ID. * code http://…/v1/restaurants/{restaurant_id} /code zwróci restauracj(cid:266) o podanym ID. 80 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) * * @param restaurant_id * @return Obiekt restauracji. */ @RequestMapping(value = /{restaurant_id} , method = RequestMethod.GET) public ResponseEntity Entity findById(@PathVariable( restaurant_id ) String id) { logger.info(String.format( Wywo(cid:239)anie restaurant-service findById():{} dla (cid:180){} , restaurantService.getClass().getName(), id)); id = id.trim(); Entity restaurant; try { restaurant = restaurantService.findById(id); } catch (Exception ex) { logger.log(Level.SEVERE, Wyj(cid:200)tek w wywo(cid:239)aniu findById REST , ex); return new ResponseEntity Entity (HttpStatus.INTERNAL_SERVER_ERROR); } return restaurant != null ? new ResponseEntity Entity (restaurant, (cid:180)HttpStatus.OK): new ResponseEntity Entity (HttpStatus.NO_CONTENT); } /** * Dodaje restauracj(cid:266) na podstawie okre(cid:286)lonych informacji. * * @param Restauracja * @return Restauracja (bez warto(cid:286)ci null) * @throws RestaurantNotFoundException Je(cid:286)li nie uda(cid:225)o si(cid:266) znale(cid:296)(cid:252) restauracji. */ @RequestMapping(method = RequestMethod.POST) public ResponseEntity Restaurant add(@RequestBody RestaurantVO restaurantVO) { logger.info(String.format( Wywo(cid:239)anie restaurant-service add(): s dla s , (cid:180)restaurantService.getClass().getName(), restaurantVO.getName()); Restaurant restaurant = new Restaurant(null, null, null); BeanUtils.copyProperties(restaurantVO, restaurant); try { restaurantService.add(restaurant); } catch (Exception ex) { logger.log(Level.WARNING, Wyj(cid:200)tek w wywo(cid:239)aniu metody add Restaurant (cid:180)REST + ex); return new ResponseEntity Restaurant (HttpStatus.UNPROCESSABLE_ENTITY); } return new ResponseEntity Restaurant (HttpStatus.CREATED); } } Klasy us(cid:239)ug Klasa RestaurantController wykorzystuje interfejs RestaurantService, który wprowadza ope- racje typu CRUD i przeszukiwanie, zgodnie z poni(cid:298)sz(cid:261) deklaracj(cid:261): public interface RestaurantService { public void add(Restaurant restaurant) throws Exception; public void update(Restaurant restaurant) throws Exception; public void delete(String id) throws Exception; public Entity findById(String restaurantId) throws Exception; 81 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta public Collection Restaurant findByName(String name) throws Exception; public Collection Restaurant findByCriteria(Map String, ArrayList String (cid:180)name) throws Exception; } Teraz mo(cid:285)emy zaimplementowa(cid:202) us(cid:239)ug(cid:218) zgodnie z powy(cid:285)szym interfejsem. Dziedziczy ona równie(cid:285) po klasie BaseService, utworzonej w poprzednim rozdziale. Skorzystamy z adnotacji @Service, aby zosta(cid:239)a utworzona us(cid:239)uga: @Service( restaurantService ) public class RestaurantServiceImpl extends BaseService Restaurant, String (cid:180)implements RestaurantService { private RestaurantRepository Restaurant, String restaurantRepository; @Autowired public RestaurantServiceImpl(RestaurantRepository Restaurant, String (cid:180)restaurantRepository) { super(restaurantRepository); this.restaurantRepository = restaurantRepository; } public void add(Restaurant restaurant) throws Exception { if (restaurant.getName() == null || .equals(restaurant.getName())) { throw new Exception( Nazwa restauracji nie mo(cid:285)e mie(cid:202) warto(cid:258)ci null (cid:180)ani pustej nazwy ); } if (restaurantRepository.containsName(restaurant.getName())) { throw new Exception(String.format( Istnieje ju(cid:285) restauracja o tej (cid:180)nazwie: - s , restaurant.getName())); } super.add(restaurant); } @Override public Collection Restaurant findByName(String name) throws Exception { return restaurantRepository.findByName(name); } @Override public void update(Restaurant restaurant) throws Exception { restaurantRepository.update(restaurant); } @Override public void delete(String id) throws Exception { restaurantRepository.remove(id); } @Override public Entity findById(String restaurantId) throws Exception { return restaurantRepository.get(restaurantId); } @Override public Collection Restaurant findByCriteria(Map String, ArrayList String (cid:180)name) throws Exception { throw new UnsupportedOperationException( Metoda nie zosta(cid:239)a (cid:180)zaimplementowana. ); // Aby zmieni(cid:252) tre(cid:286)(cid:252) generowanych metod, wybierz opcj(cid:266) Tools/Templates. } } 82 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) Klasy repozytorium Interfejs RestaurantRepository definiuje dwie nowe metody: containsName i findByName. Dziedziczy on tak(cid:285)e po interfejsie Repository: public interface RestaurantRepository Restaurant, String extends (cid:180)Repository Restaurant, String { boolean containsName(String name) throws Exception; Collection Restaurant findByName(String name) throws Exception; } Interfejs Repository wprowadza trzy nowe metody: add, remove i update. Dziedziczy on tak(cid:285)e po interfejsie ReadOnlyRepository: public interface Repository TE, T extends ReadOnlyRepository TE, T { void add(TE entity); void remove(T id); void update(TE entity); } Definicja interfejsu ReadOnlyRepository zawiera metody get i getAll, które zwracaj(cid:200) warto(cid:258)ci logiczne, encj(cid:218) i kolekcj(cid:218) encji. Ma to sens, gdy chcesz udost(cid:218)pni(cid:202) jedynie mechanizmy tylko do odczytu: public interface ReadOnlyRepository TE, T { boolean contains(T id); Entity get(T id); Collection TE getAll(); } Framework Spring pozwala na zastosowanie adnotacji @Repository do wskazywania klasy ziarna, która pe(cid:239)ni funkcj(cid:218) repozytorium. W przypadku klasy RestaurantRepository stosujemy map(cid:218) (s(cid:239)ownik), która zosta(cid:239)a u(cid:285)yta w miejscu bazy danych. W ten sposób wszystkie encje s(cid:200) przechowywane w pami(cid:218)ci. W zwi(cid:200)zku z tym po uruchomieniu us(cid:239)ugi w pami(cid:218)ci b(cid:218)d(cid:200) tylko dwie restauracje. Mo(cid:285)emy skorzysta(cid:202) z technologii JPA jako metody utrwalania danych w bazie danych. Tak na ogó(cid:239) post(cid:218)puje si(cid:218) w aplikacjach produkcyjnych: @Repository( restaurantRepository ) public class InMemRestaurantRepository implements RestaurantRepository Restaurant, (cid:180)String { private Map String, Restaurant entities; public InMemRestaurantRepository() { entities = new HashMap(); Restaurant restaurant = new Restaurant( Restauracja z burgerami , 1 , null); entities.put( 1 , restaurant); restaurant = new Restaurant( Restauracja burgerowa , 2 , null); entities.put( 2 , restaurant); } @Override public boolean containsName(String name) { 83 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta try { return this.findByName(name).size() 0; } catch (Exception ex) { //Obs(cid:225)uga wyj(cid:261)tków } return false; } @Override public void add(Restaurant entity) { entities.put(entity.getId(), entity); } @Override public void remove(String id) { if (entities.containsKey(id)) { entities.remove(id); } } @Override public void update(Restaurant entity) { if (entities.containsKey(entity.getId())) { entities.put(entity.getId(), entity); } } @Override public Collection Restaurant findByName(String name) throws Exception { Collection Restaurant restaurants = new ArrayList(); int noOfChars = name.length(); entities.forEach((k, v) - { if (v.getName().toLowerCase().contains(name.subSequence(0, noOfChars))) { restaurants.add(v); } }); return restaurants; } @Override public boolean contains(String id) { throw new UnsupportedOperationException( Metoda nie zosta(cid:239)a (cid:180)zaimplementowana ); // Aby zmieni(cid:252) tre(cid:286)(cid:252) generowanych metod, wybierz opcj(cid:266) Tools/Templates. } @Override public Entity get(String id) { return entities.get(id); } @Override public Collection Restaurant getAll() { return entities.values(); } } 84 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) Klasy encji Encja Restaurant, która dziedziczy po klasie BaseEntity, ma nast(cid:218)puj(cid:200)c(cid:200) definicj(cid:218): public class Restaurant extends BaseEntity String { private List Table tables = new ArrayList (); public Restaurant(String name, String id, List Table tables) { super(id, name); this.tables = tables; } public void setTables(List Table tables) { this.tables = tables; } public List Table getTables() { return tables; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(String.format( id: {}, nazwa: {}, liczba miejsc: {} , (cid:180)this.getId(), this.getName(), this.getCapacity())); return sb.toString(); } } Skoro w definicjach klas korzystamy z klas POJO, nie musimy tworzy(cid:202) wielu obiektów warto(cid:258)ci. Trzeba tylko pami(cid:218)ta(cid:202), aby nie modyfikowa(cid:202) stanu encji. Encja Table dziedziczy po encji BaseEntity: public class Table extends BaseEntity BigInteger { private int capacity; public Table(String name, BigInteger id, int capacity) { super(id, name); this.capacity = capacity; } public void setCapacity(int capacity) { this.capacity = capacity; } public int getCapacity() { return capacity; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(String.format( id: {}, nazwa: {} , this.getId(),this.getName())); sb.append(String.format( Stoliki: {} + Arrays.asList(this.getTables()))); return sb.toString(); } } 85 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta Tre(cid:258)(cid:202) klasy abstrakcyjnej Entity jest przedstawiona poni(cid:285)ej: public abstract class Entity T { T id; String name; public T getId() { return id; } public void setId(T id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } Klasa abstrakcyjna BaseEntity jest zdefiniowana w poni(cid:285)szy sposób. Dziedziczy ona po klasie Entity: public abstract class BaseEntity T extends Entity T { private T id; private boolean isModified; private String name; public BaseEntity(T id, String name) { this.id = id; this.name = name; } public T getId() { return id; } public void setId(T id) { this.id = id; } public boolean isIsModified() { return isModified; } public void setIsModified(boolean isModified) { this.isModified = isModified; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 86 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) Us(cid:239)ugi u(cid:285)ytkowników i rezerwacji Implementacja RestaurantService stanowi podstaw(cid:218) do dalszej pracy nad implementacj(cid:200) us(cid:239)ug Booking i User. Us(cid:239)uga User mo(cid:285)e udost(cid:218)pnia(cid:202) ko(cid:241)cówk(cid:218) zwi(cid:200)zan(cid:200) z operacjami typu CRUD dla u(cid:285)ytkowników, za(cid:258) us(cid:239)uga Booking, poza operacjami typu CRUD, mo(cid:285)e weryfikowa(cid:202) do- st(cid:218)pno(cid:258)(cid:202) stolików. Ca(cid:239)y kod (cid:283)ród(cid:239)owy znajdziesz na serwerze FTP wydawnictwa Helion. Rejestracja i wykrywanie us(cid:239)ug (us(cid:239)uga Eureka) Framework Spring Cloud oferuje wzorcowe wsparcie dla us(cid:239)ugi Netflix Eureka, rejestru us(cid:239)ug i narz(cid:218)dzia do ich wykrywania. Wszystkie us(cid:239)ugi, które uruchamiasz, s(cid:200) do(cid:239)(cid:200)czane do us(cid:239)ugi Eureka i mog(cid:200) by(cid:202) przez ni(cid:200) wykrywane. Dokonuje si(cid:218) to dzi(cid:218)ki konfiguracji klienta us(cid:239)ugi Eureka w projekcie us(cid:239)ugi. Najpierw musimy doda(cid:202) zale(cid:285)no(cid:258)(cid:202) frameworka Spring Cloud w pliku pom.xml i klas(cid:218) startow(cid:200) wraz z adnotacj(cid:200) @EnableEurekaApplication: Zale(cid:285)no(cid:258)(cid:202) Mavena: dependency groupId org.springframework.cloud /groupId artifactId spring-cloud-starter-eureka-server /artifactId /dependency Klasa startowa: Klasa startowa App wywo(cid:239)a automatycznie us(cid:239)ug(cid:218) Eureka tylko i wy(cid:239)(cid:200)cznie dzi(cid:218)ki adnotacji @EnableEurekaApplication: package com.packtpub.mmj.eureka.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server. EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } Mo(cid:285)esz te(cid:285) skorzysta(cid:202) ze znacznika start-class com.packtpub.mmj.eureka.service.App / (cid:180)start-class w znaczniku properties w pliku pom.xml. 87 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta Konfiguracja Spring: Us(cid:239)uga Eureka wymaga dodania niezb(cid:218)dnej konfiguracji serwerowej do pliku src/main/resources/ application.yml: server: port: ${vcap.application.port:8761} # port HTTP eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false server: waitTimeInMsWhenSyncEmpty: 0 Ka(cid:285)da z us(cid:239)ug systemu OTRS powinna zawiera(cid:202) konfiguracj(cid:218) klienta Eureka, dzi(cid:218)ki czemu mo(cid:285)na nawi(cid:200)za(cid:202) po(cid:239)(cid:200)czenie pomi(cid:218)dzy klientem a serwerem Eureka. Bez tego nie b(cid:218)d(cid:200) mo(cid:285)- liwe wykrywanie i rejestracja us(cid:239)ug. Klient Eureka: wszystkie Twoje us(cid:239)ugi powinny zawiera(cid:202) nast(cid:218)puj(cid:200)c(cid:200) sekcj(cid:218) konfiguracyjn(cid:200): eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ Wykonanie Aby sprawdzi(cid:202) nasz kod w praktyce, musisz go najpierw zbudowa(cid:202). W tym celu wykonamy polecenie clean package dost(cid:218)pne w Mavenie, co doprowadzi do zbudowania archiwum. Aby uruchomi(cid:202) archiwum z us(cid:239)ug(cid:200), wykonaj poni(cid:285)sze polecenie: java -jar target/ plik_uslugi_jar Na przyk(cid:239)ad: java -jar target/restaurant-service.jar java -jar target/eureka-service.jar Testowanie Aby móc korzysta(cid:202) z testów jednostkowych, dodaj poni(cid:285)sz(cid:200) zale(cid:285)no(cid:258)(cid:202) do pliku pom.xml: dependency groupId org.springframework.boot /groupId artifactId spring-boot-starter-test /artifactId /dependency 88 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) Przetestowanie klasy RestaurantController wymaga dodania nast(cid:218)puj(cid:200)cych plików: (cid:81) Klasa RestaurantControllerIntegrationTests, która wykorzystuje adnotacj(cid:218) @SpringApplicationConfiguration, aby zastosowa(cid:202) t(cid:218) sam(cid:200) konfiguracj(cid:218), co Spring Boot: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = RestaurantApp.class) public class RestaurantControllerIntegrationTests extends (cid:180)AbstractRestaurantControllerTests { } (cid:81) Abstrakcyjna klasa, w której napiszemy nasze testy: public abstract class AbstractRestaurantControllerTests { protected static final String RESTAURANT = 1 ; protected static final String RESTAURANT_NAME = Restauracja Test ; @Autowired RestaurantController restaurantController; @Test public void validResturantById() { Logger.getGlobal().info( Start testu validResturantById ); ResponseEntity Entity restaurant = restaurantController.findById(RESTAURANT); Assert.assertEquals(HttpStatus.OK, restaurant.getStatusCode()); Assert.assertTrue(restaurant.hasBody()); Assert.assertNotNull(restaurant.getBody()); Assert.assertEquals(RESTAURANT, restaurant.getBody().getId()); Assert.assertEquals(RESTAURANT_NAME, restaurant.getBody().getName()); Logger.getGlobal().info( Koniec testu validResturantById ); } @Test public void validResturantByName() { Logger.getGlobal().info( Start testu validResturantByName ); ResponseEntity Collection Restaurant restaurants =restaurantController. (cid:180)findByName(RESTAURANT_NAME); Logger.getGlobal().info( Wewn(cid:200)trz testu validAccount ); Assert.assertEquals(HttpStatus.OK, restaurants.getStatusCode()); Assert.assertTrue(restaurants.hasBody()); Assert.assertNotNull(restaurants.getBody()); Assert.assertFalse(restaurants.getBody().isEmpty()); Restaurant restaurant = (Restaurant) restaurants.getBody().toArray()[0]; Assert.assertEquals(RESTAURANT, restaurant.getId()); Assert.assertEquals(RESTAURANT_NAME, restaurant.getName()); Logger.getGlobal().info( Koniec testu validResturantByName ); } @Test public void validAdd() { Logger.getGlobal().info( Start testu validAdd ); RestaurantVO restaurant = new RestaurantVO(); restaurant.setId( 999 ); restaurant.setName( Test Restaurant ); ResponseEntity Restaurant restaurants = restaurantController.add(restaurant); Assert.assertEquals(HttpStatus.CREATED, restaurants.getStatusCode()); Logger.getGlobal().info( Koniec testu validAdd ); } } 89 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta (cid:81) Na zako(cid:241)czenie tworzymy klas(cid:218) RestaurantControllerTests, która dziedziczy po utworzonej przed chwil(cid:200) abstrakcyjnej klasie, a tak(cid:285)e tworzy obiekty typów RestaurantService i RestaurantRepository: public class RestaurantControllerTests extends AbstractRestaurantControllerTests { protected static final Restaurant restaurantStaticInstance = new (cid:180)Restaurant(RESTAURANT, RESTAURANT_NAME, null); protected static class TestRestaurantRepository implements (cid:180)RestaurantRepository Restaurant, String { private Map String, Restaurant entities; public TestRestaurantRepository() { entities = new HashMap(); Restaurant restaurant = new Restaurant( Restauracja Test , 1 , null); entities.put( 1 , restaurant); restaurant = new Restaurant( Test restauracja , 2 , null); entities.put( 2 , restaurant); } @Override public boolean containsName(String name) { try { return this.findByName(name).size() 0; } catch (Exception ex) { // Obs(cid:225)uga wyj(cid:261)tku } return false; } @Override public void add(Restaurant entity) { entities.put(entity.getId(), entity); } @Override public void remove(String id) { if (entities.containsKey(id)) { entities.remove(id); } } @Override public void update(Restaurant entity) { if (entities.containsKey(entity.getId())) { entities.put(entity.getId(), entity); } } @Override public Collection Restaurant findByName(String name) throws Exception { Collection Restaurant restaurants = new ArrayList(); int noOfChars = name.length(); entities.forEach((k, v) - { if (v.getName().toLowerCase().contains(name.subSequence(0, (cid:180)noOfChars))) { restaurants.add(v); } }); 90 Poleć książkęKup książkę Rozdzia(cid:225) 4. • Implementujemy mikrous(cid:225)ug(cid:266) return restaurants; } @Override public boolean contains(String id) { throw new UnsupportedOperationException( Metoda nie zosta(cid:239)a (cid:180)zaimplementowana. ); // Aby zmieni(cid:252) tre(cid:286)(cid:252) generowanych metod, wybierz opcj(cid:266) Tools/Templates. } @Override public Entity get(String id) { return entities.get(id); } @Override public Collection Restaurant getAll() { return entities.values(); } } protected TestRestaurantRepository testRestaurantRepository =new (cid:180)TestRestaurantRepository(); protected RestaurantService restaurantService = new (cid:180)RestaurantServiceImpl(testRestaurantRepository); @Before public void setup() { restaurantController = new RestaurantController(restaurantService); } } (cid:189)ród(cid:239)a (cid:81) Bhakti Mehta, REST. Najlepsze praktyki i wzorce w j(cid:218)zyku Java, Helion, Gliwice 2015 (cid:81) Spring Cloud: http://cloud.spring.io (cid:81) Netflix Eureka: https://github.com/netflix/eureka Podsumowanie W tym rozdziale zapozna(cid:239)e(cid:258) si(cid:218) z praktycznym zastosowaniem projektu sterowanego modelem dziedziny w implementacji mikrous(cid:239)ugi. Po uruchomieniu demonstracyjnej aplikacji wiesz ju(cid:285), jak tworzy(cid:202), wdra(cid:285)a(cid:202) i testowa(cid:202) mikrous(cid:239)ugi niezale(cid:285)nie. Z pewno(cid:258)ci(cid:200) jeste(cid:258) w stanie tworzy(cid:202) mikrous(cid:239)ugi za pomoc(cid:200) Spring Cloud. Dowiedzia(cid:239)e(cid:258) si(cid:218) tak(cid:285)e, jak zastosowa(cid:202) us(cid:239)ug(cid:218) Eureka, aby rejestrowa(cid:202) i wykrywa(cid:202) mikrous(cid:239)ugi dzi(cid:218)ki technologii Spring Cloud. W nast(cid:218)pnym rozdziale dowiesz si(cid:218), jak wdra(cid:285)a(cid:202) mikrous(cid:239)ugi w kontenerach, takich jak Docker. Nauczysz si(cid:218) tak(cid:285)e testowa(cid:202) mikrous(cid:239)ugi za pomoc(cid:200) klientów typu REST pisanych w Javie i innych narz(cid:218)dzi. 91 Poleć książkęKup książkę Mikrous(cid:225)ugi w Javie. Poradnik eksperta 92 Poleć książkęKup książkę Skorowidz Apache Mesos, 198 API, 20 brama, Patrz: brama API matematyczne, 34 wersja, 80 API gateway, Patrz: brama API aplikacja agentowa, 126 agentowe, 127 implementacja, 185 jednostronicowa, 154, 155 monolityczna, Patrz: architektura monolityczna natywna, 126, 127 produkcyjna, 83 publiczna, 127 webowa, 126 strona domowa, 155 Archaius, 197 architektura bezkontenerowa, 30 mikrous(cid:239)ug, 17, 93, 186, 187, 191, 207 monolityczna, 17, 18, 21, 186, 188, 207 kod, 23 metodyka zwinna, 22 skalowalno(cid:258)(cid:202), 20 wdra(cid:285)anie, 21, 22 z us(cid:239)ugami, 18 wielowarstwowa, 54 zorientowana na us(cid:239)ugi, Patrz: SOA artefakt, 25, 55 atak brute force, 129 Atlas, 195 A adnotacja @ComponentScan, 39 @Configuration, 38 @Controller, 35, 79 @EnableAutoConfiguration, 38 @EnableCircuitBreaker, 101 @EnableDiscoveryClient, 98 @EnableEurekaApplication, 87 @EnableWebMvc, 38 @EnableZuulProxy, 98 @HystrixCommand, 101 @PathVariable, 36 @Repository, 83 @RequestMapping, 35 @RequestParam, 36 @ResponseBody, 35, 79 @RestController, 35 @SpringBootApplication, 38 agregat, 58, 59 Amazon, 17, 51 Amazon Machine Image, 193 Amazon Web Services, 193 AMI, 193 Aminator, 194 AMQP, 103 AngularJS, 150, 151, 152 dyrektywa, 154 zakres, 153 Ant, 30 Apache Cassandra, 93 Poleć książkęKup książkę Skorowidz autoryzacja, 119, 120 AWS, 193 B baza danych, 18, 60, 76, 78, 191, 203 wspó(cid:239)dzielenie, 192 zarz(cid:200)dzanie, Patrz: MDM biblioteka, 55 Angular, 151 Netflix Spectator, 195 boot2docker, 27 Bower, 177 brama API, 19 C Camel, 192 certyfikat, 119, 120 classpath, Patrz: (cid:258)cie(cid:285)ka klas Cloud Foundtry, 194 Cockcroft Adrian, 16, 190 CRUD, 76, 81 D DDD, 51, 52, 53, 57, 68, 75, 188 destylacja, 63, 68 Docker, 25, 26, 106, 202 architektura, 27 daemon, 27 dziennik, 202 dziennik obrazu, 115 klient, 27 kontener, 28 zale(cid:285)ny, 114 zarz(cid:200)dzanie, Patrz: Docker Compose (cid:239)(cid:200)czenie z Mavenem, 107, 108, 110, 113 mened(cid:285)er kontenerów, Patrz: Docker Compose obraz, 28, 113, 114 rejestr lokalny, 114 uruchamianie, 27 Docker Compose, 113, 115 dziennik, 202 Docker Hub, 27 Docker Toolbox, 106 DOM, 151 Domain-Driven Design, Patrz: DDD dostawca, 152 212 drzewo dokumentu, Patrz: DOM dyrektywa links, 114 dziennik logów, 201 E eBay, 17 Edda, 196, 197 Elasticsearch, 203, 204 encja, 55, 56, 57, 76, 77, 83, 124 implementacja, 69 kolekcja, 83 korze(cid:241), Patrz: korze(cid:241) przechowywanie w pami(cid:218)ci, 83 Enterprise Service Bus, Patrz: ESB ESB, 16 Etsy, 20 Eureka, Patrz: Netflix Eureka Evans Eric, 52 fabryka, 61 FeignClient, 95 Fenzo, 198 FIDO, 191, 198, 199 Fielding Roy, 35 filtr, 153, 166 format jar, 31 JSON, 78 formularz, 171 wyszukiwania, 167 funkcja Math.pow, 35 Math.sqrt, 35 F G Gancarz Mike, 16, 187 Google Computer Engine, 194 Gradle, 30, 47 grant danych uwierzytelniaj(cid:200)cych klienta, 130, 137 has(cid:239)a w(cid:239)a(cid:258)ciciela zasobu, 130, 135, 136, 146 kodu autoryzacji, 130, 142 niejawny, 130, 134, 145 uprawnie(cid:241) klienckich, 146 Groupon, 17 Poleć książkęKup książkę H histogram czasu odpowiedzi, 190 historyjka u(cid:285)ytkownika, 22 HTTP, 117, 194 nag(cid:239)ówek, 80 HTTPS, 118 Hudson, 65 Hystrix, Patrz: Netflix Hystrix Hystrix Dashboard, 94 I Ice, 198 identyfikator, 56 integracja ci(cid:200)g(cid:239)a, 63, 64, 65 Interface Segregation Principle, Patrz: ISP interfejs cname, 26 DiscoveryEnabledNIWSServerList, 95 IPing, 95 j(cid:200)dra systemu operacyjnego, 26 u(cid:285)ytkownika, 20, 23, 27, 54 invariant, Patrz: niezmiennik ISP, 69 J j(cid:200)dro wspó(cid:239)dzielone, 63, 66 Jenkins, 24, 188 Jenkins CI, 65 j(cid:218)zyk modelowania zunifikowany, Patrz: UML K Kibana, 204, 206 klasa BaseEntity, 85 DiscoveryClient, 95 Entity, 86 POJO, 85 resource, 35 startowa, 87 (cid:258)cie(cid:285)ka, Patrz: (cid:258)cie(cid:285)ka klas klient identyfikator, 128 poufny, 125 profil, 126 Skorowidz publiczny, 125 uwierzytelnienie, 128 klucz, 33 dost(cid:218)powy, 125 g(cid:239)ówny, 56 magazyn, Patrz: magazyn kluczy obcego, 59 kod scalanie, 65 testowanie, 65 kolejka komunikatów, 103 kontekst, 64 mapa, Patrz: mapa kontekstu ograniczenie, 63, 64 kontener, 25, 106 Docker, Patrz: Docker intermodalny, 25 oprogramowania, 25 zale(cid:285)ny, 114 kontroler, 150, 153, 164, 165 REST, 35 ko(cid:241)cówka, 78, 129, 159 autoryzacji, 129 prefiks v1, 80 przekierowania, 129 tokena, 129 wywo(cid:239)anie, 207 korze(cid:241), 59 L latencja, 190 logika aplikacji, 18, 55, 150 biznesowa, 18, 55, 150 logowanie, 120, 122, 169, 170, 191 rejestrowanie zdarze(cid:241), 191 Logstash, 203, 205 Long Josh, 31 M magazyn kluczy, 33, 119 magistrala us(cid:239)ug korporacyjna, Patrz: ESB ma(cid:239)pa Chaos, 196 Conformity, 196 Janitor, 196 Security, 196 213 Poleć książkęKup książkę Skorowidz mapa kontekstu, 63, 65 Master Data Management, Patrz: MDM maszyna wirtualna, Patrz: VM Javy, Patrz: JVM Maven, 29, 30, 33, 39, 47, 87, 88, 103, 105, 107, 108, 110, 113 metoda awaryjna, 102 config, 152 fabryka, 153 get, 83 GET, 78 getAll, 83 getLocalServiceInstance, 95 main, 34, 151 POST, 78 run, 152 sqrt, 37 sta(cid:239)a, 152 us(cid:239)uga, 153 warto(cid:258)(cid:202), 152 middleware, Patrz: oprogramowanie po(cid:258)rednicz(cid:200)ce mikrous(cid:239)uga, 16, 17, 18, 20, 187, Patrz te(cid:285): us(cid:239)uga debugowanie, 207 granice transakcji, 192 monitorowanie, 190, 191 w czasie rzeczywistym, 191 skalowanie, 20, Patrz te(cid:285): skalowanie testowanie, 22, 23, 24 tworzenie, 24, 75, 76, 193 wdra(cid:285)anie, 21, 22, 23, 24, 93 Docker, 25, 28 wielko(cid:258)(cid:202), 187 zale(cid:285)no(cid:258)(cid:202) cykliczna, 207, 208 model, 150 dziedziny, 52, 57, 69, 78 implementacja, 52 integralno(cid:258)(cid:202), 63 korporacyjny, 63 refaktoring, 64 widoku, 150 modu(cid:239), 63, 151 MVC, 150 MVVM, 150 214 N nanous(cid:239)uga, 187 NetBeans, 45, 46, 47 NetBeans IDE, 29 Netflix, 23, 93 Netflix Atlas, 191, 195 Netflix Edda, 196, 197 Netflix Eureka, 76, 87, 88, 94, 194 Netflix Hystrix, 94, 101, 102, 103, 194 Netflix Nebula, 193 Netflix OSS, 193 Netflix Ribbon, 94, 95, 194 Netflix Spectator, 195 Netflix Turbine, 94, 103, 105 niezmiennik, 59 Node.js, 172, 177 npm, 172, 177 O OAuth, 120 grant autoryzacji, Patrz: grant implementacja, 138 ko(cid:241)cówka, 129 specyfikacja, 122 wersja, 121 zastosowania, 121 obiekt cykl (cid:285)ycia, 58, 60 dziedziny, 60, 79 kolekcja, 59 repozytorium, 78 separacja, 63 specjalizowany, 152 us(cid:239)ug, 57 usuwanie, 59 warto(cid:258)ci, 56, 57, 77 Object-Oriented Programming, Patrz: OOP obs(cid:239)uga b(cid:239)(cid:218)dów, 102 ograniczenie, 59 OOP, 57 Open Source Software Center, Patrz: OSS oprogramowanie po(cid:258)rednicz(cid:200)ce, 16 OSS, 93 Poleć książkęKup książkę P plik app.js, 159, 167 application.yml, 95, 98, 107 index.html, 151, 156 JAR, 33, 34 pom.xml, 25, 31, 87, 88, 108 podmodel, 63 POJO, 34, 85 polecenie clean package, 88 logs, 202 mvn clean, 40 Postman, 40 Postman Chrome, 40 potokowanie, 203 programowanie sterowane testami, Patrz: TDD zorientowane obiektowo, Patrz: OOP projektowanie sterowane modelem dziedziny, Patrz: DDD protokó(cid:239) SSL, Patrz: SSL AMQP, Patrz: AMQP HTTP, 34, Patrz: HTTP Secure Socket Layer, Patrz: SSL SOAP, Patrz: SOAP SSL, 33 TCP, 194 TLS, Patrz: TLS Transport Layer Security, Patrz: TLS UDP, 194 przestrze(cid:241) nazw, 26 Pujals Tony, 17 Quora, 120 logowanie, 122, 125 Q R RabbitMQ, 103 regu(cid:239)a segregacji interfejsów, Patrz: ISP rejestr us(cid:239)ug, 76, 87 repozytorium, 60, 78 artifacts, 25 implementacja, 70 Skorowidz REST, 35, Patrz te(cid:285): us(cid:239)uga REST RestTemplate, 95 Ribbon, Patrz: Netflix Ribbon równowa(cid:285)enie obci(cid:200)(cid:285)enia, 94, 95 po stronie klienta, 95 po stronie serwera, 98 S Scumblr, 191, 198 Security Monkey, 191, 198, Patrz te(cid:285): ma(cid:239)pa Service-Oriented Architecture, Patrz: SOA serwer Apache Tomcat, 30, 33 autoryzacji, 124, 125, 128, 129 Eureka, 95 graniczny, 98, 99, 159, 195 Jetty, 30, 33 po(cid:258)rednicz(cid:200)cy, 98, 195 proxy, Patrz: serwer po(cid:258)rednicz(cid:200)cy wirtualizowany, 106 zasobów, 124 Simian Army, 195 skalowanie dwuwymiarowe, 20 jednowymiarowe, 20 platformowe, 20 produktu, 20 sniffer, 117 SOA, 16, 187 SOAP, 16 SPA, 154, 155 Spinnaker, 193, 194 Spring, 83 Spring Boot, 29, 30 konfiguracja, 30 wersja, 31 klient, 95 Spring Cloud Ribbon, 95 Spring Initializer, 30 Spring Security, 138 SSL, 118, 119 stos ELK, 202 Elasticsearch, 203, 204 Kibana, 204, 206 konfiguracja, 204 Logstash, 203, 205 system plików, 60 Spring Cloud, 77, 87, 94, 98, 193 215 Poleć książkęKup książkę V Value Object, Patrz: obiekt warto(cid:258)ci Vector, 197 VirtualBox, 27, 106 VM, 25 VO, Patrz: obiekt warto(cid:258)ci W warstwa aplikacji, 54, 55, 58 biznesowa, 58 DAO, 18 dziedziny, 54, 55, 58 infrastruktury, 54, 55 ograniczaj(cid:200)ca przek(cid:239)amania, 63, 67 prezentacji, 18, 54, 150 widok, 150 wstrzykiwanie zale(cid:285)no(cid:258)ci, 152 wy(cid:239)(cid:200)cznik automatyczny, 101 wyra(cid:285)enie regularne, 37 wzorzec fabryki, 62 fasady, 67 klient-dostawca, 63, 66 konformisty, 63, 67 projektowy MVC, Patrz: MVC MVVM, Patrz: MVVM wstrzykiwania zale(cid:285)no(cid:258)ci, 152 Wy(cid:239)(cid:200)cznik Automatyczny, 101 Z Zuul Server, 94, 98, 119, 195 zwi(cid:200)zek, 59 (cid:191) (cid:285)(cid:200)danie GET, 34, 35 Skorowidz (cid:258)cie(cid:285)ka klas, 33 niezale(cid:285)na, 63, 67 URI, 36 (cid:165) T TeamCity, 24, 65, 188 technologia AngularJS, Patrz: AngularJS Apache Cassandra, Patrz: Apache Cassandra JPA, Patrz: JPA Node.js, Patrz: Node.js test end-to-end, 151, 189, 190 integracyjny, 111, 189 jednostkowy, 88, 151, 190 TLS, 118, 129 token, 124 dost(cid:218)powy, 124, 129, 131 ko(cid:241)cówka, Patrz: ko(cid:241)cówka tokena od(cid:258)wie(cid:285)enia, 124 uwierzytelniania, 131 trasowanie, 154 U UI, Patrz: interfejs u(cid:285)ytkownika UI-Router, 154 UML, 53, 65 Unified Model Language, Patrz: UML us(cid:239)uga, 77, Patrz te(cid:285): mikrous(cid:239)uga $injector, 152 $log, 152 Docker Hub, 113 dzia(cid:239)aj(cid:200)ca transakcyjnie, 192 implementacja, 72 Monkey, Patrz: ma(cid:239)pa otwartego hosta, 63, 68 rejestr, Patrz: rejestr us(cid:239)ug REST, 21, 30, 34, 55, 78, 189 ko(cid:241)cówka, Patrz: ko(cid:241)cówka testowanie, 30 tworzenie, 58, 68, 161 uwierzytelnienie, 119, 120, 169 u(cid:285)ytkownik ko(cid:241)cowy, 124 216 Poleć książkęKup książkę
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Mikrousługi w Javie. Poradnik eksperta
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: