SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
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   

Contenu connexe

En vedette

Eclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and AcceleoEclipse Party Toulouse - EEF and Acceleo
Eclipse Party Toulouse - EEF and Acceleo
fmadiot
 
Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100Презентация - INFOLine Retailer Russia TOP-100
Презентация - INFOLine Retailer Russia TOP-100
Иван Федяков
 
ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์ระบบคอมพิวเตอร์
ระบบคอมพิวเตอร์
nattarikaii
 
Destroyer paper model manual
Destroyer paper model manualDestroyer paper model manual
Destroyer paper model manual
Genesis1A
 
Comites proyectos y celebraciones
Comites proyectos y celebracionesComites proyectos y celebraciones
Comites proyectos y celebraciones
hildebon
 
Kongo manual new
Kongo manual newKongo manual new
Kongo manual new
Genesis1A
 
เทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิวเทคโนโลยีสารสนเทศหลิว
เทคโนโลยีสารสนเทศหลิว
Nart-Anong Srinak
 
IEAエネルギー技術展望2010
IEAエネルギー技術展望2010IEAエネルギー技術展望2010
IEAエネルギー技術展望2010
Hiroyuki Kita
 
Wk hoofdstuk 27
Wk hoofdstuk 27Wk hoofdstuk 27
Wk hoofdstuk 27
aphroditje
 

En vedette (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
 

Similaire à BlueEyes russian

2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
HappyDev
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
Technopark
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn
 
Web весна 2013 лекция 10
Web весна 2013 лекция 10Web весна 2013 лекция 10
Web весна 2013 лекция 10
Technopark
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.ProveIT. ETL как конструктор алгоритмов обработки данных.
ProveIT. ETL как конструктор алгоритмов обработки данных.
chester_ds
 
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
 
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
Многофункциональный сервер приложений, обеспечивающий среду запуска, и дающий...
GeeksLab Odessa
 
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...OpenResty: превращаем NGINX в полноценный сервер приложений  / Владимир Прота...
OpenResty: превращаем NGINX в полноценный сервер приложений / Владимир Прота...
Ontico
 

Similaire à 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