понедельник, июня 24, 2013

Минималистичный twitter finagle сервер

По мотивам http://twitter.github.io/twitter-server/index.html

1) Выкачиваем скрипт запуска sbt
curl -O https://raw.github.com/twitter/finagle/master/sbt
chmod 775 sbt

2) Создаем файл project/Build.scala для sbt
mkdir project
cat > project/Build.scala

import sbt._
import Keys._
import Tests._
import sbtassembly.Plugin._

object TestTwitterServer extends Build {

  lazy val testTwitterServer = Project(
    id = "test-twitter-server",
    base = file("."),
    settings = Project.defaultSettings ++
      assemblySettings
  ).settings(
    name := "test-twitter-server",
    libraryDependencies ++= Seq(
      "com.twitter" %% "twitter-server" % "1.0.1"
    ),
    resolvers += "twitter-repo" at "http://maven.twttr.com"

  )

}

CTRL-D

3) Создаем файл project/plugins.sbt для sbt
cat > project/plugins.sbt

resolvers += Resolver.url("sbt-plugin-releases", new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0")

CTRL-D

4) Создаем файл приложения app.scala

cat > app.scala

import com.twitter.conversions.time._
import com.twitter.finagle.http.HttpMuxer
import com.twitter.finagle.{Http, Service}
import com.twitter.server.TwitterServer
import com.twitter.util.{Await, Duration, Future, Time}
import java.net.InetSocketAddress
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import org.jboss.netty.handler.codec.http._
import org.jboss.netty.util.CharsetUtil.UTF_8

object AdvancedServer extends TwitterServer {

  val what = flag("what", "hello", "String to return")
  val addr = flag("bind", new InetSocketAddress(0), "Bind address")
  val durations = flag("alarms", (1.second, 5.second), "2 alarm durations")
  val counter = statsReceiver.counter("requests_counter")

  val service = new Service[HttpRequest, HttpResponse] {
    def apply(request: HttpRequest) = {
      log.debug("Received a request at " + Time.now)
      counter.incr()
      val response =
        new DefaultHttpResponse(request.getProtocolVersion, HttpResponseStatus.OK)
      val content = copiedBuffer(what() + "\n", UTF_8)
      response.setContent(content)
      Future.value(response)
    }
  }

  def main() {
    // We can create a new http server but in that case we profit from the
    // one already started for /admin/*
    // The `TwitterServer` trait exposes a `httpServer` that serve all routes
    // registered in the HttpMuxer object, we just have to add our own.
    HttpMuxer.addHandler("/echo", service)
    // And wait on the server
    Await.ready(httpServer)
  }
}

CTRL-D

5) Стартуем
$ ./sbt run

CTRL-C

6) Собираем в один jar
$ ./sbt assembly

Комментариев нет:

Мой список блогов