60
Lecture 11 Application Architecture

L11 Application Architecture

Embed Size (px)

DESCRIPTION

Now that we have looked several design patterns, from the databases to web presentation, we are now ready to look at the application as a whole. In this lecture we examine the considerations we face when creating an application architecture and we look at each of the three layers. The lecture presents one way of designing enterprise applications. The goal is to create scalable services. We also look at the Play framework in more detail and look at REST.

Citation preview

Page 1: L11 Application Architecture

Lecture 11Application Architecture

Page 2: L11 Application Architecture

Reading Fowler 2, 3, 4, 9, 10 , 11, 14, 15 Fowler 8

Page 3: L11 Application Architecture

Agenda Layering Application Architecture Play! implementation Introduction to REST

Page 4: L11 Application Architecture

Layering

Page 5: L11 Application Architecture

Layering Software systems can get complicated– Abstractions are needed

Provides abstraction by separating computer systems in layers– Higher layers use services from

lower layers– Each layer has dedicated task

and hides complexity from upperlayers

Page 6: L11 Application Architecture

Three Layers Presentation Layer for the User Interface Domain Layer for the domain logic Data Source Layer for the data access

– Separation of concern

Client

Client

Domain Data Source

Page 7: L11 Application Architecture

Presentation Layer Consideration– Separating the Presentation Logic from the

Domain Logic– Simple vs. Rich user interface– Should content be editable frequently

Page 8: L11 Application Architecture

User Interfaces Clear separation of concerns is important– Define the Presentation Logic– Design the domain layer so the presentation can get

the information needed – Semantics – or the meaning of things is important

– Presentation logic must avoid making assumptions on the domain – the semantics should be a part of the domain• Use Data Transfer Objects to store semantics

Page 9: L11 Application Architecture

Client Types Native OS Applications– Windows, iOS, Android, Linux

Embedded– Run inside Web Browsers– Flash, Java Applets

Interactive Web Applications– HTML with JavaScript

HTML Presentation in Browsers– Simple HTML

Page 10: L11 Application Architecture

Content Delivery Native, Embedded and Interactive Web

Apps– Require HTTP API call for dynamic content– For example SOAP, REST with Json or XML

HTML Presentation in Browsers– Server side generated

Page 11: L11 Application Architecture

Content Type Static Content such as graphic assets,

doesn’t change frequently Editable Content such as text, layout,

mashed-up content, editable by content owners, frequently

Dynamic Content stored in database and manipulated by the domain logic

Page 12: L11 Application Architecture

Content Management Systems Content is separated form the Enterprise

system– Managed by CMS software with its own

database– HTTP API calls for dynamic content from the

enterprise systemCLIENTWeb Browser

HTMLJavaScript CMS

Enterprise Application

HTTP/REST/Json

OPERATOR

Editable content

Staticcontent

Dynamiccontent

Staticcontent

Page 13: L11 Application Architecture

Domain Layer Where is the domain logic?– Application Servers– Lightweight Containers

Page 14: L11 Application Architecture

Application Servers Domain Components are deployed on

Application Servers– Distributed Multi-tiered Applications– Example:

• Web Servers, EJB Servers

Page 15: L11 Application Architecture

Lightweight Containers Assemble components from different

projects into a cohesive application– Wiring is done with “Inversion of Control” -

config– Provide life-cycle management of objects– Provide contextWeb Browser

(User Interface)

Web Browser(User Interface)

Web Server

Web Layer

Lightweight Container

Domain Layer

Data Source Layer

Database

Page 16: L11 Application Architecture

Data Source Layer How to create the mapping from the

domain to the Data Source Layer– Gateways with no domain logic– Records managed with some domain logic– Data Mappers

Page 17: L11 Application Architecture

Data Source Layer Domain Model uses gateway

DomainLayer

DataSourceLayer

Page 18: L11 Application Architecture

Object Relational Mapping (ORM) Use a mapping layer to map between

objects and tables– Mapping a data representation from an object

model to a relational data model with a SQL-based schema

Mapping requires metadata– XML

Authoring and maintaining metadata is less work than maintaining SQL

Page 19: L11 Application Architecture

The Big Picture

Client

DomainData

Source

CMS

RESTWeb

Server DB

Page 20: L11 Application Architecture

The Big Picture in SOA

Client

DomainData

Source

CMS

RESTWeb

Server DBSERVICE

DomainData

SourceREST

WebServer DBSERVICE

Frameworks Frameworks

Page 21: L11 Application Architecture

Application Architecture

