Wyklad 3

Architektura mikroserwisowa backendu

Architektura - Big Picture

Maven

Maven

  • Cel - Automatyzacja i standaryzacja procesu budowania
  • Umożliwia opis procesu budowania oprogramowania
  • Pozwala na zdefiniowanie zależności oraz zarządzanie nimi
  • Podział na centralne repozytorium artefaktów - search.maven.org
  • oraz lokalnie dostępne repozytorium deweloperskie

Struktura projektu - convention over configuration

Konfiguracja projektu - POM (Project Object Model)

Maven build lifecycle

  • Zadania wykonywane kaskadowo - wykonanie konkretnego kroku powoduje również wykonanie wszystkich poprzedzających
  • mvn compile
  • Deweloper najczęściej używa mvn clean install
  • Poszczególne pluginy korzystają ze zdefiniownaych faz w celu wykonania własnej akcji, np. mvn surefire:test

Zarządzanie zależnościami - dependency management

  • Każda biblioteka posiada unikalny identyfikator - groupId, artifactId, version
  • Plik pom.xml zawiera sekcję dependencyManagement z listą zależności
  • Zależności są aktualizowane w procesie budowania
  • Centralne repozytorium artefaktów - search.maven.org
  • Lokalne repozytorium - lokalizacja definiowana dla użytkownika

Spring Framework (DI / AOP)

Spring Framework

  • Powstał w 2003 roku
  • Szkielet tworzenia aplikacji dla języka Java
  • Alternatywa dla programowania w EJB
  • Oferuje dużą swobodę wytwarzania oprogramowania
  • Bardzo dobra dokumentacja
  • Gotowa implementacja wielu zagadnień
  • Ogromne wsparcie dla Java EE
  • Propaguje poprawny styl programowania
  • Jest dostępny na zasadach open source

Spring Framework - moduły

  • Składa się z kilku niezależnych od siebie modułów
  • Moduły można ze sobą łączyć w celu uzyskania większej funkcjonalności

Spring Framework – podstawowy kontener

  • Core
    • podstawowa część frameworka, zawiera IoC i wstrzykiwanie zależności
  • Beans
    • eliminuje potrzebę programowego tworzenia singletonów
    • oddziela zależność pomiędzy konfiguracją, specyfikacją a logiką programu

Spring Framework – podstawowy kontener

  • Context
    • umożliwia dostęp do obiektów zarządzanych przez framework
    • pozwala na wydzielenie konfiguracji do plików *.properties
    • udostępnia interface ApplicationContext
  • EL - Spring Expression Language

@Value("#{applicationProperties['jakas.zmienna.z.pliku.properties']}")
private String zmienna;
					

Inversion of Control, Dependency Injection

  • Paradygmat programowania, wzorzec projektowy, wzorzec architektoniczny.
  • Zastosowanie
    • w pojedynczych komponentach,
    • w architekturze całego systemu (Spring Framework)
  • W klasycznym podejściu obiekty są budowane statycznie, brak wpływu na ich postać.
  • Odwracamy kontrolę – budowaniem obiektów zajmuje się framework

Słyszałem / wygooglowałem że Spring to głównie konfiguracje XMLowe

  • Tak było kiedyś, teraz większość podstawowych konstrukcji może bez problemu być konfigurować za pomocą adnotacji
  • Konfiguracje poprzez XML cały czas działają

Ale adnotacje w tej prezentacji nie są Interfejsami tylko Springowymi, ale też należącymi do JPA i Hibernate.

Inversion of Control, Dependency Injection

Wstrzykiwanie zależności – dla danego obiektu definiujemy, z jakich innych komponentów będzie korzystał, ale nie musimy się martwić o tworzenie instancji tych obiektów – zrobi to za nas framework, wykorzystywane w Springu.

@Service
public class CustomerServiceImpl {

	private final CustomerMapper customerMapper;
	private final CustomerDao customerDao;
	
	@Autowired
	public CustomerServiceImpl (CustomerMapper mapper, CustomerDao dao) {
		this.customerMapper = mapper;
		this.customerDao = dao;
	}
					

Jak zacząć ze springiem?

  1. Podłączyć jary sciągnięte z internetu
  2. W internecie poszukać dependency do POMa i podłączyć

  3. Sciągnąć kompletny STS (Spring Tool Suite)

