현재 유행하는 gRPC(Go 샘플 코드 포함)를 간단히 요약하였다.
개시하다
(당시) Go가 한 달을 겪은 나는 갑자기 gRPC로 백엔드 API 개발 업무에 참여하기로 결정했다. 급하게 공부할 필요가 있기 때문에 당시의 학습을 공유하기로 했다.
※ Qiita 일일 트렌드에 올랐다!!
요즘 GRPC에 대해 자주 듣는데, "그게 뭐야?"사람도 많고 (나도 그중의 한 사람) 자신의 학습을 정리하기 위해 gRPC의 신청 기사를 쓰기로 결정해서 등록했습니다Go 5 Advent Calendar 2020!
gRPC 소개
IDL(인터페이스 정의 언어)을 사용하여 API 사양을 미리 설정합니다.prooto 파일로 정의됩니다.프로토 파일에서 서버와 클라이언트에 필요한 원본 코드를 생성할 수 있는 초기 모델
※ 발췌: gRPC 공식
gRPC가 유행이에요.
gRPC의 장점은 특히 마이크로 서비스에서 잘 발휘된다.
gRPC가 유행하는 원인 중 하나는 마이크로 서비스와 잘 어울린다는 것이다👀!
아까 말씀드린 특징.
구글이나 넷플릭스 같은 세계적인 기업들도 gRPC를 사용하는 등 규모가 크고 제휴 서비스를 하는 대기업에 좋은 점이 많은 기술이다.
개발 프로세스
1. .프로토 파일 정의, 제작
syntax = "proto3";
package greet;
option go_package="greetpb";
// GreetRequest を受け取って GreetResponse を返すメソッドの定義
service Greet {
rpc Greet (GreetRequest) returns (GreetResponse) {}
}
message Greeting {
string first_name = 1;
string last_name = 2;
}
// GreetRequest のリクエスト定義
message GreetRequest {
Greeting greeting = 1;
}
// GreetResponse のリスポンス定義
message GreetResponse {
string result = 1;
}
2. .프로토를 컴파일하여 서버와 클라이언트의 코드를 생성합니다
type Greeting struct {
FirstName string `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"`
LastName string `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Greeting) GetFirstName() string {
if m != nil {
return m.FirstName
}
return ""
}
func (m *Greeting) GetLastName() string {
if m != nil {
return m.LastName
}
return ""
}
// 長いので以下略 //
3. 2.클라이언트 & 서버 측의 실현.■ 클라이언트
package main
import (
// 略
)
func main() {
fmt.Println("Hello I'm a client")
tls := false
opts := grpc.WithInsecure()
if tls {
certFile := "ssl/ca.crt" // Certificate Authority Trust certificate
creds, sslErr := credentials.NewClientTLSFromFile(certFile, "")
if sslErr != nil {
log.Fatalf("Error while loading CA trust certificate: %v", sslErr)
return
}
opts = grpc.WithTransportCredentials(creds)
}
cc, err := grpc.Dial("localhost:50051", opts)
if err != nil {
log.Fatalf("could not connect: %v", err)
}
defer cc.Close()
c := greetpb.NewGreetServiceClient(cc)
doUnary(c)
}
func doUnary(c greetpb.GreetServiceClient) {
fmt.Println("Starting to do a Unary RPC...")
req := &greetpb.GreetRequest{
Greeting: &greetpb.Greeting{
FirstName: "Stephane",
LastName: "Maarek",
},
}
res, err := c.Greet(context.Background(), req)
if err != nil {
log.Fatalf("error while calling Greet RPC: %v", err)
}
log.Printf("Response from Greet: %v", res.Result)
}
■ 서버측
package main
import (
// 略
)
func main() {
fmt.Println("Hello world")
lis, err := net.Listen("tcp", "0.0.0.0:50051")
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
opts := []grpc.ServerOption{}
tls := false
if tls {
certFile := "ssl/server.crt"
keyFile := "ssl/server.pem"
creds, sslErr := credentials.NewServerTLSFromFile(certFile, keyFile)
if sslErr != nil {
log.Fatalf("Failed loading certificates: %v", sslErr)
return
}
opts = append(opts, grpc.Creds(creds))
}
s := grpc.NewServer(opts...)
greetpb.RegisterGreetServiceServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
type server struct{}
func (*server) Greet(ctx context.Context, req *greetpb.GreetRequest) (*greetpb.GreetResponse, error) {
fmt.Printf("Greet function was invoked with %v\n", req)
firstName := req.GetGreeting().GetFirstName()
result := "Hello " + firstName
res := &greetpb.GreetResponse{
Result: result,
}
return res, nil
}
장점
결점
추천하는 학습 방법
공식 페이지에서 Protocol Buffers에 API의 규격을 쓰는 것이 어떤 느낌인지 이해한다.
(처음에는 잘 몰라도 괜찮다고 생각했어요. 저도 공식 홈페이지인 핸즈 온을 읽고'이게 뭐예요?'의 상태입니다.GRPC 개발이 실제로 사용되었는지 나중에 알게 될 것입니다.)
gRPC의 공식 대체로 어떤 gRPC를 입력했는지(포함하지 않고 아마 이런 느낌일 거예요. 이렇게 이해하면 될 것 같아요.)
영어 설명(일본어 자막 없음)이지만 설명이 간단하고 알기 쉬워 영어를 할 줄 아는 사람에게 추천한다.
일본어 교재면성형 gRPC이 좋을 것 같아요.(이것을 실행하지 않았습니다.)
최후
솔직히 사전 접속Go 5 Advent Calendar 2020이 안 됐으면 귀찮아서 기사를 못 썼을 텐데.마감일 구동에서 미리 등록+예약을 하는 것이 중요하다.나는 개인적으로 자격 등의 학습도 이 방식이 가장 좋다고 생각한다.
하고 있어요. 가능하면 팔로우 해주세요!
Go, gRPC, AWS, GCP, Next.js, Nuxt.js 개발 사용(& 학습 중)!
참조 기사/페이지
gRPC [Golang] Master Class: Build Modern API & Microservices
gRPC란 무엇입니까?
HTTP/2의 양방향 통신 및 gRPC
gRPC 공식
Protocol Buffers 공식
Reference
이 문제에 관하여(현재 유행하는 gRPC(Go 샘플 코드 포함)를 간단히 요약하였다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/skytrilingineer/articles/c7d989183d49de텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)