SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Michael Lagutko 
  @mlagutko 




                   BlueEyes 
Цели 
•  Создание RESTful сервисов 
•  Высокая производительность (асинхронная 
   обработка запросов) 
•  Масштабируемость (отсутствие поддержки 
   состояния) 
•  Автомотическое тестирование 
   (Независимость от сервера) 
Service 
•  BlueEyesServiceBuilder 
•  Комбинаторы оброботчиков запросов 
•  Уникальное имя и версия  
•  Жизненный цикл 
•  Контекст 
Жизненный цикл сервиса 
•  Старт 
•  Обработка запросов 
•  Остановка 
Комбинаторы оброботчиков 
                    запросов 
•    path(*padern*) { ... } 
•    contentType(*mimeType*) { ... } 
•    get { ... } 
•    put { ... } 
•    post { ... } 
•    delete { ... } 
•    … 
path("/emails"){ 
  get { request => 
         val response = H"pResponse(content = Some(emailIds))  
         Future.sync{response } 
      } 
    } 
Комбинаторы путей 
•  Строковый: "/foo/bar” 
•  Символьный: "/foo/'fooId” 
•  Но основе регулярных выражений:"/foo/bar/baz.(?
   <extension>w{3,4})” 
path("/emails"){ 
      path('emailId) { 
        path("(?<bar>[a‐z]+)"){ 
          get { request => 
            val fooId = request.parameters('fooId) 
            val extension = request.parameters('extension) 
            ... 
          } 
        } 
      } 
    } 
Комбинации оброботчиков запросов 
produces(applicavon/json) { 
      path("/users/") { 
        get { request => 
          // get list of all users 
          ... 
        } ~ 
        path('userId) { 
          parameter('userId) { userId => 
            get { request => 
              // get user 
              ... 
            } ~ 
            put { request => 
              // update user 
              ... 
            } 
          } 
        } 
      } 
    } 
Контекст 
•  Конфигурация 
•  Имя сервиса 
•  Версия сервиса 
Простой сервис 
trait EmailServices extends BlueEyesServiceBuilder { 
 val emailService = service("email", "1.32") { context => 
  startup { 
    loadContactList(context.config("contactFile")) 
  } ‐> 
  request { contactList => 
    path("/emails/") { 
      produce(applicavon/json) { 
        get { request => 
          Future.async{ 
              … 
             H"pResponse(content = Some(JArray(emailIds))) 
            } 
        } 
      } 
    } ~ 
    path('emailId) { 
      produce(applicavon/json) { 
        get { request => 
          val emailId = request.parameters('emailId) 
          ... 
          Future.sync(H"pResponse(content = Some(emailObj))) 
        } 
      } 
    } 
  } ‐> 
    shutdown { contactList => 
      contactList.finalize 
    } 
  } 
} 
HdpRequest 
•  method: HdpMethod 
•  uri: URI 
•  parameters: Map[Symbol, String]  
•  headers: HdpHeaders  
•  content: Op]on[ByteChunk] 
•  …  
HdpResponse 
•  status: HdpStatus 
•  headers: HdpHeaders 
•  content: Op]on[ByteChunk] 
•  … 
ByteChunk 
trait Chunk[T]{ 
  def data: T 
  def next: Opvon[Future[Chunk[T]]] 
} 
type ByteChunk = Chunk[Array[Byte]] 
Получение всего контента запроса 
 path("/emails/") { 
      aggregate(None){ 
       get { request: H"pRequest[ByteChunk] => 
            Future.async{ 
                      … 
              HdpResponse(content = Some(JArray(emailIds))) 
            } 
        } 
      } 
    } 
Бизнесс данные 
•  Explicitly: 
   post { request: H"pRequest[ByteChunk] => 
        val bijecvon = BijecvonsChunkJson.ChunkToJValue 
        val emailId = request.content.map(bijec]on(_)) 
        ... 
        Future.sync(HdpResponse(content = Some(bijec]on.Inverse(emailObj)))) 
   } 

•  Implicitly: 
trait EmailServices extends BlueEyesServiceBuilder with Bijec]onsChunkJson 
… 
   contentType(MimeTypes.applica]on/MimeTypes.json) { 
     post { request: H"pRequest[JValue] => 
        val emailId = request.content 
        ... 
        Future.sync(HdpResponse(content = Some(emailObj))) 
     } 
  } 
