SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
Rails goes SOA
Rails-Konferenz 2009 – Frankfurt/Offenbach
Dirk Breuer – pkw.de


                        02. September 2009
View



        Controller                 (nur lesend)




           Model
(enthält Business Logik + Daten)
View



              Controller              (nur lesend)



Business
 Logik
                  Model
           (enthält Business Logik)
View



                                          Business
(nur lesend)   Controller                  Logik
                                extract




                 Model
               (Datenhaltung)
Vorteile der Transformation


 Entwickler erhalten Kontrolle über Source Code zurück
 Bessere Verständlichkeit für die Fachseite




                                                         Grafik © by Martin Laksman, 2003
Vorteile der Transformation


 Entwickler erhalten Kontrolle über Source Code zurück
 Bessere Verständlichkeit für die Fachseite



                         Bessere Time-to-Market


                                                         Grafik © by Martin Laksman, 2003
Service-Orientierte Architekturen
View



                                   Services
(nur lesend)   Controller       (enthalten Business
                                       Logik)




                 Model
               (Datenhaltung)
How To SOA?
Fahrzeuge Suchen
Fahrzeuge für
die Startseite
  anzeigen
Suchauftrag für
Suche anlegen
Benutzer
authentifizieren
Statistiken für
ein Fahrzeug
   anzeigen
Statistiken für
ein Fahrzeug
   anzeigen



    Statistiken
    Schreiben
get_startpage_cars                    get_statistics_of_car
get_startpage_dealer                  get_number_of_cars_of_customer
get_startpage_teaser                  get_cars_of_customer
search_cars                           get_number_of_car_images
create_temporary_customer             get_car_images
create_temporary_car                  delete_car
save_temporary_customer               delete_customer
save_temporary_car                    get_search_orders_of_customer
authenticate_customer                 delete_search_order
add_image_to_car                      search_cars_by_search_order
generate_captcha                      authenticate_customer
verify_captcha                        authenticate_dealer
accept_customer                       generate_password
publish_car                           send_new_password
notify_customer_about_published_car   …
Vorteile von SOA


 Services werden von Fachseite gefunden
 Fachseite versteht IT besser
 Fachseite versteht Komplexität besser
 Fachliche Sicht sehr langlebig, dadurch Services sehr langlebig
Vorteile von SOA


 Services werden von Fachseite gefunden
 Fachseite versteht IT besser
 Fachseite versteht Komplexität besser
 Fachliche Sicht sehr langlebig, dadurch Services sehr langlebig




                                                                       Grafik © by Martin Laksman, 2003
                                                  Langlebigkeit ...?
Langlebigkeit der Datenbank?


 Änderung von Spalten
 Änderung des CRM-Systems
 Anbindung an SAP
 Zusammenlegung von StartUps
Langlebigkeit der GUI?


 Änderung der Anordnung von Elementen
 Änderung von Dialogen
 Änderung von Texten
 Redesign der gesamten Plattform
Langlebigkeit von Services

 Fachseite definiert Geschäftsprozesse
   Fahrzeuge suchen
   Benutzer authentifizieren
   Statistiken schreiben
 Änderungen auf dieser Ebene sehr viel unwahrscheinlicher
Und was genau ist
ein Service Jetzt?!




                      Grafik © by Martin Laksman, 2003
Ein Service ist …

 … technologie- und plattformunabhängig
 … dynamische lokalisier- und ausführbar
 … in sich abgeschlossen
 … durch eine wohl-definierte und formale Schnittstelle beschrieben
 … stateless
Basic SOA
                         Service
                        Provider

 Dienstbeschreibung                        Dienstimplementierung
   veröffentlichen                                 binden




     Service                                  Service
     Registry         Dienstbeschreibung       Client
                            finden
Aber kosten diese SOA
Lösungen von IBM & Co nicht
      sehr viel Geld?




                              Grafik © by Martin Laksman, 2003
Aber kosten diese SOA
Lösungen von IBM & Co nicht
      sehr viel Geld?


                         Ja ...




                                  Grafik © by Martin Laksman, 2003
Aber kosten diese SOA
Lösungen von IBM & Co nicht
      sehr viel Geld?


                         Ja ...

 Das können wir uns
    nicht leisten!


                                  Grafik © by Martin Laksman, 2003
SOA ist doch nur ein
Konzept. Das können
  wir auch selbst
    umsetzen.




                       Grafik © by Martin Laksman, 2003
SOA ist doch nur ein
Konzept. Das können
  wir auch selbst
    umsetzen.




   Und zwar passend
        für uns!

                       Grafik © by Martin Laksman, 2003
+
    SO
      A
class SearchService

 def self.search_cars(search_criteria)
  # Calling the Car class which is just
  # a ActiveRecord::Base subclass
 end

end

found_cars = SearchService.search_cars(some_criteria)
Aber moment, das sieht
      class SearchService

       def self.search_cars(search_criteria)
        # Calling the Car class which is just
        # a ActiveRecord::Base subclass
       end

      end

      found_cars = SearchService.search_cars(some_criteria)
