Home Protocol Buffers install
Post
Cancel

Protocol Buffers install

프로토콜 버퍼


  • 분산 서비스는 네트워크로 통신한다.
    • 이때 구조체 같은 데이터를 전송하기 쉽게 인코딩한다.
    • 보통 JSON을 사용한다.
      • public API, 클라이언트 통제 불가능한 경우
      • 사람이 읽기도 좋고 파싱하기도 좋다.
    • 다만 빠르고 기능도 많고 버그 적은 인코딩 방식이 있다.
  • 프로토콜 버퍼이다.
    • 구글에서 만든 protobuf는 언어 독립적이다.
    • 장점
      • 자료형 안정성 보장 ( type safety )
      • 스키마 위반 방지
      • 빠른 직렬화
      • 하위 호환성 제공
    • gRPC에 사용됨
  • ????.proto 라는 파일을 만들고 원하는 언어로 컴파일해서 사용한다.
    • 다음의 사진처럼 만든다.

왜 쓰냐?


  1. 일관된 스키마
    1. protobuf로 스키마를 인코딩하고 전체 서비스에서 사용하면 일관성을 가져갈 수 있다.
      1. 전체 서비스가 protobuf에 의존하게 만듬 -> 일관성
    2. golang의 자료 검사를 통한 일관성 문제 체크 가능
  2. 버전 관리 제거
    1. message의 필드마다 번호가 붙는다.
    2. 이는 변경이나 업데이트 시 하위 호환성 관리 목적으로 사용된다.
    3. 파싱하고 전달하는 중간 서버는 모든 필드를 알 필요가 없다. ( ? )
    4. reserved라고 사용하지 않는 필드에 표시하면 컴파일할 때 해당 필드를 사용하는 코드가 있는지 체크한다.
  3. 보일러플레이트 코드
    1. 컴파일된 protobuf 라이브러리는 인코딩 디코딩 메서드가 만들어져 있다!
  4. 확장성
    1. 자신만의 컴파일 로직으로 컴파일 가능하다.
    2. 여러 구조체가 공통의 method 가지게 만들도록 시킬 수 있다.
  5. 언어 불가지론
    1. 언어를 바꿔도 컴파일만 해주면 된다.
    2. 서로 다른 언어를 사용해도 별도의 작업 필요 없다.
  6. 성능
    1. 고성능, 페이로드 적다.
    2. 직렬화 속도 6배 빠름

protoc 컴파일러 설치


  • wsl에서 진행하고 있다.
  • 우선 빌드 된 파일을 받고 unzip한다.
1
2
3
wget https://github.com/protocolbuffers/protobuf/releases/download/v24.3/protoc-24.3-linux-x86_64.zip
unzip protoc~~.zip -d ~/.local/protobuf
rm ./protoc~~.zip
  • 환경 변수에 추가해준다.
    • ~/.bashrc 마지막에 적어주자.
1
PATH=$PATH:$HOME/.local/protobuf/bin
  • 체크해준다.

프로토콜 버퍼로 자료형 정의하기


  • log.proto 파일을 만들고 다음과 같이 쓴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//go 언어가 아니다.
syntax = "proto3"; // 최신 버전 proto3 사용한다 명시 

package log.v1; // 패키지명을 통해 메시지 자료형의 충돌을 막아줌

option go_package = "./github.com/highcloud100/api/log_v1"; // golang의 패키지명으로 사용 
// 만약 이를 안쓰면 위의 package명이 사용됨
// 책과는 다르게 ./ 을 붙여주어야 한다. 아래 참고

message Record{
    bytes value = 1; // 자료형 이름 고유 필드 번호
    uint64 offset = 2;
}

// 필드는 바꿀 수 없고, 이전 필드의 사용을 멈추고 새로운 필드를 사용하자.
// 필드 번호는 고유값으로 직렬화시 ID로 사용된다.
// 호환성을 깨려면 디렉토리 v2를 만들어 메이저 버전을 바꾸자
  • 책과는 다르게 패키지명에 ./ 을 붙여주어야 한다. https://stackoverflow.com/questions/70586511/protoc-gen-go-unable-to-determine-go-import-path-for-simple-proto

    컴파일하기


  • protobuf를 컴파일하려면 해당 언어의 런타임이 필요하다.
  • protoc-gen-go는 go언어를 만들어주는 컴파일러의 플러그인이다.
1
2
go install google.golang.org/protobuf/...@v1.27.1 
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
  • 이후 make 파일을 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
compile:

    protoc  api/v1/*.proto \

        --proto_path=. \

        --go_out=. \

        --go_opt=paths=source_relative

test:

    go test -race ./...
  • 다음과 같은 결과가 나온다.

This post is licensed under CC BY 4.0 by the author.