  4. start.spring.io

Spring framework - podstawy


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
public class BooksServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(BooksServerApplication.class, args);
	}
}
					

Spring framework - adnotacje

  • @Component - podstawowa adnotacja, określa że klasa jest zarządzana przez Spring
  • @Service - określa klasę zawierającą logikę biznesową
  • @Repository - klasy DAO (Data Access Object), bezpośrednia komunikacja z DB

Wszystkie działają i robią to samo

Wyjątkiem jest @Repository, która dodatkowo konwertuje wyjątki dostawców bazy danych

Adnotacje pozwalają oddzielić od siebie różne warstwy aplikacji

Ułatwiają czytanie i analizowanie kodu

Spring framework - adnotacje

  • @Controller - przetwarza żądania HTTP
  • @Scope - umożliwia zmianę domyślnego czasu życia bean’a
  • @PostConstruct - umożliwia wywołanie części kodu zaraz po utworzeniu obiektu
  • @RequestMapping - używana w kontrolerze, mapuje adres URL na metodę

Adnotacje - przykład


@RequestMapping("/services")
@RestController
public class BooksRestService {

    private final BookService bookService;

    @Autowired
    public BooksRestService(BookService bookService) {
        this.bookService = bookService;
    }

    @RequestMapping(path = "/books", method = RequestMethod.GET)
    public List<BookTo> findBooks(BookSearchCriteria bookSearchCriteria) {
        return bookService.findBooks(bookSearchCriteria);
    }
}
					

Spring MVC / REST

Spring MVC

RESTful Services

REST - REpresentation State Transfer. Roy Fielding 2000.

REST to nie jest architektura, tylko pewien zespół ograniczeń, który jeśli jest zastosowany do architektury to nadaje konkretne role danym, komponentom, hyperlinkom, ...

RESTful Services

Wymagania stawiane przez definicję REST:
  1. system klient - server
  2. system bezstanowy
  3. system udostępniający cache*
  4. system jednolicie dostępny*
  5. system wielowarstwowy

RESTful - spełniający wszystkie punkty powyższych założeń.

W świecie aplikacji internetowych definicja przekłada się na następujących kilka elementów:
  • Dane przesyłane między klientem a serwerem są pewną reprezentacją bytów biznesowych: XML, JSON
  • Dane przemieszczają się do konkretnego adresata URI (Uniform Resource Identifier)
  • Dane dodatkowo posiadają pewien kwalifikator akcji, mający odpowiednik w świecie protokołu HTTP
Akcja Metoda HTTP
CREATE POST
RETRIEVE GET
UPDATE PUT
DELETE DELETE

RESTful API


@RequestMapping(path = "/cars", method = RequestMethod.GET)
public List<CarTo> findAllCars() { ... }

@RequestMapping(path = "/car", method = RequestMethod.POST)
public CarTo addCar(@RequestBody CarTo car) { ... }

@RequestMapping(path = "/car", method = RequestMethod.PUT)
public CarTo updateCar(@RequestBody CarTo car) { ... }

@RequestMapping(path = "/car/{id}", method = RequestMethod.DELETE)
public boolean deleteCar(@PathVariable("id") Long id) { ... }
					

Spring Boot

Dlaczego Spring Boot?

+ Konfiguracja = Aplikacja startowa

Spring Boot

  • Convention over configuration
  • Przy zerowej konfiguracji działająca aplikacja
  • Prekonfiguracja możliwa dzięki adnotacjom @Conditional...
  • Generator projektu - start.spring.io

Spring boot / Startery

  • Zestawy zależności udostępniające prekonfigurowane funkcje Springa
  • Np. dla aplikacji bazodanowej:
    spring-boot-starter-data-jpa
  • Lista starterów -> spring-boot-starters
  • Jak użyc? -> pom.xml
  •     <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
        </dependency>

Deployment aplikacji Spring Boot

  • Embedded Server
    1. Przy użyciu np. startera
      spring-boot-starter-web
      jar wynikowy (mvn clean install) zawiera jary Tomcata
    2. Start klasy aplikacji uruchamia wbudowanego Tomcata (możliwe jest również użycie Jetty)
  • Klasyczny serwer J2EE lub zewnętrzny Tomcat
  • Zmiana pliku docelowego na war, niewielkie zmiany w pom.xml

?

Questions