class Car < ActiveRecord::Base

 def self.search(criteria)
  find(:all, :conditition => criteria)
 end

end

found_cars = Car.search(params[:criteria])
class Car < ActiveRecord::Base

 def self.search(criteria)
  find(:all, :conditition => criteria)
 end

end

found_cars = Car.search(params[:criteria])
                                             Aber ...
Echte Businesslogik ist in der Regel deutlich komplexer

Bisher: ActiveRecord::Base = Businesslogik + Daten

Jetzt: ActiveRecord::Base = Daten, Service = Businesslogik
Echte Businesslogik ist in der Regel deutlich komplexer

Bisher: ActiveRecord::Base = Businesslogik + Daten

Jetzt: ActiveRecord::Base = Daten, Service = Businesslogik


                            inkl. einfacher Validierung etc.
Verteilung
                               Such Service




                 Suchauftrag
                   Service

  Rails
Frontend

           Authentifizierungs                  Statistic
                Service                       Service
Verteilung
                                       Such Service




                               ?
                 Suchauftrag


  Rails
                   Service
                                                      ?
Frontend

           Authentifizierungs                              Statistic
                Service
                                   ?                      Service
Verteilung
                                       Such Service




                               ?
                 Suchauftrag


  Rails
                   Service
                               Thrift-RPC             ?
Frontend

           Authentifizierungs                              Statistic
                Service
                                   ?                      Service
Thrift-RPC?!?




                Grafik © by Martin Laksman, 2003
Thrift-RPC


 RPC-Framework von Facebook entwickelt
 Mittlerweile Apache Incubator Projekt: http://incubator.apache.org/thrift/
 Ziel: Verlässliche und effiziente Kommunikation verteilter Systemkomponenten
Thrift-Architektur

                      Transport



                      Protocol



                      Processor



               Service-Implementierung
Thrift-Architektur

                      Transport
  Thrift-
 Compiler
                      Protocol



                      Processor
  Thrift-
   Gem
               Service-Implementierung
Thrift Service
 Definition
  erstellen
Thrift Service
                 Service Stubs
 Definition
                  generieren
  erstellen
Thrift Service
                 Service Stubs       Service
 Definition
                  generieren     implementieren
  erstellen
Thrift Service                                    Transport-
                 Service Stubs       Service
 Definition                                          Schicht
                  generieren     implementieren
  erstellen                                       realisieren
Thrift Service                                    Transport-
                 Service Stubs       Service                      Service
 Definition                                          Schicht
                  generieren     implementieren                 ansprechen
  erstellen                                       realisieren
Thrift Service                                    Transport-
                 Service Stubs       Service                      Service
 Definition        generieren     implementieren
                                                    Schicht
                                                                ansprechen
                                                  realisieren
  erstellen
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
  UNVERIFIED = 2,
  BLOCKED = 3
}

struct User {
  1: string firstname,
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
  6: UserStates state
}

exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,
  BLOCKED = 3
}

struct User {
  1: string firstname,
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
  6: UserStates state
}

exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,

}
  BLOCKED = 3                                                    ✓ Enums
struct User {
  1: string firstname,
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
  6: UserStates state
}

exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,

}
  BLOCKED = 3                                                    ✓ Enums
struct User {
  1: string firstname,                                            ✓ Primitive Datentypen
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
  6: UserStates state
}

exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,

}
  BLOCKED = 3                                                    ✓ Enums
struct User {
  1: string firstname,                                            ✓ Primitive Datentypen
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
                                                                 ✓ Komplexe Typen
  6: UserStates state
}

exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,

}
  BLOCKED = 3                                                    ✓ Enums
struct User {
  1: string firstname,                                            ✓ Primitive Datentypen
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
                                                                 ✓ Komplexe Typen
  6: UserStates state
}
                                                                 ✓ Exceptions
exception AuthenticationError {
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Thrift Service-Definition
namespace rb UserService

enum UserStates {
  VERIFIED = 1,
                                                                 ✓ Namespaces
  UNVERIFIED = 2,

}
  BLOCKED = 3                                                    ✓ Enums
struct User {
  1: string firstname,                                            ✓ Primitive Datentypen
  2: string lastname,
  3: i32 age,
  4: string email,
  5: string username,
                                                                 ✓ Komplexe Typen
  6: UserStates state
}
                                                                 ✓ Exceptions
exception AuthenticationError {

                                                                 ✓ Services
  1: string message,
  2: list<string> backtrace
}

service AuthenticationService {
  User authenticate_user(1:string username, 2:string password)
throws (1:AuthenticationError ae)
}
Walkthrough: Statistik-Service
namespace rb Pkwde.StatisticsModule

struct Statistic {
  1:string name,
  2:i32 count
}

service StatisticsService {
  list<Statistic> statistic_for(1:list<string> element_names),
  oneway void increment(1:list<string> elements)
}



            $> thrift --gen rb:rails -o ./app/thrift config/statistics_service.thrift



app/thrift
`-- gen-rb
  `-- pkwde
     `-- statistics_module
       |-- statistics_service.rb
       |-- statistics_service_constants.rb
       `-- statistics_service_types.rb
class StatisticsHandler

 def statistic_for(element_names)
  Statistic.find_all_by_name(element_names).map do |statistic|
   Pkwde::StatisticsModule::Statistic.new(:name => statistic.name,
                             :count => statistic.count)
  end
 end

 def increment(elements)
  elements.each do |element|
   Statistic.find_or_create_by_name(element).increment!(:count)
  end
 end

end
Service Provider
require 'thrift/server/rack_middleware'

ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal,
        Thrift::RackMiddleware,
        { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new),   StatisticsHandler.new
          :hook_path => "/statistics" })
