1. protoc 설치
다운로드 주소 : https://github.com/protocolbuffers/protobuf/release
(참고 : https://github.com /protocolbuffers/protobuf는 소스 코드 라이브러리이므로, 소스 코드 라이브러리를 다운로드하기에는 너무 느린 경우 Code Cloud에서 검색할 수 있습니다. 동기화된 라이브러리는 국내 소스이므로 다운로드 속도가 비교적 빠릅니다. 물론 코드 클라우드에서 직접 생성할 수도 있습니다.)
최신 버전은 3.12.2
저는 Windows10 64비트 운영 체제를 사용하고 있으므로 protoc-3.12.2-win64.zip 버전을 선택합니다.
브라우저로 직접 다운로드할 수 있습니다
네트워크 속도가 좋지 않으면 Thunder로 다운로드할 수도 있습니다: https://github.com/protocolbuffers/protobuf/releases/download/v3.12.2/protoc-3.12. 2-win64.zip
압축 해제 후 protoc.exe를 $GOPATH/bin 디렉터리에 복사합니다. 다음
GOPATH가 여러 개인 경우 타사 공용 라이브러리가 있는 GOPATH에 배치하여 여러 프로젝트에서 사용할 수 있도록 합니다.
2. gRPC 설치
gRPC 소스코드: https://github.com/grpc/grpc -go.git
공식 홈페이지에서 제공하는 설치 방법은 go get -u google.golang.org/grpc
그런데 중국에서는 다음과 같은 오류가 자주 발생합니다.
$ go get -u google.golang.org/grpc package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
google.golang.org는 중국에서는 접속이 어렵기 때문에 다운로드가 실패하게 됩니다.
공식 웹사이트에서도 다양한 솔루션을 제공합니다:
https://github.com/grpc/grpc-go
두 번째 방법을 사용하여 소스 코드를 로컬에서 직접 복제합니다
$GOPATH/src 디렉토리에 들어가서 다음 명령을 실행합니다:
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
다운로드 속도가 빠르기도 하고 느릴 때도 있습니다. 매우 느릴 때는 취소하고 몇 번 더 시도하면 속도가 빨라지는 경우도 있습니다.
다운로드가 완료된 후 gRPC를 설치하세요:
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src $ go install google.golang.org/grpc/ google.golang.org\grpc\credentials\credentials.go:31:2: cannot find package "github.com/golang/protobuf/proto" in any of: D:\Go\src\github.com\golang\protobuf\proto (from $GOROOT) C:\Users\ASUS\go\src\github.com\golang\protobuf\proto (from $GOPATH) google.golang.org\grpc\internal\binarylog\method_logger.go:28:2: cannot find package "github.com/golang/protobuf/ptypes" in any of: D:\Go\src\github.com\golang\protobuf\ptypes (from $GOROOT) C:\Users\ASUS\go\src\github.com\golang\protobuf\ptypes (from $GOPATH) google.golang.org\grpc\binarylog\grpc_binarylog_v1\binarylog.pb.go:9:2: cannot find package "github.com/golang/protobuf/ptypes/duration" in any of: D:\Go\src\github.com\golang\protobuf\ptypes\duration (from $GOROOT) C:\Users\ASUS\go\src\github.com\golang\protobuf\ptypes\duration (from $GOPATH) google.golang.org\grpc\binarylog\grpc_binarylog_v1\binarylog.pb.go:10:2: cannot find package "github.com/golang/protobuf/ptypes/timestamp" in any of: D:\Go\src\github.com\golang\protobuf\ptypes\timestamp (from $GOROOT) C:\Users\ASUS\go\src\github.com\golang\protobuf\ptypes\timestamp (from $GOPATH) google.golang.org\grpc\internal\transport\controlbuf.go:28:2: cannot find package "golang.org/x/net/http2" in any of: D:\Go\src\golang.org\x\net\http2 (from $GOROOT) C:\Users\ASUS\go\src\golang.org\x\net\http2 (from $GOPATH) google.golang.org\grpc\internal\transport\controlbuf.go:29:2: cannot find package "golang.org/x/net/http2/hpack" in any of: D:\Go\src\golang.org\x\net\http2\hpack (from $GOROOT) C:\Users\ASUS\go\src\golang.org\x\net\http2\hpack (from $GOPATH) google.golang.org\grpc\server.go:36:2: cannot find package "golang.org/x/net/trace" in any of: D:\Go\src\golang.org\x\net\trace (from $GOROOT) C:\Users\ASUS\go\src\golang.org\x\net\trace (from $GOPATH) google.golang.org\grpc\status\status.go:34:2: cannot find package "google.golang.org/genproto/googleapis/rpc/status" in any of: D:\Go\src\google.golang.org\genproto\googleapis\rpc\status (from $GOROOT) C:\Users\ASUS\go\src\google.golang.org\genproto\googleapis\rpc\status (from $GOPATH)
프롬프트에 따르면 패키지 부족으로 인한 오류임을 알 수 있습니다. 여기서는 오류 메시지를 분석하지 않습니다. 필요한 종속성 패키지와 다운로드 방법을 조금씩 제공합니다($GOPATH/src 디렉터리에서 명령 실행):
1) 텍스트 패키지
git clone https://github.com/golang/text.git ./golang.org/x/text
2) net 패키지
git clone https://github.com/golang/net.git ./golang.org/x/net
3) genproto 패키지
git clone https://github.com/google/go-genproto.git ./google.golang.org/genproto
4) protobuf 패키지
둘 다:
git clone https://github.com/protocolbuffers/protobuf-go.git ./google.golang.org/protobuf
git clone https://github.com/golang/protobuf.git ./github.com/golang/protobuf
둘 다 다운로드, github .com/golang/protobuf의 일부 코드는 google.golang.org/protobuf
위의 종속 라이브러리를 모두 다운로드한 후 gRPC를 다시 설치하세요.
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src $ go install google.golang.org/grpc/ ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src $
오류도 없고 출력도 없는 것을 확인할 수 있습니다. . .
gRPC가 괜찮은지 확인
두 개의 bash 창을 열고 각각 다음 명령을 실행합니다.
go run google.golang.org/grpc/examples/helloworld/greeter_server/main.go
go run google.golang.org/grpc/examples/helloworld/greeter_client/main.go
그림과 같이 클라이언트가 보낸 메시지를 서버가 수신한 것을 확인할 수 있습니다
3. rpc
작성된 proto 파일을 .go 파일로 컴파일해야 합니다. 예:
$GOPATHgoogle.golang.orggrpcexampleshelloworldhelloworld 디렉토리에 다음 파일이 있습니다.
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ ll total 16 -rw-r--r-- 1 ASUS 197121 4938 6月 1 21:46 helloworld.pb.go -rw-r--r-- 1 ASUS 197121 1208 6月 1 21:46 helloworld.proto -rw-r--r-- 1 ASUS 197121 2823 6月 1 21:46 helloworld_grpc.pb.go
먼저 .go 파일을 백업합시다
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ mv helloworld.pb.go helloworld.pb.go.bak ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ mv helloworld_grpc.pb.go helloworld_grpc.pb.go.bak ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ ll total 16 -rw-r--r-- 1 ASUS 197121 4938 6月 1 21:46 helloworld.pb.go.bak -rw-r--r-- 1 ASUS 197121 1208 6月 1 21:46 helloworld.proto -rw-r--r-- 1 ASUS 197121 2823 6月 1 21:46 helloworld_grpc.pb.go.bak
그런 다음 실행:
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ protoc --go_out=plugins=grpc:. helloworld.proto 'protoc-gen-go' ????????????????????????е???? ????????????? --go_out: protoc-gen-go: Plugin failed with status code 1.
오류가 있는 것을 발견했습니다. protoc-gen-go를 설치해야 합니다
다음 명령을 실행하여 설치합니다.
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src $ go install github.com/golang/protobuf/protoc-gen-go/ ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src $ cd ../bin ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/bin $ ll total 11852 -rwxr-xr-x 1 ASUS 197121 3702272 5月 27 07:06 protoc.exe* -rwxr-xr-x 1 ASUS 197121 8431104 6月 1 23:13 protoc-gen-go.exe*
설치가 완료되면 protoc-gen-go.exe 파일 $GOPATH/bin 디렉토리에 생성됩니다
그런 다음 컴파일 proto 파일을 실행합니다:
helloworld.pb.go 파일이 생성됩니다
요약
이해해야 할 여러 라이브러리가 있습니다:
1. ://github.com/protocolbuffers/protobuf
이 라이브러리에는 Google의 오픈 소스 protobuf 소스 코드 라이브러리입니다. 일반적으로 사용되는 다양한 언어로 protobuf를 구현하기 위한 소스 코드가 포함되어 있습니다.
2. com/golang/protobuf
이 라이브러리는 golang의 protobuf 오픈 소스 라이브러리입니다. 이 라이브러리의 README.md를 확인하면 이 라이브러리가 google.golang.org/protobuf
라는 것을 알 수 있습니다. 대신 이 링크를 클릭하면 다음에 해당하는 소스 코드 git 저장소를 찾을 수 있습니다. 이 라이브러리는
https://github.com/protocolbuffers/protobuf-go
문제:
현재 오픈 소스 커뮤니티를 살펴보면 github의 protobuf는 점차적으로 google.golang.org 라이브러리가 될 것이지만 현재 플러그- 여전히 github의 protoc-gen-go를 사용해야 합니다.
google.golang.org/protobuf/cmd/protoc-gen-go를 사용하는 경우(예: google.golang.org/protobuf/cmd/protoc-gen-go를 설치하세요. , 이는 $GOPATH/bin 디렉토리에 protoc-gen-go.exe도 생성하므로 다음 오류가 발생합니다
ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ protoc --go_out=plugins=grpc:. helloworld.proto --go_out: protoc-gen-go: plugins are not supported; use 'protoc --go-grpc_out=...' to generate gRPC ASUS@LAPTOP-V7SMQSCI MINGW64 ~/go/src/google.golang.org/grpc/examples/helloworld/helloworld (master) $ protoc --go-grpc_out=. helloworld.proto 'protoc-gen-go-grpc' ????????????????????????е???? ????????????? --go-grpc_out: protoc-gen-go-grpc: Plugin failed with status code 1.
grpc 인터페이스를 생성하기 위해 별도의 protoc-gen-go-grpc가 있지만 이는 아직 코드 검토 단계에 있으며 출시될 예정입니다. . .