gRPC
gRPC
gRPCλ κ³ μ±λ₯ μ€ν μμ€ λ²μ© RPC νλ μ μν¬μ λλ€.
Installation
μμνκΈ° μ μ νμν ν¨ν€μ§λ₯Ό μ€μΉν΄μΌν©λλ€.
Transporter
gRPC μ μ‘κΈ°λ‘ μ ννλ €λ©΄ createMicroservice()
λ©μλμ μ λ¬λ μ΅μ
κ°μ²΄λ₯Ό μμ ν΄μΌ ν©λλ€.
info ννΈ
join()
ν¨μλpath
ν¨ν€μ§μμ κ°μ Έμ€κ³Transport
μ΄κ±°λ@nestjs/microservices
μμ μ¨ κ²μ λλ€.
Options
μ μ‘κΈ° λμμ κ²°μ νλ μ¬μ© κ°λ₯ν μ΅μ μ΄ λ§μ΄ μμ΅λλ€.
Overview
μΌλ°μ μΌλ‘ package
μμ±μ protobuf ν¨ν€μ§ μ΄λ¦μ μ€μ νκ³ protoPath
λ.proto
μ μ νμΌμ κ²½λ‘μ
λλ€. hero.proto
νμΌμ νλ‘ν μ½ λ²νΌ μΈμ΄λ₯Ό μ¬μ©νμ¬ κ΅¬μ±λ©λλ€.
μμ μμμ, μ°λ¦¬λ HeroById
λ₯Ό μ
λ ₯μΌλ‘ μμνκ³ Hero
λ©μμ§λ₯Ό 리ν΄νλ FindOne()
gRPC νΈλ€λ¬λ₯Ό λ
ΈμΆνλ HeroService
λ₯Ό μ μνμ΅λλ€. μ΄ νλ‘ν νμ
μ μλ₯Ό μΆ©μ‘±μν€λ νΈλ€λ¬λ₯Ό μ μνλ €λ©΄ @GrpcMethod()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν΄μΌν©λλ€. μ΄μ μ μλ €μ§ @MessagePattern()
μ λ μ΄μ μ μ©νμ§ μμ΅λλ€.
info ννΈ
@GrpcMethod()
λ°μ½λ μ΄ν°λ@nestjs/microservices
ν¨ν€μ§μμ κ°μ Έμ΅λλ€.
HeroService
λ μλΉμ€ μ΄λ¦μΈ λ°λ©΄, FindOne
μ FindOne()
gRPC νΈλ€λ¬λ₯Ό κ°λ¦¬ν΅λλ€. ν΄λΉνλ findOne()
λ©μλλ λκ°μ§ μΈμ, μ¦ νΈμΆμλ‘λΆν° μ λ¬λ data
μ gRPC μμ²μ λ©ν λ°μ΄ν°λ₯Ό μ μ₯νλ metadata
λ₯Ό μ·¨ν©λλ€.
λν, FindOne
μ μ€μ λ‘ μ¬κΈ°μ μ€λ³΅λ©λλ€. @GrpcMethod()
μ λ λ²μ§Έ μΈμλ₯Ό μ λ¬νμ§ μμΌλ©΄ Nestλ μλμΌλ‘ 첫 λ²μ§Έ λ¬Έμ (μ :findOne
->FindOne
)μ ν¨κ» λ©μλ μ΄λ¦μ μ¬μ©ν©λλ€.
λ§μ°¬κ°μ§λ‘ μΈμλ₯Ό μ λ¬νμ§ λͺ»ν μλ μμ΅λλ€. μ΄ κ²½μ° Nestλ ν΄λμ€ μ΄λ¦μ μ¬μ©ν©λλ€.
Client
ν΄λΌμ΄μΈνΈ μΈμ€ν΄μ€λ₯Ό λ§λ€λ €λ©΄ @Client()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μ΄μ μμ λΉκ΅νμ¬ μ½κ°μ μ°¨μ΄κ° μμ΅λλ€. ClientProxy
ν΄λμ€ λμ , getService()
λ©μλλ₯Ό μ 곡νλ ClientGrpc
λ₯Ό μ¬μ©ν©λλ€. getService()
μ λ€λ¦ λ©μλλ μλΉμ€ μ΄λ¦μ μΈμλ‘ μ¬μ©νκ³ κ°λ₯ν κ²½μ° ν΄λΉ μΈμ€ν΄μ€λ₯Ό λ°νν©λλ€.
heroService
κ°μ²΄λ .proto
νμΌ λ΄μ μ μλ κ²κ³Ό λμΌν λ©μλ μΈνΈλ₯Ό λ
ΈμΆν©λλ€. λͺ¨λ κ·μΉμ μλ¬Έμ (μμ° κ·μΉμ λ°λ₯΄κΈ° μν΄)μ
λλ€. κΈ°λ³Έμ μΌλ‘ gRPC HeroService
μ μμλ FindOne()
ν¨μκ° ν¬ν¨λμ΄ μμ΅λλ€. heroService
μΈμ€ν΄μ€λ findOne()
λ©μλλ₯Ό μ 곡νλ€λ μλ―Έμ
λλ€.
λͺ¨λ μλΉμ€ λ©μλλ Observable
μ 리ν΄ν©λλ€. Nestλ RxJS μ€νΈλ¦Όμ μ§μνκ³ μ μλνλ―λ‘ HTTP μ²λ¦¬κΈ° λ΄μμλ λ°νν μ μμ΅λλ€.
μ 체 μμ μλ μ¬κΈ°μμ νμΈν μ μμ΅λλ€.
gRPC Streaming
GRPC μ체λ μ€νΈλ¦Ό
μΌλ‘ μλ €μ§ λ‘±ν
λΌμ΄λΈ μ°κ²°μ μ§μν©λλ€. μ€νΈλ¦Όμ μ±ν
, κ΄μ°° λλ μ²ν¬ λ°μ΄ν° μ μ‘κ³Ό κ°μ μλΉμ€ μ¬λ‘μ λ§€μ° μ μ©ν λκ΅¬κ° λ μ μμ΅λλ€. 곡μ λ¬Έμ (μ¬κΈ°)μμ μμΈν λ΄μ©μ νμΈν μ μμ΅λλ€.
Nestλ λ κ°μ§ λ°©λ²μΌλ‘ GRPC μ€νΈλ¦Ό νΈλ€λ¬λ₯Ό μ§μν©λλ€.
RxJS
Subject
+Observable
νΈλ€λ¬: Controller λ©μλ λ΄μμ λ°λ‘ μλ΅μ μ°κ±°λSubject
/Observable
μλΉμμκ² μ λ¬νλ λ° μ μ© ν μ μμ΅λλ€μμ GRPC νΈμΆ μ€νΈλ¦Ό νΈλ€λ¬: λ Έλ νμ€
Duplex
μ€νΈλ¦Ό νΈλ€λ¬μ λν λλ¨Έμ§ λμ€ν¨μΉλ₯Ό μ²λ¦¬νλ μΌλΆ μ€νκΈ°μ μ λ¬νλ λ° μ μ© ν μ μμ΅λλ€.
Subject strategy
@GrpcStreamMethod()
λ°μ½λ μ΄ν°λ ν¨μ λ§€κ° λ³μλ₯Ό RxJS Observable
λ‘ μ 곡ν©λλ€.
@GrpcStreamMethod()
λ°μ½λ μ΄ν°μμ μ μ΄μ€ μνΈ μμ©μ μ§μνλ €λ©΄ 컨νΈλ‘€λ¬ λ©μλμμ RxJS 'Observable'μ λ°νν΄μΌ ν©λλ€.
Pure GRPC call stream handler
@GrpcStreamCall()
λ°μ½λ μ΄ν°λ grpc.ServerDuplexStreamκ³Ό κ°μ ν¨μ λ§€κ° λ³μλ₯Ό μ 곡νλ©° .on('data',callback)
, .write(message)
λλ .cancel()
κ³Ό κ°μ νμ€ λ©μλλ₯Ό μ§μν©λλ€. μ¬μ© κ°λ₯ν λ°©λ²μ λν μ 체 μ€λͺ
μλ μ¬κΈ°μμ μ°Ύμ μ μμ΅λλ€.
μ΄ λ°μ½λ μ΄ν°μλ νΉμ λ¦¬ν΄ λ§€κ° λ³μλ₯Ό μ 곡ν νμκ° μμ΅λλ€. μ€νΈλ¦Όμ λ€λ₯Έ νμ€ μ€νΈλ¦Ό μ νκ³Ό κ°μ λ°©μμΌλ‘ μ²λ¦¬λ κ²μΌλ‘ μμλ©λλ€.
Last updated