Service Provider
require 'thrift/server/rack_middleware'

ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal,
        Thrift::RackMiddleware,
        { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new),   StatisticsHandler.new
          :hook_path => "/statistics" })
Service Provider
require 'thrift/server/rack_middleware'

ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal,
        Thrift::RackMiddleware,
        { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new),   StatisticsHandler.new
          :hook_path => "/statistics" })




Service Client
statistics_client = ThriftClient.new(:url => "http://localhost:3000/statistics",
                          :client_class => Pkwde::StatisticsModule::StatisticsService::Client)
Service Provider
require 'thrift/server/rack_middleware'

ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal,
        Thrift::RackMiddleware,
        { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new),   StatisticsHandler.new
          :hook_path => "/statistics" })



                                                                               http://github.com/railsbros/thrift



Service Client
statistics_client = ThriftClient.new(:url => "http://localhost:3000/statistics",
                          :client_class => Pkwde::StatisticsModule::StatisticsService::Client)



                                                                     http://github.com/railsbros/thrift4rails
Was ist Eigentlich mit
einer Lösung die mehr
      Ruby ist …?




                          Grafik © by Martin Laksman, 2003
Sneak Preview

Hoth::Services.define do

 service :increment_statistics, :params => [[:element]],
                    :returns => nil,
                    :endpoint => :statistics_module

 service :statistic_for, :params => [[:element_name]],
                  :returns => [:statistic],
                  :endpoint => :statistics_module

end

                                                           Service-Definition
Sneak Preview

Hoth::ServiceDeployment.define do
 service_module :statistics_module do
  env :test, {
    :endpoint       => Hoth::Endpoint.new(:host => 'localhost', :port => 3000),
    :mongrel_servers => 2,
    :mongrel_start_port => 9001
  }

  path "services/search_service"
 end
end

                                                                      Deployment-Definition
Sneak Preview

ENV["LOCAL"] = "false"

require 'hoth'
require 'deployment_definition'
require 'service_definition'

Hoth::Services.increment_statistics([statistic_object], event)
Hoth::Services.statistic_of_cars([23]).inspect

                                                                 Service-Client
ENV["LOCAL"] = "true"

require 'hoth'
require 'deployment_definition'
require 'service_definition'

class IncrementStatisticsImpl
 def self.execute(elements)
   elements.each do |element|
    Statistic.find_or_create_by_name(element).increment!(:count)
   end
 end
end

class StatisticForImpl
 def self.execute(element_names)
   Statistic.find_all_by_name(element_names)
 end
end

app = lambda {|env| [200, {'Content-Type' => 'text/plain'}, ""]}
run Hoth::ServiceProvider.new(app)

                                                                   Service-Provider
About Me …

Rubyist und Rails-Enthusiast seit Ende 2005
Software-Entwickler bei pkw.de seit 2007
Twitter: @railsbros_dirk
GitHub: http://github.com/pkwde
Blog: http://railsbros.de
Kann ich das gleiche
  nicht durch ein
 gutes OO-Design
    realisieren?




                       Grafik © by Martin Laksman, 2003
SOA vs. OOP

SOA ersetzt OOP nicht!
SOA setzt auf einer anderen Ebene an
OOP Design Prinzipien finden jedoch keine Anwendung für SOA
Fokus auf die Abbildung von Geschäftsprozessen
Ein Service kann intern immer noch OOP sein

Weitere ähnliche Inhalte

Andere mochten auch

Unmanned Aircraft Systems
Unmanned Aircraft SystemsUnmanned Aircraft Systems
Unmanned Aircraft SystemsJosephCox
 
Tutorial simulations-elec 380
Tutorial simulations-elec 380Tutorial simulations-elec 380
Tutorial simulations-elec 380Moez Ansary
 
qwest communications q_q4 04er
qwest communications q_q4 04erqwest communications q_q4 04er
qwest communications q_q4 04erfinance19
 
A31008 m383-f101-1-19 net
A31008 m383-f101-1-19 netA31008 m383-f101-1-19 net
A31008 m383-f101-1-19 netDavor Prezel
 
ndertesat popullore korce *rafaela*
ndertesat popullore korce *rafaela*ndertesat popullore korce *rafaela*
ndertesat popullore korce *rafaela*Vajza Vogel
 
Tendencias 009
Tendencias 009Tendencias 009
Tendencias 009IPAE
 
