- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (17)
- Development
- Business
※弊社エンジニアの記事になります。
はじめに
業務でSpringBootでREST APIの開発を行っていたのですが、マイクロサービス化するに当たりgRPCを利用して開発することになりました。そこで個人勉強として簡単なサービスを作ったので記録します。
SpringBootでgRPCを実装して、gRPCの4つの通信方式まで実際にやってみます。この記事の内容を上から行うとspring boot+gRPCで動く環境が作れます。
プロジェクトの作成
https://start.spring.io/ でプロジェクトを作成します。依存関係の追加は不要です。ProjectはMavenを選択してください。
ダウンロード&解凍を行い、pom.xml を修正します。
pom.xmlの修正
ダウンロードして解凍したプロジェクトにある、pom.xml を修正してgRPCとSpringBootを利用できるようにしていきます。
最初はgRPC対応です。dependencyを追加してライブライのダウンロードを行います。
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.57.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.57.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.57.0</version>
</dependency>
<dependency> <!-- necessary for Java 9+ -->
<groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId>
<version>6.0.53</version>
<scope>provided</scope>
</dependency><dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.57.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.57.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.57.0</version>
</dependency>
<dependency> <!-- necessary for Java 9+ -->
<groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId>
<version>6.0.53</version>
<scope>provided</scope>
</dependency>
pluginの追加
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.23.4:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.57.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.7.1</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.23.4:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.57.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
これでjavaでgPRCが使えるようになりました。次にspring bootで利用できるようにします。
<dependency>
<groupId>io.github.lognet</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>io.github.lognet</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>5.1.3</version>
</dependency>
これでpom.xmlは準備完了です。
protoファイルの作成
src/main配下にprotoフォルダを作成し、Greeter.protoファイルを作成して下記の内容を記述。
syntax = "proto3";
package com.example;
service Greeter {
// Unary RPC (単一リクエスト, 単一レスポンス)
rpc SayHelloUnary (GreeterRequest) returns (GreeterReply) {}
// Server streaming RPC (単一リクエスト, 複数レスポンス)
rpc SayHelloServerStreaming (GreeterRequest) returns (stream GreeterReply) {}
// Client streaming RPC (複数リクエスト, 単一レスポンス)
rpc SayHelloClientStreaming (stream GreeterRequest) returns (GreeterReply) {}
// Bidirectional streaming RPC (複数リクエスト, 複数レスポンス)
rpc SayHelloBidirectionalStreaming (stream GreeterRequest) returns (stream GreeterReply) {}
}
// ユーザ名を含むリクエスト
message GreeterRequest {
string name = 1;
}
// Hello,を含むレスポンス
message GreeterReply {
string message = 1;
}
syntax = "proto3";
package com.example;
service Greeter {
// Unary RPC (単一リクエスト, 単一レスポンス)
rpc SayHelloUnary (GreeterRequest) returns (GreeterReply) {}
// Server streaming RPC (単一リクエスト, 複数レスポンス)
rpc SayHelloServerStreaming (GreeterRequest) returns (stream GreeterReply) {}
// Client streaming RPC (複数リクエスト, 単一レスポンス)
rpc SayHelloClientStreaming (stream GreeterRequest) returns (GreeterReply) {}
// Bidirectional streaming RPC (複数リクエスト, 複数レスポンス)
rpc SayHelloBidirectionalStreaming (stream GreeterRequest) returns (stream GreeterReply) {}
}
// ユーザ名を含むリクエスト
message GreeterRequest {
string name = 1;
}
// Hello,を含むレスポンス
message GreeterReply {
string message = 1;
}
コメントを入れているのでわかるかと思いますが、複数のリクエスト/レスポンスの場合はstreamをつけることで可能です。
gRPCサーバ
gRPCのリクエストを受け付けるアプリケーションサーバを実装します。
src/main配下にsrviceフォルダを作成し、GreeterImpl.javaファイルを作成して下記の内容を記述。
…
記事の続きは下のリンクをクリック!
https://rightcode.co.jp/blog/information-technology/grpc-spring-boot
【2024年卒】新卒採用エントリー開始しました!
特設ページはこちら:https://rightcode.co.jp/recruit/entry-2024
インターン募集!未経験ok、チャレンジ精神ある方求む
メディア運営:https://rightcode.co.jp/recruit/intern-media
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「スマホアプリエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「エンジニアリングマネージャー」「営業」などを積極採用中です!
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
【コーポレートサイト】https://rightcode.co.jp/
【採用募集】https://rightcode.co.jp/recruit(こちらからの応募がスムーズ)
【wantedlyぺージ】https://www.wantedly.com/companies/rightcode