Rust로 GRPC 서버 구축하기

단계별 가이드

Unsplash에서 Florian Krumm의 사진

배경 및 소개

RPC 대 JSON 대 SOAP

gRPC 및 Thrift 에 대해 알게 되면 더 전환적인 JSON 기반 REST API 또는 SOAP API 를 사용하는 것으로 돌아가기가 어렵습니다 .

잘 알려진 두 RPC 프레임워크인 gRPC와 Thrift는 많은 유사점이 있습니다. 전자는 Google에서, 후자는 Facebook에서 시작합니다. 둘 다 사용하기 쉽고 다양한 프로그래밍 언어를 지원하며 성능도 뛰어납니다.

가장 가치 있는 기능은 다국어 코드 생성과 서버 측 리플렉션입니다. 이것들은 API를 본질적으로 유형 안전하게 만듭니다. 서버 측 리플렉션을 사용하면 구현을 읽고 이해할 필요 없이 API의 스키마 정의를 훨씬 쉽게 탐색할 수 있습니다.

Grpc 대 절약

Apache Thrift 는 역사적으로 인기 있는 선택이었습니다. 그러나 최근 몇 년 동안 Facebook의 지속적인 지원 부족과 fbthrift 의 포크에 의한 파편화 로 인해 서서히 인기를 잃었습니다.

그동안 gRPC는 더 건강한 생태계로 점점 더 많은 기능을 따라 잡았습니다.

GRPC(파란색)와 Apache Thrift(빨간색)의 비교. 구글 트렌드
gRPC, fbThrift 및 Apache Thrift 간의 GitHub 스타 기록. https://star-history.com

현재로서는 귀하의 애플리케이션이 Facebook과 어떤 식으로든 제휴되어 있지 않다면 Thrift를 고려할 충분한 이유가 없습니다.

GraphQL은 어떻습니까?

GraphQL 은 Facebook에서 시작된 또 다른 프레임워크입니다. 위의 두 RPC 프레임워크와 많은 유사점을 공유합니다.

모바일 API 개발의 가장 큰 문제점 중 하나는 일부 사용자가 앱을 업그레이드하지 않는다는 것입니다. 이전 버전과의 호환성을 유지하기를 원하기 때문에 API에서 사용하지 않는 오래된 필드를 유지하거나 여러 버전의 API를 만들어야 합니다. GraphQL의 동기 중 하나는 그 문제를 해결하는 것이었습니다. "쿼리 언어"로 설계되었으며 클라이언트가 필요한 데이터 필드를 지정할 수 있습니다. 이렇게 하면 이전 버전과의 호환성을 더 쉽게 처리할 수 있습니다.

GraphQL은 모바일 API 및 공개 API(예: GitHub )를 개발하는 데 큰 가치가 있습니다. 두 경우 모두 클라이언트 동작을 쉽게 제어할 수 없었기 때문입니다.

그러나 웹 프론트엔드용 API 또는 내부 백엔드 서비스용 API를 구축하는 경우 gRPC보다 GraphQL을 선택하는 이점이 거의 없습니다.

녹

위는 지금까지 네트워킹 프레임워크에 대한 간략한 개요입니다. 네트워킹 외에도 애플리케이션 서버의 언어도 결정해야 합니다.

스택 오버플로 설문 조사 에 따르면 : "6년 동안 Rust는 가장 사랑받는 언어입니다." 유형 안전성, 우아한 메모리 관리, 광범위한 커뮤니티 지원 및 성능 덕분에 Rust는 비교적 가파른 학습 곡선에도 불구하고 백엔드 서비스 개발을 위한 매우 매력적이고 유망한 프로그래밍 언어입니다.

Rust는 가장 사랑받는 언어입니다. 2021년 스택오버플로 설문조사

또한 Facebook , Dropbox , Yelp , AWS , Google 등 업계에서 Rust가 더 광범위하게 채택되는 것을 보기 시작했습니다. Rust가 계속해서 성장할 것이며 앞으로도 계속 있을 것입니다.

이것이 우리가 오늘의 튜토리얼에서 살펴볼 것입니다 — Rust에서 gRPC를 사용하여 작은 서버를 구축합니다.

녹 설치

다음과 같이 Rust를 설치합니다:

$ curl --proto '=https' --tlsv1.2 -sSf <https://sh.rustup.rs> | sh

$ rustup update stable

$ rustc --version
rustc 1.60.0 (7737e0b5c 2022-04-04)
$ cargo --version
cargo 1.60.0 (d1fd9fe2c 2022-03-01)

Rust 프로젝트 생성

다음을 실행하여 새 "Hello World" 프로젝트를 만듭니다.

$ cargo new rust_grpc_demo --bin