Page 22: L11 Application Architecture

Advice is a dangerous gift– There are no right answers– “Use the advice to prod your thinking, but

don’t use it as a replacement for your thinking”

Page 23: L11 Application Architecture

Three Layers Presentation Layer for the User Interface Domain Layer for the domain logic Data Source Layer for the data access

– What patterns to use?

PresentationLayer

Domain Data Source

Page 24: L11 Application Architecture

Domain Layer Transaction Script Domain Model Table Module

Page 25: L11 Application Architecture

Domain Layer Transaction Script– Procedural– Encapsulates the logic of each transaction– Works well for systems that are transactional in

nature Drawbacks– Does not handle complexity of logic– Code duplications

Page 26: L11 Application Architecture

Domain Layer Domain Model– Works nicely for any type of domain logic– Flexibility in creating an object oriented classes

that use abstractions and polymorphism– Beautiful code

Drawbacks– Learning curve – understanding the model– Requires skills– Doesn’t map easily to relational database

Page 27: L11 Application Architecture

Domain Layer Table Module– Works well for data driven applications– Fits well with relational databases– Requires Record Set functionality

Drawbacks– Structured around the database– Needs tooling support, for example Record

Set– Can become dependent on the environment

Page 28: L11 Application Architecture

Data Source Layer Data Source for Transaction Script– Fits well to use the Gateway patterns– Row Data Gateway or Table Data Gateway– Depends on the applications– If the transactions are dealing with each row

per transactions, then Row Data Gateway works

– If working with tables, Table Data Gateway works

Page 29: L11 Application Architecture

Data Source Layer Data Source for Table Module– Table Module requires good support from

Record Set– Table Data Gateway fits this well

Page 30: L11 Application Architecture

Data Source Layer Data Source for Domain Model– If the Domain Model is fairly simple, and

maps the database, Active Record works well– If you want to provide abstraction the gateway

patterns become better choice, Row Data Gateway and Table Data Gateway

– If things get more complication and there is need to keep the model independent from the data source, Data Mapper should be considered

Page 31: L11 Application Architecture

Model View Controller For all types MVC architectural patterns

applies Web Frameworks are usually implemented

using the Front Controller pattern Each request has an Action or a Controller Views are handle by Template View

Page 32: L11 Application Architecture

Domain Layer

The Big Picture

PresentationLayer

ServiceLayer

Data Source

DomainDB

Page 33: L11 Application Architecture

We have a relatively simple domain logic that maps nicely to the data schema, and we have good tools for Record Set handling. What Domain Layer pattern would make sense?

A) Service LayerB) Domain ModelC) Transaction ScriptD) Table Module

QUIZ

Page 34: L11 Application Architecture

Play! Framework

34

Page 35: L11 Application Architecture

Exercise Design Web Application RuNews– Front page displays RSS news items– Content read with ImportContentProcess– User can sign up and login

Page 36: L11 Application Architecture

Overivew

Controller

View

Service Layer

Domain Model

Table DataGateway

routes ApplicationConext.xml

users

Page 37: L11 Application Architecture

Signup As a user, I want to be able to sign up

RegistrationFields: name, username, password, email

Validtaion: all fields are requiredusername must be at least 4

characterspassword must be confirmed

(typed in twice)

Page 38: L11 Application Architecture
Page 39: L11 Application Architecture

39

Play setup Project is created: RuNews Structure

controllersis.ru.honn.newsviews

Page 40: L11 Application Architecture

40

The Database Table users

CREATE TABLE users( id int Identity (1, 1) primary key NOT NULL, name varchar(128), username varchar(128) unique, password varchar(128), email varchar(128),)

Page 41: L11 Application Architecture

41

Application.javapackage controllers;

import play.*;import play.mvc.*;

import views.html.*;

public class Application extends Controller{ public static Result index() { return ok(index.render()); }}

Page 42: L11 Application Architecture

42

index View is views/index.scala.html

Compiled: views/html/index