Big Sky Developments 2013 Magazine
Big Sky Developments 2013 MagazineBig Sky Developments 2013 Magazine
Big Sky Developments 2013 MagazineJen Hanrahan
 
Isaiah 22 commentary
Isaiah 22 commentaryIsaiah 22 commentary
Isaiah 22 commentaryGLENN PEASE
 
Tchaikovsky
TchaikovskyTchaikovsky
Tchaikovskymlm72
 
Vanchit janta january 2015
Vanchit janta january 2015 Vanchit janta january 2015
Vanchit janta january 2015 jagdish lal
 
LDD Southern Summit 2013 - Adido - Creating perfect marriage between offline...
LDD Southern Summit 2013 - Adido - Creating  perfect marriage between offline...LDD Southern Summit 2013 - Adido - Creating  perfect marriage between offline...
LDD Southern Summit 2013 - Adido - Creating perfect marriage between offline...Adido
 
Warum Python?
Warum Python?Warum Python?
Warum Python?tharwan
 
Erratum DS n°3 - 14/15 - Première S
Erratum DS n°3 - 14/15 - Première SErratum DS n°3 - 14/15 - Première S
Erratum DS n°3 - 14/15 - Première Sprofroques
 
Principio basicos peluquer+¡a-canina-
 Principio basicos peluquer+¡a-canina- Principio basicos peluquer+¡a-canina-
Principio basicos peluquer+¡a-canina-fritrozo
 

Andere mochten auch (20)

Unmanned Aircraft Systems
Unmanned Aircraft SystemsUnmanned Aircraft Systems
Unmanned Aircraft Systems
 
Tutorial simulations-elec 380
Tutorial simulations-elec 380Tutorial simulations-elec 380
Tutorial simulations-elec 380
 
qwest communications q_q4 04er
qwest communications q_q4 04erqwest communications q_q4 04er
qwest communications q_q4 04er
 
A31008 m383-f101-1-19 net
A31008 m383-f101-1-19 netA31008 m383-f101-1-19 net
A31008 m383-f101-1-19 net
 
ndertesat popullore korce *rafaela*
ndertesat popullore korce *rafaela*ndertesat popullore korce *rafaela*
ndertesat popullore korce *rafaela*
 
Tendencias 009
Tendencias 009Tendencias 009
Tendencias 009
 
Big Sky Developments 2013 Magazine
Big Sky Developments 2013 MagazineBig Sky Developments 2013 Magazine
Big Sky Developments 2013 Magazine
 
2222222
22222222222222
2222222
 
Viviendo con diabetes. tania apango
Viviendo con diabetes. tania apangoViviendo con diabetes. tania apango
Viviendo con diabetes. tania apango
 
Isaiah 22 commentary
Isaiah 22 commentaryIsaiah 22 commentary
Isaiah 22 commentary
 
Cartilla
CartillaCartilla
Cartilla
 
Tchaikovsky
TchaikovskyTchaikovsky
Tchaikovsky
 
Vanchit janta january 2015
Vanchit janta january 2015 Vanchit janta january 2015
Vanchit janta january 2015
 
Kona LHi
Kona LHiKona LHi
Kona LHi
 
LDD Southern Summit 2013 - Adido - Creating perfect marriage between offline...
LDD Southern Summit 2013 - Adido - Creating  perfect marriage between offline...LDD Southern Summit 2013 - Adido - Creating  perfect marriage between offline...
LDD Southern Summit 2013 - Adido - Creating perfect marriage between offline...
 
Warum Python?
Warum Python?Warum Python?
Warum Python?
 
Dominio D y C
Dominio D y CDominio D y C
Dominio D y C
 
Erratum DS n°3 - 14/15 - Première S
Erratum DS n°3 - 14/15 - Première SErratum DS n°3 - 14/15 - Première S
Erratum DS n°3 - 14/15 - Première S
 
Principio basicos peluquer+¡a-canina-
 Principio basicos peluquer+¡a-canina- Principio basicos peluquer+¡a-canina-
Principio basicos peluquer+¡a-canina-
 
ABUELITO QUERIDO
ABUELITO QUERIDOABUELITO QUERIDO
ABUELITO QUERIDO
 

Ähnlich wie Rails goes SOA

Pragmatic SOA - Beschränken auf das Wesentliche
Pragmatic SOA - Beschränken auf das WesentlichePragmatic SOA - Beschränken auf das Wesentliche
Pragmatic SOA - Beschränken auf das Wesentliche1&1
 
07 06 Xpertivy (Office 2003)
07 06 Xpertivy (Office 2003)07 06 Xpertivy (Office 2003)
07 06 Xpertivy (Office 2003)soreco
 
Go Salesforce - Swiss eEconomy Forum 2011
Go Salesforce - Swiss eEconomy Forum 2011Go Salesforce - Swiss eEconomy Forum 2011
Go Salesforce - Swiss eEconomy Forum 2011PARX
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling  am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling  am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdAOE
 
Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Christian Baranowski
 