Расширение сирвисов 
•  Фабрики сервис дескрипторов 
•  Logging 
•  Health monitors 
•  Request logging 
Logging 
trait LogDemo extends BlueEyesServiceBuilder { 
       val logDemoService = service("logdemo", "1.32") { 
        logging { log => 
          context => 
            startup { 
            request { state => 
              path("/foo") { 
                contentType(applicavon/json) { 
                  get { request => 
                    log.info("request at /foo") 
                    ... 
                  } 
                } 
              } 
            } 
        } 
     } 
Request Logging (W3C Extended Log 
                 format) 
trait RequestLogDemo extends BlueEyesServiceBuilder { 
       val requestLogDemoService = service("requestlogdemo", "1.32") { 
        requestLogging{ 
          context => 
            startup { 
            request { state => 
              path("/foo") { 
                contentType(applicavon/json) { 
                  get { request => 
                    ... 
                  } 
                } 
              } 
            } 
        } 
     } 

“requestLog” секция: 
"enabled           = true | false" ( default = true ) 
   "fields            = see W3C Extended Log format" 
   "roll              = "never" | "hourly" | "daily" | "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | 
       "saturday" " ( default = "never") 
   "file              = path to log file" 
   "writeDelaySeconds = delay between flush to file" ( default = 1 ) 
Health Monitor 
•  /blueeyes/services/[serviceName]/
   v[serviceMajorVersion]/health 
trait HealthMonitorDemo extends BlueEyesServiceBuilder { 
        val healthMonitorService = service("healthmon", "1.32") { 
         healthMonitor { monitor => 
           context => 
             request { state => 
               path("/foo") { 
                 contentType(applicavon/json) { 
                   get { request => 
                     monitor.vme(".requests.foo.vming") { 
                       ... 
                     } 
                   } 
                 } 
               } 
             } 
         } 
      } 
HdpClient 
•  HdpClient 
•  HdpClientXLightWebEngines 
val responseFuture = client.get("hdp://myservice.com/foo") 
    responseFuture map {response => response.content.get} 

def myService: HdpClient[JValue] = client.path("hdp://
   myservice.com/").contentType[JValue](applicavon/json) 

    val responseFuture = myService.get("api/v1") 
    responseFuture map {response => response.content.get} 
Тестирваоние 
•  Полная потдержка Scala Specs 
•  Не требует старта сервера 
Пример простого теста 
class EmailServicesSpec extends BlueEyesServiceSpecifica]on with 
      EmailServices { 
      "EmailService" should { 
        "get emails" in { 
          val f = service.contentType[JValue](applicavon/json).get("/emails") 
          f.value must eventually(beSomething) 

          val response = f.value.get 
          response.status mustEqual(HdpStatus(OK)) 
        } 
      } 
    } 
Запуск сервиса 
object AppServer extends BlueEyesServer with EmailServices 
  with OrderProcessingServices with LoginServices with 
  CatalogServices 

val startFuture = AppServer .start 
val stopFuture = AppServer .stop 

java ‐jar appserver.jar ‐‐configFile /etc/default/appserver.conf 
Данные 
•  Библиотека JSON 
MongoDB 
•  BlueEyes MongoDB QL 
•  Потдержка Mock MongoDB   

Más contenido relacionado

Destacado

Eclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and AcceleoEclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and Acceleofmadiot
 
Zasfgwhistle
ZasfgwhistleZasfgwhistle
ZasfgwhistleBroFuller
 
Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100Иван Федяков
 
Տարեկան հաշվետվություն
Տարեկան հաշվետվությունՏարեկան հաշվետվություն
Տարեկան հաշվետվությունtopchik
 
Ruby紹介3(pdf)
Ruby紹介3(pdf)Ruby紹介3(pdf)
Ruby紹介3(pdf)Gohryuh
 
ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์nattarikaii
 
Destroyer paper model manual
Destroyer paper model manualDestroyer paper model manual
Destroyer paper model manualGenesis1A
 
Lokale politiek en social media; D66 de Kempen
Lokale politiek en social media; D66 de KempenLokale politiek en social media; D66 de Kempen
Lokale politiek en social media; D66 de KempenKamsteeg Executive Search
 
Comites proyectos y celebraciones
Comites proyectos y celebracionesComites proyectos y celebraciones
Comites proyectos y celebracioneshildebon
 
Kongo manual new
Kongo manual newKongo manual new
Kongo manual newGenesis1A
 
เทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิวเทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิวNart-Anong Srinak
 
IEAエネルギー技術展望2010
IEAエネルギー技術展望2010IEAエネルギー技術展望2010
IEAエネルギー技術展望2010Hiroyuki Kita
 
Шелехов, Online FAQ 2011
Шелехов, Online FAQ 2011Шелехов, Online FAQ 2011
Шелехов, Online FAQ 2011Ruslan Shelekhov
 
CONSTRUÇÃO DE UM MURO DE ARRIMO
CONSTRUÇÃO DE UM MURO DE ARRIMOCONSTRUÇÃO DE UM MURO DE ARRIMO
CONSTRUÇÃO DE UM MURO DE ARRIMOMarco Coghi
 
Obserwacja bociana białego 2
Obserwacja bociana białego 2Obserwacja bociana białego 2
Obserwacja bociana białego 2Anna Muzyka
 
Wk hoofdstuk 27
Wk hoofdstuk 27Wk hoofdstuk 27
Wk hoofdstuk 27aphroditje
 

Destacado (20)

Eclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and AcceleoEclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and Acceleo
 
Zasfgwhistle
ZasfgwhistleZasfgwhistle
Zasfgwhistle
 
Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100
 
Տարեկան հաշվետվություն
Տարեկան հաշվետվությունՏարեկան հաշվետվություն
Տարեկան հաշվետվություն
 
Ruby紹介3(pdf)
Ruby紹介3(pdf)Ruby紹介3(pdf)
Ruby紹介3(pdf)
 
ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์
 
Destroyer paper model manual
Destroyer paper model manualDestroyer paper model manual
Destroyer paper model manual
 
PMO em Lisarb
PMO em LisarbPMO em Lisarb
PMO em Lisarb
 
Lokale politiek en social media; D66 de Kempen
Lokale politiek en social media; D66 de KempenLokale politiek en social media; D66 de Kempen
Lokale politiek en social media; D66 de Kempen
 
Comites proyectos y celebraciones
Comites proyectos y celebracionesComites proyectos y celebraciones
Comites proyectos y celebraciones
 
Kongo manual new
Kongo manual newKongo manual new
Kongo manual new
 
Get Green
Get GreenGet Green
Get Green
 
เทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิวเทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิว
 
IEAエネルギー技術展望2010
IEAエネルギー技術展望2010IEAエネルギー技術展望2010
IEAエネルギー技術展望2010
 
Шелехов, Online FAQ 2011
Шелехов, Online FAQ 2011Шелехов, Online FAQ 2011
Шелехов, Online FAQ 2011
 
CONSTRUÇÃO DE UM MURO DE ARRIMO
CONSTRUÇÃO DE UM MURO DE ARRIMOCONSTRUÇÃO DE UM MURO DE ARRIMO
CONSTRUÇÃO DE UM MURO DE ARRIMO
 
Quản trị chiến lược chuẩn
Quản trị chiến lược chuẩnQuản trị chiến lược chuẩn
Quản trị chiến lược chuẩn
 
Obserwacja bociana białego 2
Obserwacja bociana białego 2Obserwacja bociana białego 2
Obserwacja bociana białego 2
 
Slideshareflickr
SlideshareflickrSlideshareflickr
Slideshareflickr
 
Wk hoofdstuk 27
Wk hoofdstuk 27Wk hoofdstuk 27
Wk hoofdstuk 27
 

Similar a BlueEyes russian

automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...HappyDev
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практикеVitebsk Miniq
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Yulia Tsisyk
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Web весна 2013 лекция 10
Web весна 2013 лекция 10Web весна 2013 лекция 10
Web весна 2013 лекция 10Technopark
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 
ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.chester_ds
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11dva
 
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...GeeksLab Odessa
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...Ontico
 

Similar a BlueEyes russian (20)

automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 
My batis
My batisMy batis
My batis
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
 
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
Юлия Цисык «RESTFul API в вашем.NET приложении: как, зачем и почему?»
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Web весна 2013 лекция 10
Web весна 2013 лекция 10Web весна 2013 лекция 10
Web весна 2013 лекция 10
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
 
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
 

BlueEyes russian