$ cd rust_grpc_demo
$ cargo run
   Compiling rust_grpc_demo v0.1.0 (/Users/yuchen/Documents/rust_grpc_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 1.75s
     Running `target/debug/rust_grpc_demo`
Hello, world!

$ find . -not -path "./target*" -not -path "./.git*" | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/| - \1/"
  |-Cargo.toml
  |-Cargo.lock
  |-src
  |  |-main.rs

gRPC는 데이터 직렬화 및 역직렬화에 프로토콜 버퍼 를 사용합니다. .proto파일 에 서버 API를 정의해 봅시다 .

$ mkdir proto
$ touch proto/bookstore.proto

tonic 으로 gRPC 서비스를 만들 것입니다 . Cargo.toml파일 에 다음 종속성을 추가 합니다.

bookstore.proto,우리 tonic-build는 크레이트의 build.rs빌드 스크립트 에서 Rust 코드를 생성 합니다.

$ touch build.rs

이 게시물의 목적을 위해 생성된 파일을 더 쉽게 볼 수 있도록 .out_dir(“./src”)기본 출력 디렉토리를 디렉토리로 변경하기 위해 이것을 추가했다는 점을 지적해야 합니다 .src

컴파일을 준비하기 전에 한 가지 더. 파일을 Rust로 변환할 수 있는 표현으로 구문 분석하기 위해 Protocol Buffers 컴파일러tonic-build 에 의존합니다 . 설치하자 :.protoprotobuf

$ brew install protobuf

$ protoc --version
libprotoc 3.19.4

$ cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.31s

  | - Cargo.toml
  | - proto
  |  | - bookstore.proto
  | - Cargo.lock
  | - build.rs
  | - src
  |  | - bookstore.rs
  |  | - main.rs

마지막으로 서비스를 통합할 시간입니다. 다음으로 바꿉니다 main.rs.

보시다시피, 단순함을 위해 실제로 책 설정 데이터베이스가 없습니다. 이 끝점에서 우리는 단순히 가짜 책을 반환합니다.

서버 실행 시간:

$ cargo run
   Compiling rust_grpc_demo v0.1.0 (/Users/yuchen/Documents/rust_grpc_demo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.71s
     Running `target/debug/rust_grpc_demo`
Bookstore server listening on [::1]:50051

보너스: 서버 리플렉션

처음에 언급했듯이, 나는 처음에 서버 리플렉션을 수행하는 기능 때문에 gRPC에 깊은 인상을 받았습니다. 서비스 개발 중에 편리할 뿐만 아니라 프론트엔드 엔지니어와 훨씬 쉽게 의사 소통할 수 있습니다. 따라서 Rust Server에 추가하는 방법을 설명하지 않고 이 튜토리얼을 마치는 것은 완전하지 않습니다.

종속성에 다음을 추가합니다.

tonic-reflection = "0.4.0"

마지막으로 main.rs다음으로 업데이트하십시오.

gRPC 서버 테스트

Postman , Kreya, bloomrpc , grpcox 등과 같이 gRPC 서버와 함께 플레이할 GUI 클라이언트가 많이 있습니다 . 오늘은 간단하게 하기 위해 명령줄 도구를 사용할 것 grpc_cli입니다.

설치하기 위해서:

$ brew install grpc

$ grpc_cli call localhost:50051 bookstore.Bookstore.GetBook "id: 'test-book-id'"
connecting to localhost:50051
Received initial metadata from server:
date : Sun, 08 May 2022 20:15:39 GMT
id: "test-book-id"
name: "Zero to One"
author: "Peter"
year: 2014
Rpc succeeded with OK status

오늘은 여기까지입니다. 읽어주셔서 감사합니다. 행복한 코딩을 하세요! 평소와 같이 소스 코드는 GitHub 에서 사용할 수 있습니다 .

Suggested posts

Work Week에서의 학습은 생각보다 중요합니다.

Work Week에서의 학습은 생각보다 중요합니다.

우리는 종종 우리에게 좋다고 알고 있는 것을 구현하는 데 어려움을 겪고 있습니다. 중요한 다른 사람에게 우리가 그들을 사랑한다고 말하는 것부터 해적처럼 이야기하는 것을 기억하는 것까지, 그들이 이미 그런 일을 하고 있기 때문에 하루, 일주일 또는 한 달의 이벤트가 필요하지 않다고 주장하는 사람들이 항상 있을 것입니다.

지구를 구하고 돈을 버는 방법

지구를 구하고 돈을 버는 방법

페트병, 유리병, 알루미늄캔, 그린에너지 패키지를 무심코 버린 적이 몇 번이나 되셨나요? 재활용에 대한 대가로 무언가를 얻을 수 있기를 몇 번이나 바랐습니까? 당신이 대부분의 사람들과 같다면 대답은 아마도 여러 번일 것입니다. 재활용은 종종 번거로움, 자질구레한 일 또는 즉각적이거나 실질적인 혜택을 가져오지 않는 의무로 간주됩니다.

Related posts

대명사는 정말 무섭다

너무 자주 그렇듯 갑자기 와닿는다 다시 중간쯤이야 <아니, 태평양에 있는 사람 말고 마룬, 카니발에 있는 사람> 모든 헤드라인이 시끄러워…..

조던 닐리의 살인과 "애국적" 인종차별의 문제

미국은 인종차별적 행동을 좋은 미국인이 되는 것과 동일시하지 않는 필수적인 조치를 취할 수 있습니까?

조던 닐리의 살인과 "애국적" 인종차별의 문제

[방아쇠 경고: 이 에세이에는 Jordan Neely의 살인자를 칭찬하는 사람들의 스크린 샷이 포함되어 있습니다.] 법 집행관은 마침내 그리고 아마도 마지못해 죽을 때까지 Jordan Neely를 질식시킨 사람인 Daniel Penny를 살인 혐의로 기소했습니다.

위험한 대화

위험한 대화

우리가 이 행성에서 계속 번성하고 싶다면 위험한 대화를 해야 할 것입니다. 우리가 한 것, 우리가 하고 있는 것, 그리고 현재 우리가 계속하기로 설정한 것(또는 할 계획인 것)에 도전하는 것들.

안전한 작업 환경 조성

안전한 작업 환경 조성

“그는 내가 위험에 처했을 때 나를 지켜줄 것입니다. 그가 나를 그의 천막 안에 숨길 것이다.