C5 Mettenmeier Lotusday2007
C5 Mettenmeier Lotusday2007C5 Mettenmeier Lotusday2007
C5 Mettenmeier Lotusday2007Andreas Schulte
 
Ivory Soa Suite
Ivory Soa SuiteIvory Soa Suite
Ivory Soa SuitePredrag61
 
Cloud Computing, the next generation of internet hosting
Cloud Computing, the next generation of internet hostingCloud Computing, the next generation of internet hosting
Cloud Computing, the next generation of internet hostingCloudAngels
 
Basta 2016 - Test- und Releaseumgebungen in der Cloud
Basta 2016 - Test- und Releaseumgebungen in der CloudBasta 2016 - Test- und Releaseumgebungen in der Cloud
Basta 2016 - Test- und Releaseumgebungen in der CloudMarc Müller
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtagcamunda services GmbH
 
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...OPITZ CONSULTING Deutschland
 
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor Integration
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor IntegrationWebcast: SAP on Azure für den Mittelstand - Erfolgsfaktor Integration
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor IntegrationQUIBIQ Hamburg
 
Modellieren von Geschäftsprozessabhängigkeiten
Modellieren von GeschäftsprozessabhängigkeitenModellieren von Geschäftsprozessabhängigkeiten
Modellieren von GeschäftsprozessabhängigkeitenDigicomp Academy AG
 
Innovationen aus der Cloud ganz einfach nutzen
Innovationen aus der Cloud ganz einfach nutzenInnovationen aus der Cloud ganz einfach nutzen
Innovationen aus der Cloud ganz einfach nutzenAmazon Web Services
 
Eine Referenzarchitektur für das Digitale Produkt
Eine Referenzarchitektur für das Digitale ProduktEine Referenzarchitektur für das Digitale Produkt
Eine Referenzarchitektur für das Digitale ProduktIntelliact AG
 
Technisches SEO 2019 Berlin SEO Campixx
Technisches SEO 2019 Berlin SEO CampixxTechnisches SEO 2019 Berlin SEO Campixx
Technisches SEO 2019 Berlin SEO CampixxAlona Demchyk (Hakel)
 
SOA - Vom Geschäftsprozess zum Webservice
SOA - Vom Geschäftsprozess zum WebserviceSOA - Vom Geschäftsprozess zum Webservice
SOA - Vom Geschäftsprozess zum WebserviceGFU Cyrus AG
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenJakob
 

Ähnlich wie Rails goes SOA (20)

Pragmatic SOA - Beschränken auf das Wesentliche
Pragmatic SOA - Beschränken auf das WesentlichePragmatic SOA - Beschränken auf das Wesentliche
Pragmatic SOA - Beschränken auf das Wesentliche
 
07 06 Xpertivy (Office 2003)
07 06 Xpertivy (Office 2003)07 06 Xpertivy (Office 2003)
07 06 Xpertivy (Office 2003)
 
Go Salesforce - Swiss eEconomy Forum 2011
Go Salesforce - Swiss eEconomy Forum 2011Go Salesforce - Swiss eEconomy Forum 2011
Go Salesforce - Swiss eEconomy Forum 2011
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling  am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling  am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?
 
C5 Mettenmeier Lotusday2007
C5 Mettenmeier Lotusday2007C5 Mettenmeier Lotusday2007
C5 Mettenmeier Lotusday2007
 
Ivory Soa Suite
Ivory Soa SuiteIvory Soa Suite
Ivory Soa Suite
 
Cloud Computing, the next generation of internet hosting
Cloud Computing, the next generation of internet hostingCloud Computing, the next generation of internet hosting
Cloud Computing, the next generation of internet hosting
 
Basta 2016 - Test- und Releaseumgebungen in der Cloud
Basta 2016 - Test- und Releaseumgebungen in der CloudBasta 2016 - Test- und Releaseumgebungen in der Cloud
Basta 2016 - Test- und Releaseumgebungen in der Cloud
 
Open Source BPM - iteratec Architekturtag
Open Source BPM - iteratec ArchitekturtagOpen Source BPM - iteratec Architekturtag
Open Source BPM - iteratec Architekturtag
 
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...
Integrationsszenarien in modernen Anwendungslandschaften - OPITZ CONSULTING -...
 
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor Integration
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor IntegrationWebcast: SAP on Azure für den Mittelstand - Erfolgsfaktor Integration
Webcast: SAP on Azure für den Mittelstand - Erfolgsfaktor Integration
 
Modellieren von Geschäftsprozessabhängigkeiten
Modellieren von GeschäftsprozessabhängigkeitenModellieren von Geschäftsprozessabhängigkeiten
Modellieren von Geschäftsprozessabhängigkeiten
 
Innovationen aus der Cloud ganz einfach nutzen
Innovationen aus der Cloud ganz einfach nutzenInnovationen aus der Cloud ganz einfach nutzen
Innovationen aus der Cloud ganz einfach nutzen
 
20110119 activiti jughh
20110119 activiti jughh20110119 activiti jughh
20110119 activiti jughh
 
20110203 jug stuttgart
20110203 jug stuttgart20110203 jug stuttgart
20110203 jug stuttgart
 
