Lineにおけるspring frameworkの活用

14,449 views

Published on

spring day 2016

Published in: Technology
0 Comments
41 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
14,449
On SlideShare
0
From Embeds
0
Number of Embeds
3,734
Actions
Shares
0
Downloads
37
Comments
0
Likes
41
Embeds 0
No embeds

No notes for slide

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.

×