Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Lineにおけるspring frameworkの活用

23,845 views

Published on

spring day 2016

Published in: Technology
  • Be the first to comment

Lineにおけるspring frameworkの活用

  1. 1. LINE における Spring Framework の活⽤用 Tokuhiro Matsuno LINE Corp. Service development 1
  2. 2. お前誰よ? • LINE Corp. サービス開発1室 • LINE Bot SDK 開発まとめ • Java版実装 • LINE Notify 開発
  3. 3. LINE って Java のイ メージありますか??
  4. 4. 結構使われてるんですよ。 ↓ どのぐらい使われているのか? ↓ github enterprise を 検索してみた
  5. 5. CSS 4% HTML 4%Clojure 5%Perl 5% Objective-C 6% Shell 9% Python 10% JavaScript 18% Java 41%
  6. 6. "org.springframework spring- webmvc" で検索: 547 "spring-boot-starter-web" で検索: 285
  7. 7. Why Spring? • 開発のサイクルが(Java EE に⽐比べると)速い • Java EE は B2C のスケールが必要な Web サー ビスでの事例例をあまり聞かない • 社内に Java EE の経験ある⼈人が少ない
  8. 8. Microservices • 時代は Microservices • ⼩小さな application server の組み合わせでおおき なサービスを実現 → ⾔言語/フレームワークはある程度柔軟に
  9. 9. ⾔言語/フレームワークを 締め付けすぎない • ⼀一つの技術にのみコミットしすぎると変化に弱 くなる • spring, guice, Vert.x, Dagger2, avans,etc. • groovy, scala, … • golang, perl, python, …
  10. 10. There’s more than one way to do it
  11. 11. spring-boot は Microservice で使うには良いパーツ
  12. 12. なぜ spring-boot か? • uber jar でお⼿手軽に deploy できる • アプリケーションの開発がわりと簡単に開始で きる • XML 書かなくていい • Java のわりに 起動が速い
  13. 13. 開発事例例: LINE Notify
  14. 14. LINE Notify
  15. 15. curl -X POST -H 'Authorization: Bearer <ACCESS_TOKEN>' -F 'message=Hello' https://notify-api.line.me/api/notify
  16. 16. LINE Notify サーバー構成 MySQL MySQL API 1 API 2 Web 1 Web 2 Redis Redis
  17. 17. MySQL • MySQL 5.6 • InnoDB • MMM • 速い • 安い • うまい
  18. 18. Redis • Redis sentinel • KVS は基本的に Redis が ⼈人気 • 柔軟性 • パフォーマンス • 安定性 • 楽しい • Cache • Rate limit
  19. 19. nginx • ACL 管理理 • rewrite • Access log nginx jetty nginx jetty nginx jetty
  20. 20. Jetty • spring-boot-starter-jetty • コード読みやすい • 起動速い • 開発時に便便利利 • 開発時と本番で違う app server 使うとかイヤ • undertow よりも開発者多い
  21. 21. LINE ♥ Fluentd • アクセスログの集計 • http status コードの統計監視 • イベントログ • Fluency が最近は優勢 • 社内のおっきなストレージに保存
  22. 22. spring-boot 1.4.0.RELEASE • spring-boot-starter- web • spring-boot-starter- freemarker • spring-boot-starter- data-redis • spring-boot-starter- security • spring-boot-starter- mobile • mybatis-spring-boot- starter
  23. 23. spring-boot-starter-web • 安定している • @GetMapping, @PostMapping とか最近はいっ て便便利利 • 特に語ることがない。
  24. 24. spring-boot-starter- freemarker • freemarker 便便利利 • 社内では thymeleaf と⼈人気を⼆二分している。気が する。 • IDEA の補完が freemarker の⽅方が便便利利という説も? • 最近 Apache Incubator ⼊入り。 • 最近、⾃自動エスケープ⼊入った。(spring.ftl issue)
  25. 25. spring-boot-starter-redis • ⼊入れたら普通に使える • 特に問題なし。
  26. 26. spring-boot-starter-mobile • スマホかどうかを User-Agent で判定するのに利利 ⽤用 • ちょっと前だとタブレットと判定するかどうか みたいなのにうるさい⼈人がいたけど、最近はこ れぐらい雑でも⼤大丈夫。
  27. 27. mybatis-spring-boot-starter • 社内の O/R Mapper は mybatis 優勢 • JPA は少ない • B2C でトラフィック予測難しい • パフォーマンス問題起きたときの、MyBatis の安⼼心 感。 • MyBatis の XML をアップすると DBA がクエリ評価し てくれるサービス
  28. 28. MyBatis + Kotlin • XML ⾟辛い • Java アノテーションでも書けるけど⾟辛い • 複数⾏行行⽂文字列列書けない → 複雑なクエリが⾟辛い • そこで Kotlin ですよ!
  29. 29. @Mapper interface BlogDao { @Select(""" SELECT * FROM blog """) fun findAll(): List<Blog> @Select(""" SELECT * FROM blog WHERE id=#{id} """) fun findById(@Param("id") id: Long): Blog
  30. 30. なんで kotlin? • ぶっちゃけ groovy でも良かった • でも、時代の趨勢的に kotlin かなって
  31. 31. プロジェクト モジュール構成
  32. 32. line-notify-common • application.yml • logback-spring.xml line-notify-api line-notify-admin line-notify-webline-notify-test line-notify-model
  33. 33. Deploy & CI at LINE
  34. 34. Deploy • PMC という内製ツールでデプロイ • Shell script で rsync して再起動する Web UI • (規模が⼤大きいのでオンプレです)
  35. 35. デプロイ⽅方法 github jenkins nexus PMC App server Build jar & testing upload jar
  36. 36. 実⾏行行環境 • supervisord • java • nginx ⾃自動再起動
  37. 37. ブランチ構成は git flow? master beta Topic
  38. 38. LINEにおける アプリケーション モニタリング
  39. 39. Prometheus • クエリが使える TSDB • 1サーバーで千台規模を監視可能 • Pull型
  40. 40. Prometheus アーキテクチャ Prometheus node_exporter jmx_exporter java app node_exporter jmx_exporter java app httpd Pull grafana
  41. 41. node_exporter
  42. 42. jmx_exporter
  43. 43. Dropwizard metrics • アプリケーション固有のメトリクス値を取得す るのに利利⽤用 • jmx_exporter 経由で prometheus へ
  44. 44. LINE Bot + Spring Boot
  45. 45. LINE Messaging API • LINE のボットを簡単に作れる • 最⼤大優勝賞⾦金金1000万円の LINE BOT AWARDS も やってる • Java + spring-boot なら簡単につくれる
  46. 46. LINE Messaging SDK for Java • JSON をマッピングするためのクラス • HTTP Client library based on Retrofit • Servlet support • spring-boot support
  47. 47. なぜ spring-boot をサポート しているのか • 設定が簡単 • とりあえずすぐ起動できる • 使ってる⼈人が多い • AutoConfiguration まわりのサポートが簡単にで きる
  48. 48. spring-boot supports auto-configuration META-INF/spring.factories org.springframework.boot.autoconfigure.Enabl eAutoConfiguration= com.linecorp.bot.spring.boot.LineBotAutoConf iguration,com.linecorp.bot.spring.boot.LineB otWebMvcConfigurer
  49. 49. どのぐらい簡単に作れ るのか?
  50. 50. 依存を設定する <dependency>     <groupId>com.linecorp.bot</groupId>     <artifactId>line-bot-spring-boot</artifactId>     <version>1.3.0</version> </dependency>
  51. 51. @SpringBootApplication public class EchoApplication { public static void main(String[] args) { SpringApplication.run( EchoApplication.class, args); } }
  52. 52. @LineMessageHandler public class EchoHandler { @Autowired private LineMessagingService lineMessagingService; @EventMapping public void handle(MessageEvent<TextMessageContent> event) throws Exception { lineMessagingService.replyMessage(new ReplyMessage( event.getReplyToken(), singletonList( new TextMessage(event.getMessage().getText())))) .execute(); } }
  53. 53. jjug ccc 2016 fall で LINE Bot の live coding やり ます
  54. 54. ご清聴ありがとうございました。 懇親会までいるのでお気軽にお声が けください。 Bot についてのご質問にもお答えで きます。 We’re hiring.

×