Eine Referenzarchitektur für das Digitale Produkt
Eine Referenzarchitektur für das Digitale ProduktEine Referenzarchitektur für das Digitale Produkt
Eine Referenzarchitektur für das Digitale Produkt
 
Technisches SEO 2019 Berlin SEO Campixx
Technisches SEO 2019 Berlin SEO CampixxTechnisches SEO 2019 Berlin SEO Campixx
Technisches SEO 2019 Berlin SEO Campixx
 
SOA - Vom Geschäftsprozess zum Webservice
SOA - Vom Geschäftsprozess zum WebserviceSOA - Vom Geschäftsprozess zum Webservice
SOA - Vom Geschäftsprozess zum Webservice
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-Optimierungen
 

Rails goes SOA

  • 1. Rails goes SOA Rails-Konferenz 2009 – Frankfurt/Offenbach Dirk Breuer – pkw.de 02. September 2009
  • 2. View Controller (nur lesend) Model (enthält Business Logik + Daten)
  • 3. View Controller (nur lesend) Business Logik Model (enthält Business Logik)
  • 4. View Business (nur lesend) Controller Logik extract Model (Datenhaltung)
  • 5. Vorteile der Transformation Entwickler erhalten Kontrolle über Source Code zurück Bessere Verständlichkeit für die Fachseite Grafik © by Martin Laksman, 2003
  • 6. Vorteile der Transformation Entwickler erhalten Kontrolle über Source Code zurück Bessere Verständlichkeit für die Fachseite Bessere Time-to-Market Grafik © by Martin Laksman, 2003
  • 8. View Services (nur lesend) Controller (enthalten Business Logik) Model (Datenhaltung)
  • 10.
  • 13.
  • 16.
  • 18. Statistiken für ein Fahrzeug anzeigen Statistiken Schreiben
  • 19. get_startpage_cars get_statistics_of_car get_startpage_dealer get_number_of_cars_of_customer get_startpage_teaser get_cars_of_customer search_cars get_number_of_car_images create_temporary_customer get_car_images create_temporary_car delete_car save_temporary_customer delete_customer save_temporary_car get_search_orders_of_customer authenticate_customer delete_search_order add_image_to_car search_cars_by_search_order generate_captcha authenticate_customer verify_captcha authenticate_dealer accept_customer generate_password publish_car send_new_password notify_customer_about_published_car …
  • 20. Vorteile von SOA Services werden von Fachseite gefunden Fachseite versteht IT besser Fachseite versteht Komplexität besser Fachliche Sicht sehr langlebig, dadurch Services sehr langlebig
  • 21. Vorteile von SOA Services werden von Fachseite gefunden Fachseite versteht IT besser Fachseite versteht Komplexität besser Fachliche Sicht sehr langlebig, dadurch Services sehr langlebig Grafik © by Martin Laksman, 2003 Langlebigkeit ...?
  • 22. Langlebigkeit der Datenbank? Änderung von Spalten Änderung des CRM-Systems Anbindung an SAP Zusammenlegung von StartUps
  • 23. Langlebigkeit der GUI? Änderung der Anordnung von Elementen Änderung von Dialogen Änderung von Texten Redesign der gesamten Plattform
  • 24. Langlebigkeit von Services Fachseite definiert Geschäftsprozesse Fahrzeuge suchen Benutzer authentifizieren Statistiken schreiben Änderungen auf dieser Ebene sehr viel unwahrscheinlicher
  • 25. Und was genau ist ein Service Jetzt?! Grafik © by Martin Laksman, 2003
  • 26. Ein Service ist … … technologie- und plattformunabhängig … dynamische lokalisier- und ausführbar … in sich abgeschlossen … durch eine wohl-definierte und formale Schnittstelle beschrieben … stateless
  • 27. Basic SOA Service Provider Dienstbeschreibung Dienstimplementierung veröffentlichen binden Service Service Registry Dienstbeschreibung Client finden
  • 28. Aber kosten diese SOA Lösungen von IBM & Co nicht sehr viel Geld? Grafik © by Martin Laksman, 2003
  • 29. Aber kosten diese SOA Lösungen von IBM & Co nicht sehr viel Geld? Ja ... Grafik © by Martin Laksman, 2003
  • 30. Aber kosten diese SOA Lösungen von IBM & Co nicht sehr viel Geld? Ja ... Das können wir uns nicht leisten! Grafik © by Martin Laksman, 2003
  • 31. SOA ist doch nur ein Konzept. Das können wir auch selbst umsetzen. Grafik © by Martin Laksman, 2003
  • 32. SOA ist doch nur ein Konzept. Das können wir auch selbst umsetzen. Und zwar passend für uns! Grafik © by Martin Laksman, 2003
  • 33. + SO A
  • 34. class SearchService def self.search_cars(search_criteria) # Calling the Car class which is just # a ActiveRecord::Base subclass end end found_cars = SearchService.search_cars(some_criteria)
  • 35. Aber moment, das sieht class SearchService def self.search_cars(search_criteria) # Calling the Car class which is just # a ActiveRecord::Base subclass end end found_cars = SearchService.search_cars(some_criteria)
  • 36. class Car < ActiveRecord::Base def self.search(criteria) find(:all, :conditition => criteria) end end found_cars = Car.search(params[:criteria])
  • 37. class Car < ActiveRecord::Base def self.search(criteria) find(:all, :conditition => criteria) end end found_cars = Car.search(params[:criteria]) Aber ...
  • 38. Echte Businesslogik ist in der Regel deutlich komplexer Bisher: ActiveRecord::Base = Businesslogik + Daten Jetzt: ActiveRecord::Base = Daten, Service = Businesslogik
  • 39. Echte Businesslogik ist in der Regel deutlich komplexer Bisher: ActiveRecord::Base = Businesslogik + Daten Jetzt: ActiveRecord::Base = Daten, Service = Businesslogik inkl. einfacher Validierung etc.
  • 40. Verteilung Such Service Suchauftrag Service Rails Frontend Authentifizierungs Statistic Service Service
  • 41. Verteilung Such Service ? Suchauftrag Rails Service ? Frontend Authentifizierungs Statistic Service ? Service
  • 42. Verteilung Such Service ? Suchauftrag Rails Service Thrift-RPC ? Frontend Authentifizierungs Statistic Service ? Service
  • 43. Thrift-RPC?!? Grafik © by Martin Laksman, 2003
  • 44. Thrift-RPC RPC-Framework von Facebook entwickelt Mittlerweile Apache Incubator Projekt: http://incubator.apache.org/thrift/ Ziel: Verlässliche und effiziente Kommunikation verteilter Systemkomponenten
  • 45. Thrift-Architektur Transport Protocol Processor Service-Implementierung
  • 46. Thrift-Architektur Transport Thrift- Compiler Protocol Processor Thrift- Gem Service-Implementierung
  • 48. Thrift Service Service Stubs Definition generieren erstellen
  • 49. Thrift Service Service Stubs Service Definition generieren implementieren erstellen
  • 50. Thrift Service Transport- Service Stubs Service Definition Schicht generieren implementieren erstellen realisieren
  • 51. Thrift Service Transport- Service Stubs Service Service Definition Schicht generieren implementieren ansprechen erstellen realisieren
  • 52. Thrift Service Transport- Service Stubs Service Service Definition generieren implementieren Schicht ansprechen realisieren erstellen
  • 53. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, UNVERIFIED = 2, BLOCKED = 3 } struct User { 1: string firstname, 2: string lastname, 3: i32 age, 4: string email, 5: string username, 6: UserStates state } exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 54. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, BLOCKED = 3 } struct User { 1: string firstname, 2: string lastname, 3: i32 age, 4: string email, 5: string username, 6: UserStates state } exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 55. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, } BLOCKED = 3 ✓ Enums struct User { 1: string firstname, 2: string lastname, 3: i32 age, 4: string email, 5: string username, 6: UserStates state } exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 56. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, } BLOCKED = 3 ✓ Enums struct User { 1: string firstname, ✓ Primitive Datentypen 2: string lastname, 3: i32 age, 4: string email, 5: string username, 6: UserStates state } exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 57. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, } BLOCKED = 3 ✓ Enums struct User { 1: string firstname, ✓ Primitive Datentypen 2: string lastname, 3: i32 age, 4: string email, 5: string username, ✓ Komplexe Typen 6: UserStates state } exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 58. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, } BLOCKED = 3 ✓ Enums struct User { 1: string firstname, ✓ Primitive Datentypen 2: string lastname, 3: i32 age, 4: string email, 5: string username, ✓ Komplexe Typen 6: UserStates state } ✓ Exceptions exception AuthenticationError { 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 59. Thrift Service-Definition namespace rb UserService enum UserStates { VERIFIED = 1, ✓ Namespaces UNVERIFIED = 2, } BLOCKED = 3 ✓ Enums struct User { 1: string firstname, ✓ Primitive Datentypen 2: string lastname, 3: i32 age, 4: string email, 5: string username, ✓ Komplexe Typen 6: UserStates state } ✓ Exceptions exception AuthenticationError { ✓ Services 1: string message, 2: list<string> backtrace } service AuthenticationService { User authenticate_user(1:string username, 2:string password) throws (1:AuthenticationError ae) }
  • 61. namespace rb Pkwde.StatisticsModule struct Statistic { 1:string name, 2:i32 count } service StatisticsService { list<Statistic> statistic_for(1:list<string> element_names), oneway void increment(1:list<string> elements) } $> thrift --gen rb:rails -o ./app/thrift config/statistics_service.thrift app/thrift `-- gen-rb `-- pkwde `-- statistics_module |-- statistics_service.rb |-- statistics_service_constants.rb `-- statistics_service_types.rb
  • 62. class StatisticsHandler def statistic_for(element_names) Statistic.find_all_by_name(element_names).map do |statistic| Pkwde::StatisticsModule::Statistic.new(:name => statistic.name, :count => statistic.count) end end def increment(elements) elements.each do |element| Statistic.find_or_create_by_name(element).increment!(:count) end end end
  • 63. Service Provider require 'thrift/server/rack_middleware' ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal, Thrift::RackMiddleware, { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new), StatisticsHandler.new :hook_path => "/statistics" })
  • 64. Service Provider require 'thrift/server/rack_middleware' ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal, Thrift::RackMiddleware, { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new), StatisticsHandler.new :hook_path => "/statistics" })
  • 65. Service Provider require 'thrift/server/rack_middleware' ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal, Thrift::RackMiddleware, { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new), StatisticsHandler.new :hook_path => "/statistics" }) Service Client statistics_client = ThriftClient.new(:url => "http://localhost:3000/statistics", :client_class => Pkwde::StatisticsModule::StatisticsService::Client)
  • 66. Service Provider require 'thrift/server/rack_middleware' ActionController::Dispatcher.middleware.insert_before(Rails::Rack::Metal, Thrift::RackMiddleware, { :processor => Pkwde::StatisticsModule::StatisticsService::Processor.new(StatisticsHandler.new), StatisticsHandler.new :hook_path => "/statistics" }) http://github.com/railsbros/thrift Service Client statistics_client = ThriftClient.new(:url => "http://localhost:3000/statistics", :client_class => Pkwde::StatisticsModule::StatisticsService::Client) http://github.com/railsbros/thrift4rails
  • 67.
  • 68. Was ist Eigentlich mit einer Lösung die mehr Ruby ist …? Grafik © by Martin Laksman, 2003
  • 69. Sneak Preview Hoth::Services.define do service :increment_statistics, :params => [[:element]], :returns => nil, :endpoint => :statistics_module service :statistic_for, :params => [[:element_name]], :returns => [:statistic], :endpoint => :statistics_module end Service-Definition
  • 70. Sneak Preview Hoth::ServiceDeployment.define do service_module :statistics_module do env :test, { :endpoint => Hoth::Endpoint.new(:host => 'localhost', :port => 3000), :mongrel_servers => 2, :mongrel_start_port => 9001 } path "services/search_service" end end Deployment-Definition
  • 71. Sneak Preview ENV["LOCAL"] = "false" require 'hoth' require 'deployment_definition' require 'service_definition' Hoth::Services.increment_statistics([statistic_object], event) Hoth::Services.statistic_of_cars([23]).inspect Service-Client
  • 72. ENV["LOCAL"] = "true" require 'hoth' require 'deployment_definition' require 'service_definition' class IncrementStatisticsImpl def self.execute(elements) elements.each do |element| Statistic.find_or_create_by_name(element).increment!(:count) end end end class StatisticForImpl def self.execute(element_names) Statistic.find_all_by_name(element_names) end end app = lambda {|env| [200, {'Content-Type' => 'text/plain'}, ""]} run Hoth::ServiceProvider.new(app) Service-Provider
  • 73. About Me … Rubyist und Rails-Enthusiast seit Ende 2005 Software-Entwickler bei pkw.de seit 2007 Twitter: @railsbros_dirk GitHub: http://github.com/pkwde Blog: http://railsbros.de
  • 74. Kann ich das gleiche nicht durch ein gutes OO-Design realisieren? Grafik © by Martin Laksman, 2003
  • 75. SOA vs. OOP SOA ersetzt OOP nicht! SOA setzt auf einer anderen Ebene an OOP Design Prinzipien finden jedoch keine Anwendung für SOA Fokus auf die Abbildung von Geschäftsprozessen Ein Service kann intern immer noch OOP sein

