프로토콜 버퍼
- 분산 서비스는 네트워크로 통신한다.
- 이때 구조체 같은 데이터를 전송하기 쉽게 인코딩한다.
- 보통 JSON을 사용한다.
- public API, 클라이언트 통제 불가능한 경우
- 사람이 읽기도 좋고 파싱하기도 좋다.
- 다만 빠르고 기능도 많고 버그 적은 인코딩 방식이 있다.
- 프로토콜 버퍼이다.
- 구글에서 만든 protobuf는 언어 독립적이다.
- 장점
- 자료형 안정성 보장 ( type safety )
- 스키마 위반 방지
- 빠른 직렬화
- 하위 호환성 제공
- gRPC에 사용됨
- ????.proto 라는 파일을 만들고 원하는 언어로 컴파일해서 사용한다.
- 다음의 사진처럼 만든다.
왜 쓰냐?
- 일관된 스키마
- protobuf로 스키마를 인코딩하고 전체 서비스에서 사용하면 일관성을 가져갈 수 있다.
- 전체 서비스가 protobuf에 의존하게 만듬 -> 일관성
- golang의 자료 검사를 통한 일관성 문제 체크 가능
- protobuf로 스키마를 인코딩하고 전체 서비스에서 사용하면 일관성을 가져갈 수 있다.
- 버전 관리 제거
- message의 필드마다 번호가 붙는다.
- 이는 변경이나 업데이트 시 하위 호환성 관리 목적으로 사용된다.
- 파싱하고 전달하는 중간 서버는 모든 필드를 알 필요가 없다. ( ? )
- reserved라고 사용하지 않는 필드에 표시하면 컴파일할 때 해당 필드를 사용하는 코드가 있는지 체크한다.
- 보일러플레이트 코드
- 컴파일된 protobuf 라이브러리는 인코딩 디코딩 메서드가 만들어져 있다!
- 확장성
- 자신만의 컴파일 로직으로 컴파일 가능하다.
- 여러 구조체가 공통의 method 가지게 만들도록 시킬 수 있다.
- 언어 불가지론
- 언어를 바꿔도 컴파일만 해주면 된다.
- 서로 다른 언어를 사용해도 별도의 작업 필요 없다.
- 성능
- 고성능, 페이로드 적다.
- 직렬화 속도 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 ./...
- 다음과 같은 결과가 나온다.