blueeyes russian

24
BlueEyes Michael Lagutko @mlagutko

Upload: misha-socialmedia

Post on 26-May-2015

749 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: BlueEyes russian

BlueEyes 

Michael Lagutko @mlagutko 

Page 2: BlueEyes russian

Цели 

•  Создание RESTful сервисов •  Высокая производительность (асинхронная обработка запросов) 

• Масштабируемость (отсутствие поддержки состояния) 

•  Автомотическое тестирование (Независимость от сервера) 

Page 3: BlueEyes russian

Service 

•  BlueEyesServiceBuilder •  Комбинаторы оброботчиков запросов •  Уникальное имя и версия  • Жизненный цикл 

•  Контекст 

Page 4: BlueEyes russian

Жизненный цикл сервиса 

•  Старт •  Обработка запросов •  Остановка 

Page 5: BlueEyes russian

Комбинаторы оброботчиков запросов 

•  path(*padern*) { ... } •  contentType(*mimeType*) { ... } •  get { ... } •  put { ... } •  post { ... } •  delete { ... } •  … path("/emails"){   get { request =>          val response = H"pResponse(content = Some(emailIds))           Future.sync{response }       }     } 

Page 6: BlueEyes russian

Комбинаторы путей 

•  Строковый: "/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)             ...           }         }       }     } 

Page 7: BlueEyes russian

Комбинации оброботчиков запросов 

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               ...             }           }         }       }     } 

Page 8: BlueEyes russian

Контекст 

•  Конфигурация •  Имя сервиса •  Версия сервиса 

Page 9: BlueEyes russian

Простой сервис 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     }   } } 

Page 10: BlueEyes russian

HdpRequest 

• method: HdpMethod •  uri: URI •  parameters: Map[Symbol, String]  

•  headers: HdpHeaders  •  content: Op]on[ByteChunk] •  …  

Page 11: BlueEyes russian

HdpResponse 

•  status: HdpStatus •  headers: HdpHeaders •  content: Op]on[ByteChunk] •  … 

Page 12: BlueEyes russian

ByteChunk 

trait Chunk[T]{   def data: T 

  def next: Opvon[Future[Chunk[T]]] 

type ByteChunk = Chunk[Array[Byte]] 

Page 13: BlueEyes russian

Получение всего контента запроса 

 path("/emails/") {       aggregate(None){        get { request: H"pRequest[ByteChunk] =>             Future.async{                       …               HdpResponse(content = Some(JArray(emailIds)))             }         }       }     } 

Page 14: BlueEyes russian

Бизнесс данные 

•  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)))      }   } 

Page 15: BlueEyes russian

Расширение сирвисов 

•  Фабрики сервис дескрипторов •  Logging •  Health monitors 

•  Request logging 

Page 16: BlueEyes russian

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")                     ...                   }                 }               }             }         }      } 

Page 17: BlueEyes russian

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 ) 

Page 18: BlueEyes russian

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") {                        ...                      }                    }                  }                }              }          }       } 

Page 19: BlueEyes russian

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} 

Page 20: BlueEyes russian

Тестирваоние 

•  Полная потдержка Scala Specs •  Не требует старта сервера 

Page 21: BlueEyes russian

Пример простого теста 

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)) 

        }       } 

    } 

Page 22: BlueEyes russian

Запуск сервиса 

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 

Page 23: BlueEyes russian

Данные 

•  Библиотека JSON 

Page 24: BlueEyes russian

MongoDB 

•  BlueEyes MongoDB QL •  Потдержка Mock MongoDB