) PR o i hli fi l ) I R nH SR l o rLR+( e g e l +( H tuwJ a yG ld i • ,1B1# ) # # # D# # # D # 0C ### l ptuwJ i i fi • s c b LR v 9 JJUG CCC 2019 Spring #ccc_a1
l e / UWT N l . gab UWT p tP • P ( . / P l / A H NPL T A J l L . / P . UWT w E wEL . / . r LC • A . R O SI • . . / )/ + L o T 11 . / ( / P n JJUG CCC 2019 Spring #ccc_a1
@Override public StreamObserver fizBuzMany(StreamObserver responseObserver) { return new StreamObserver() { @Override public void onNext(InputNumber value) { // one by one data send. var answer = calc.calc(value.getNum()); responseObserver.onNext( FizBuzAnswer.newBuilder().setAnswer(answer).build()); } @Override public void onCompleted() { responseObserver.onCompleted(); } @Override public void onError(Throwable t) { t.printStackTrace(); } }; } 42 Bidirectional Streaming RPC(Server) JJUG CCC 2019 Spring #ccc_a1
JJUG CCC 2019 Spring #ccc_a1 Domain Logic gRPC Service Web Controller service message queue gRPC Stub JDBC Other service Database Kafka REST Other service Web Client External WebAPI
l - S CmsC PR B R C h gn S P CmsC • B iptb cotBr t P l . :: - S R D • : : :: / • : 2: / :: / • S : 2 P G vI L l S R • - . @ . @ N . / P B B td cot • . :: Nu - aC C y • - . @ t Cel CR 53 . :: - JJUG CCC 2019 Spring #ccc_a1
54 JJUG CCC 2019 Spring #ccc_a1 // GrpcService Spring Bean @GRpcService(interceptors = ValidationInterceptor.class) public class FizBuzReactorGrpcService extends ReactorFizBuzServiceGrpc.FizBuzServiceImplBase { // Spring Bean
l - 2 B https://github.com/grpc-ecosystem/grpc- gateway S 1 2 Rc ePurR w H fgR a tsPJ 2 R ). - h a • ( j N R aSiT RPC ySp • ) R aSp v Slo • . R a tsPJ HnGO 56 - 2 B JJUG CCC 2019 Spring #ccc_a1
l ) 1 . e PD )( ( J . 1 u J l O d P e )( ( lD . 1 t • 2 ai BPD p ) 1 . o D rD d ai P • BP Vfe DG m s P • n ) https://github.com/envoyproxy/protoc-gen-validate/ c i JP D J 65 ai JJUG CCC 2019 Spring #ccc_a1
l R l l 66 JJUG CCC 2019 Spring #ccc_a1 // validator.proto syntax = “proto3”; package validator; import “google/protobuf/descriptor.proto”; // range extend google.protobuf.FieldOptions { Range range = 50000; } // Range
message Range { int32 min = 1; int32 max = 2; } package my.rpc; //
proto import import "validator/validator.proto"; message InputNumber { // Range
int32 num = 1 [(validator.range) = {min:0, max:100}]; }
l NR s n Ev g u y D l R s , , h Ek E l llo Ee r SR n i c CD PD 71 SR S a JJUG CCC 2019 Spring #ccc_a1 gRPC Server A gRPC Server B DNS Consul Eureka,, Channel
JJUG CCC 2019 Spring #ccc_a1 API Gateway Browser REST gRPC gRPC gateway proto proto proto Spring boot gRPC envoy envoy Spring boot gRPC envoy Spring boot gRPC envoy Envoy