Hinweis der Redaktion

  1. Einleitung &amp;#xFC;ber mich und pkw.de
  2. Service Registry: muss nicht immer ein System sein! Kann im ersten Schritt auch nur eine ausgedruckte Liste sein.
  3. Inkrementelles Vorgehen!!
  4. Suchkriterien mappen nicht ohne weiteres auf Form-Parameter
  5. Suchkriterien mappen nicht ohne weiteres auf Form-Parameter
  6. ist dabei sehr leichtgewichtig, zB im Vergleich zu SOAP -&gt; Dadurch aber auch nicht so m&amp;#xE4;chtig -&gt; F&amp;#xFC;r viele Anforderungen aber ausreichend
  7. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  8. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  9. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  10. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  11. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  12. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  13. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  14. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  15. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  16. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  17. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  18. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  19. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  20. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  21. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  22. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  23. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  24. DSL in C-&amp;#xE4;hnlicher Syntax Versionierung der Schnittstelle!!!
  25. oneway -&gt; Hier noch auf Doku verweisen
  26. Hier noch ohne Software-Service-Registry
  27. Hier noch ohne Software-Service-Registry
  28. Hier noch ohne Software-Service-Registry
  29. Hier noch ohne Software-Service-Registry
  30. Hier noch ohne Software-Service-Registry
  31. Thrift hat ein statisches Typensystem und Ruby ein dynamisches, dass kann zu Problemen f&amp;#xFC;hren ... Stichwort: Service-Registry