gRPCを使ってあそんでみるの目的
ログデータを永続化するgRPCサービスを立ち上げログを記録する。
今回のお題
ログを記録するgRPCサービスを構築し起動する。
■事前環境
・Windows10 バージョン21H2
・IntelliJ IDEA 2022.1.4(Community Edition)
・OpenJDK Runtime Environment Zulu17.36+17-CA (build 17.0.4.1+1-LTS)
・Gradle
1.IDLのクラスをプロジェクトに追加
環境構築編の続きとなります。
生成されたIDLクラスをプロジェクトに追加します。
sourceSets {
main {
java {
srcDirs 'build/generated/source/proto/main/grpc'
srcDirs 'build/generated/source/proto/main/java'
}
}
}
2.サービスクラスを実装
リクエストされた、ステータスとメッセージをログに書き込むサービスになります。
サーバにサービスとして登録することで利用できるようになります。
サービスは環境構築編でProtoファイルに記載したパッケージ名、サービス名の組合わせで生成される〇〇〇ImpBaseをimplementsして実装します。
[java_packag].[サービス名]Grpc.LoggingImplBase
ソース詳細
package logging;
import io.grpc.stub.StreamObserver;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import logging.proto.Logging;
import logging.proto.LoggingServiceGrpc;
public class LoggingService extends LoggingServiceGrpc.LoggingServiceImplBase {
private final Logger logger;
LoggingService(final String path) {
this.logger = Logger.getLogger(LoggingService.class.getName());
try {
FileHandler fileHandler = new FileHandler(path);
fileHandler.setFormatter(new SimpleFormatter());
this.logger.addHandler(fileHandler);
}catch(Exception e){
System.out.println(e.toString());
}
}
@Override
public void write(Logging.LoggingRequest request, StreamObserver<Logging.LoggingResponse> responseObserver) {
Logging.LoggingResponse loggingResponse = Logging.LoggingResponse.newBuilder().setStatus("OK").build();
// ログへメッセージの書き込み
this.logger.info(request.getMessage());
responseObserver.onNext(loggingResponse);
responseObserver.onCompleted();
}
}
3.サーバ起動クラスを作成
ポート8080で待ち受けしd:\server.logにログを出力するようにしてます。
addServiceにてサーバに2で作成したサービスを登録しています。
package logging;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;
public class ServerMain {
public static void main(String[] args) throws IOException, InterruptedException {
final String path = "d:\\server.log";
final int port = 8080;
Server server = ServerBuilder.forPort(port)
.addService(new LoggingService(path))
.build();
server.start();
System.out.println("start server on port:" + port);
server.awaitTermination();
}
}
4.サービスを実行
ServerMainクラスを実行します。
8080ポートで待ち受け実行されます。
> Task :ServerMain.main()
start server on port:8080
参考
今回、利用したソース一式です。
https://github.com/shigemax999/sample-grpc-logging