Golang을 이용한 간편한 gRPC 서비스 구현 방법

7322 단어 grpcgo

간단한 RPC 서비스를 위해 Golang을 사용하는 방법


RPC의 일반적인 소개를 알고 싶다면, 이 시리즈의 전 문장을 보고 싶을 수도 있다-
구현된 코드는 내 GitHub 저장소에서 찾을 수 있습니다.
Link to GitHub repository

네가 시작하기 전에

  • Install Golang
  • Install proto compilers
  • 작업흐름

  • 프로토콜 정의 - 쓰기원본 파일
  • 컴파일링 - 필요한 프로토콜 관련 파일 및 클라이언트 및 서버 스텁 생성
  • 클라이언트 코드 작성
  • 서버 코드 작성
  • 서버와 클라이언트 코드를 실행하고 작동하는지 확인
  • 블로그 게시물을 작성할 수 있는 간단한 RPC 서비스


    개술
  • 클라이언트가 서버에 요청하여 제목과 내용을 지정한 블로그 글을 만듭니다.
  • 서버는 새로 만든 블로그 게시물을 메모리에 저장합니다.
  • 이 기사의 중점은 RPC 서비스를 실현하는 것이기 때문에 우리는 메모리 저장소를 사용하여 블로그 글을 저장합니다.이런 메모리 저장소는 나중에 백엔드의 모든 데이터베이스로 대체할 수 있다.
  • 이후에는 Golang의 인터페이스 기능을 사용하여 데이터베이스를 통합할 수 있습니다.
    ### 디렉토리 구조
  • grpcblog
    ├── Makefile
    ├── blog
    │   ├── blog.pb.go
    │   ├── blog.proto
    │   └── blog_grpc.pb.go
    ├── client
    │   └── client.go
    ├── server
    │   └── server.go
    ├── storage
        └── storage.go
    

    .proto 파일


  • 메시지 블록은 두 필드인 제목과 본문을 포함하는 블로그 글의 구조를 정의합니다.
  • message Blog{
       string title = 1;
       string body =2;
     }
    

  • 메시지 BlogRequest는 클라이언트 요청의 구조를 정의합니다. 하나의 필드가 있습니다. Blog입니다.
  • message BlogRequest {
       Blog blog = 1;
     }
    

  • 메시지 BlogResponse는 서버 응답의 구조를 정의합니다. 두 필드를 포함합니다.

  • id: 새 게시물을 성공적으로 작성할 때 생성된 일반 고유 식별자(UUID)입니다.

  • created:CreatePost가 성공하면 부울 값을true로 설정합니다.안 그러면 틀렸어.
  •  message BlogResponse{
       string id = 1;
       bool created = 2;
     }
    
  • proto 파일은 간단한 RPC 서비스인 CreatePost 클라이언트가 서버에 요청을 보내고 서버가 응답으로 응답합니다.RPC 서비스CreatePost는 클라이언트로부터 BlogRequest를 보내고 서버는 BlogResponse로 응답합니다.
  •   service BlogService{
       rpc CreatePost(BlogRequest) returns (BlogResponse) {}
     }
    

    편집자원본 파일


    다음 명령을 사용하여 컴파일합니다.프로파일:
    protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative blog/blog.proto
    
    이렇게 하면 두 개의 파일이 생성됩니다.
    blog/blog_grpc.pb.go
    
    블로그pb.go는 서버와 클라이언트 캐시를 포함합니다.BlogServiceClient 및 BlogServer 인터페이스가 없습니다.이 인터페이스들은 잠시 후에 서버와 클라이언트 코드에서 실현될 것입니다.우리는 자신의 서버와 클라이언트를 작성해서 실현해야 한다.
    blog/blog.pb.go
    
    블로그pb.go는 프로토콜 버퍼 코드를 포함합니다. 서버와 클라이언트 사이에서 데이터를 전송할 때 이진 서열화를 담당합니다.

    메모리 저장소 정의


  • 저장실.go는 임시 메모리 저장을 위한 사용자 정의 함수를 포함합니다.
  • 에는 Save()와 View() 함수가 포함된 BlogStorage 인터페이스가 있습니다.
  • type BlogStorage interface {
        Save(blog *blog.Blog, id string) error
        View()
    }
    
    type InMemoryBlogStorage struct {
        mutex sync.RWMutex
        blogs map[string]*blog.Blog
    }
    
  • 블로그는 지도에 저장되어 있는데 그 중에서 키는 UUID이고 이와 관련된 값은 블로그 게시물이다.
  • 게시물을 데이터베이스에 저장하기 위해 우리는 SaveToDB()와 같은 다른 함수를 추가할 수 있다. 이것은 BlogStorage 인터페이스를 실현했다.
  • 클라이언트 코드

  • 콘솔에서 블로그 제목을 읽습니다.
  • 콘솔에서 블로그 내용을 읽습니다.
  • blog/blog grpc의 BlogServiceClient 인터페이스에서 구현되지 않은 함수CreatePost의 구현을 포함한다.pb.가자.
  • 서버 코드

  • 클라이언트로부터 입력 데이터를 가져와 새로운 블로그 글을 만들고 메모리에 저장합니다.
  • blog/blog grpc에 포함된 Blog Server 인터페이스에서 구현되지 않은 함수CreatePost의 구현.pb.가자.
  • 새 게시물을 만들고 메모리 메모리에 저장
  • 할 때 공통 고유 식별자(UUID) 생성
  • 새 게시물을 성공적으로 작성한 후 각 게시물의 UUID를 표시합니다.

    최종 결과


    두 개의 독립된 터미널에서 서버와 클라이언트 코드를 실행합니다.
    실행 서버
    go run server/server.go
    

    실행 클라이언트 - 새 블로그 글의 제목과 내용을 입력합니다.
    go run client/client.go
    

    만세!GRPC 서비스를 사용하여 새 게시물을 성공적으로 만들었습니다.
    자세히 보기 - 유용한 자료:
  • gRPC Go Quick Start
  • Protocol Buffer Basics: Go
  • Basic introduction to gRPC in Go
  • proto3 language Guide
  • 좋은 웹페이지 즐겨찾기