Help us understand the problem. What is going on with this article?

Finatra やるぞい (①セットアップ編)

More than 1 year has passed since last update.

レポジトリ

https://github.com/eddix-ibanez/twitter-clone-finatra

Finatraとは

公式 から引用

Finatra is a Scala services framework built on top of TwitterServer and Finagle.

twitterが開発している tiwtterServerFinagle を土台にしてでできたフレームワークです。

セットアップ

めっちゃセットアップが楽です。コピペでローカルは立ち上がります。(例外があったらすみません)
こちらを参考にしました:https://qiita.com/TakashiOshikawa/items/53dcc42f0ab6c6377f7a
メモとしても書いていくので参考にしていくソースものっけていきます。(Githubのissueとか)

環境

  • MacOS X
  • Intellij IDEA (*)
  • sbt

(*) ターミナルからでも構築できます。

プロジェクト作成

2つ方法を紹介します。

intellijを使う

intelliJに Scalaプラグインを導入

intellijを開いて ⌘, を叩くと設定画面が出てくるので左上の検索窓にpluginsと入力してEnter
次に真ん中の検索窓にScalaと入力しEnter
でできましたこいつです。

スクリーンショット 2019-03-03 18.19.00.png

インストールクリックして右下のapplyを押せば完了。

再起動してプロジェクトを作成

この画面が表示されるので + Create New Project を押下。

スクリーンショット 2019-03-03 18.31.40.png

左側から scala を選択すると真ん中に選択肢が出てきます。

スクリーンショット 2019-03-03 18.39.47.png

stb を選択して Next を押下するとプロジェクトの名前やディレクトリを尋ねられるので適当に入力して進んでください。
するとエディタ画面になって勝手にディレクトリ構造ができています。

スクリーンショット 2019-03-03 18.40.59.png

ビルド定義

次にベースディレクトリ直下にある build.sbt に次のコードをコピペしてください。すでに出来ているコードもいりません。

build.sbt
lazy val root = (project in file(".")).
  settings(
    name := "twitter-clone",
    scalaVersion := "2.12.8",
    libraryDependencies ++= dervy,
    resolvers ++= resolve
  )

lazy val dervy = {
  Seq(
    "com.twitter" %% "finatra-http" % "19.2.0"
  )
}

lazy val test = {
  Seq("com.twitter" %% "finatra-http" % "19.2.0" % "test" classifier "tests")
}

lazy val resolve = {
  Seq(
    Resolver.sonatypeRepo("releases"),
    "Twitter Maven" at "https://maven.twttr.com"
  )
}

これで保存すると右下にSync dependencyとかなんかニョキッと出てくるのでSync(同期)する方を押してください。IntelliJが勝手にfinatraの依存関係を注入(同期)してくれます。
次の項目は飛ばしてください。

sbt new する

好きなディレクトリで

sbt new robinske/hello-finatra.g8

プロジェクト名を聞かれますがここも好きにしてください。
するとこんな感じ。

himatra/
├── build.sbt
├── project
│   └── build.properties
└── src
    └── main
        ├── resources
        │   └── logback.xml
        └── scala
            └── Server.scala

サーバーの起動、ルーティング処理を追加

./src/main/scara/main.scalaに以下のコードをコピペしてください。

main.scala
import com.twitter.finagle.Http
import com.twitter.finagle.http.Request
import com.twitter.finagle.stats.NullStatsReceiver
import com.twitter.finagle.tracing.NullTracer
import com.twitter.finatra.http.filters.HttpResponseFilter
import com.twitter.finatra.http.routing.HttpRouter
import com.twitter.finatra.http.{Controller, HttpServer}

object Main extends FinatraBenchmarkServer

class FinatraBenchmarkServer extends HttpServer {
  // 色々な設定項目はBaseHttpServerを参照
  // override def defaultFinatraHttpPort: String = ":9000"
  // override def defaultHttpServerName: String = "0.0.0.0"

  override def configureHttpServer(server: Http.Server) = {
    server
      .withCompressionLevel(0)
      .withStatsReceiver(NullStatsReceiver)
      .withTracer(NullTracer)
  }

  override def configureHttp(router: HttpRouter): Unit = {
    router
      .filter[HttpResponseFilter[Request]]
      .add[FinatraBenchmarkController]
  }
}

class FinatraBenchmarkController extends Controller {
  private[this] val helloWorldResponseText = "Hello, World!"

  get("/json") { request: Request =>
    Map("message" -> "Hello, World!")
  }

  get("/plaintext") { request: Request =>
    helloWorldResponseText
  }
}

保存したらsbt shell (なかったら画面左下のそれっぽいとこをクリックして出てくる。) で

sbt:project-name> run -http.port=:9000 -http.name=:localhost

を叩く。

[info] Running Main -http.port=:9000 -http.name=:localhost

と出てきたらOK


SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

とか出てくるけど無視してオッケーです。

確認

自分はPostmanを使っています。cURLだとダメでした。
http://localhost:9000/jsonを叩いてみましょう。

スクリーンショット 2019-03-03 19.10.05.png

{"message":"Hello, World!"}と返ってきたら成功。

ちなみにヘッダは

header.txt
Date : Sun, 03 Mar 2019 07:00:03 GMT
Server : Finatra
Content-Length : 27
Content-Type : application/json; charset=utf-8

以上。

higherKindPudding
昔は Scala に憧れていたけど Scalaプロジェクトの負債化率を目の当たりにしてから考えを改めました、世界が TypeScript で統一される日が来ると信じてやまないフロント寄りの Web Developper. Next.js/Loopback Goアンチ。
https://guthub.com/kijimaru/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away