@main(Html("RuNews")) {

<h2>Registration</h2> <p> Here you can sign up: <a class="btn” href="@routes.SignUp.blank">Sign up</a> </p>}

Page 43: L11 Application Architecture

43

Routing conf/routes contains the routing

information# Routes# This file defines all application routes (Higher priority routes first)# ~~~~

# Home pageGET / controllers.Application.index()

# Sign UpGET /signup controllers.SignUp.blank()POST /signup controllers.SignUp.submit()

# Map static resources from the /public folder to the /assets URL pathGET /assets/*file controllers.Assets.at(path="/public", file)

Page 44: L11 Application Architecture

44

RuNews Example Userpublic class User{ protected int id; protected String name; protected String username; protected String password; protected String email;

public User() { }

public User(int id, String name, String username, String password, String email) { this.id = id; this.name = name; this.username = username; this.password = password; this.email = email; }...

Page 45: L11 Application Architecture

45

RuNews Example UserService is a Service Layer interface

UserServiceData contains the implementation

public interface UserService{ public int signup(User user); public User login(String username, String password); public void setUserDataGateway(UserDataGateway userDataGateway);}

Page 46: L11 Application Architecture

46

Adding Domain and Data Layers

Implementation of Service Layer, Domain and Data Source Layers added– Added as is– Should be in model

Page 47: L11 Application Architecture

47

Adding Domain and Data Layers ApplicationContext.xml added to conf– Drop data.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="userService" class="is.ru.honn.news.service.UserServiceData"> <property name="userDataGateway" ref="userDataGateway"/> </bean>

<bean id="userDataGateway" class="is.ru.honn.news.data.UserData"> <property name="dataSource" ref="dataSource"/> </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/> <property name="url" value="jdbc:jtds:sqlserver://hrnem.ru.is:1433"/> <property name="username" value=”###"/> <property name="password" value=”###"/> </bean>

</beans>

Page 48: L11 Application Architecture

48

Adding Domain and Data Layers Table Data Gateway injected into service

public class UserServiceData implements UserService{ RuDataAccessFactory factory; UserDataGateway userDataGateway;

public UserServiceData() { }

public void setUserDataGateway(UserDataGateway UserDataGateway) { this.userDataGateway = UserDataGateway; }

Page 49: L11 Application Architecture

49

RuNews Example Signup is a Controllerimport views.html.signup.*;import is.ru.honn.news.domain.UserRegistration;

public class SignUp extends Controller{ final static Form<UserRegistration> signupForm = Form.form(UserRegistration.class);

public static Result blank() { return ok(form.render(signupForm)); }

Page 50: L11 Application Architecture

50

RuNews Example Signup is a Controller public static Result submit() { Form<UserRegistration> filledForm = signupForm.bindFromRequest(); ... if (filledForm.hasErrors()) { return badRequest(form.render(filledForm)); } else { User created = filledForm.get(); ApplicationContext ctx = new FileSystemXmlApplicationContext ("/conf/ApplicationContext.xml"); UserDataGateway userDataGateway = (UserDataGateway)ctx.getBean("userDataGateway"); userDataGateway.addUser((User)created); return ok(summary.render(created)); } }}

Page 51: L11 Application Architecture

51

RuNews Example form.scala.html is the view@(signupForm: Form[is.ru.honn.news.domain.UserRegistration])

@import helper._@import helper.twitterBootstrap._@title = { Sign Up}@main(title, nav = "signup") { @helper.form(action = routes.SignUp.submit) { <fieldset> <legend>Account informations</legend> @inputText( signupForm("name"), '_label -> "Name", '_help -> "Please enter your name.", '_error -> signupForm.globalError )

Page 52: L11 Application Architecture

52

RuNews Example form.scala.html is the view @inputText( signupForm("username"), '_label -> "Username", '_help -> "Please choose a valid username.", '_error -> signupForm.globalError ) @inputText( signupForm("email"), '_label -> "Email", '_help -> "Enter a valid email address." ) @inputPassword( signupForm("password"), '_label -> "Password", '_help -> "A password must be at least 6 characters. " )... </fieldset>

Page 53: L11 Application Architecture

53

RuNews Example forms.scala.html is the view

<fieldset> @checkbox( signupForm("accept"), '_label -> None, '_text -> "You agree the Terms and conditions", '_showConstraints -> false ) </fieldset>

<div class="actions"> <input type="submit" class="btn primary" value="Sign Up"> <a href="@routes.Application.index" class="btn">Cancel</a> </div> }}

Page 54: L11 Application Architecture

54

RuNews Example summary.scala.html displayes the user@(user: is.ru.honn.news.domain.User)

@main(Html("Account created!"), nav = "signup") { <h2>Your account:</h2> <p>Name: @user.getName()</p> <p>Username: @user.getUsername()</p> <p>Email: @user.getEmail()</p>}

Page 55: L11 Application Architecture

55

Page 56: L11 Application Architecture
Page 57: L11 Application Architecture
Page 58: L11 Application Architecture
Page 59: L11 Application Architecture
Page 60: L11 Application Architecture