현재 유행하는 gRPC(Go 샘플 코드 포함)를 간단히 요약하였다.

개시하다


(당시) Go가 한 달을 겪은 나는 갑자기 gRPC로 백엔드 API 개발 업무에 참여하기로 결정했다. 급하게 공부할 필요가 있기 때문에 당시의 학습을 공유하기로 했다.
Qiita 일일 트렌드에 올랐다!!
요즘 GRPC에 대해 자주 듣는데, "그게 뭐야?"사람도 많고 (나도 그중의 한 사람) 자신의 학습을 정리하기 위해 gRPC의 신청 기사를 쓰기로 결정해서 등록했습니다Go 5 Advent Calendar 2020!

gRPC 소개

  • gRPC 괜찮은 것 같아
  • 요즘 gRPC 흐름이 진행되고 있는 것 같아요
  • 나는 많이 들은 것 같은데, 간단하게 말하면
  • RPC(Remote Procedure Call)를 실현하기 위해 Google이 개발한 프로토콜 중 하나
  • Protocol Buffers를 사용하여 데이터를 직렬화하여 고속 통신
  • 을 실현할 수 있음
    IDL(인터페이스 정의 언어)을 사용하여 API 사양을 미리 설정합니다.prooto 파일로 정의됩니다.프로토 파일에서 서버와 클라이언트에 필요한 원본 코드를 생성할 수 있는 초기 모델
  • 언어에 의존하지 않고 하나입니다.프로토 파일에서 12개 언어를 생성할 수 있는 구현(Go, Java, Python, C, Rubby 등)
  • 인증, Load balaning, log, 모니터링 플러그인은 비교적 간단
  • HTTP/2를 기반으로 제작되어 HTTP/2의 혜택을 간단하게 받을 수 있음
  • SSL 커뮤니케이션에 기본적으로 적합하고 높은 보안
  • 높은 확장성(수백만 요구 사항의 병렬 처리)
  • 4가지 API 유형 생성(이하), 다양한 유형/용도 개발이 가능한 API
  • Unary(일반놈: 1req 1res)(response)
  • Server Streaming(client:1 req, server: 여러 res)
  • Centent Streaming(client: 여러 req, server:1res)
  • Bi Directional Streaming(client: 여러 req, 서버: 여러 res)
    Screen Shot 0002-12-25 at 19.29.54.png
  • ■ 다양한 언어로 통신할 때의 인상
    grpc_polyglot.png
    ※ 발췌: gRPC 공식

    gRPC가 유행이에요.


    gRPC의 장점은 특히 마이크로 서비스에서 잘 발휘된다.
    gRPC가 유행하는 원인 중 하나는 마이크로 서비스와 잘 어울린다는 것이다👀!
    아까 말씀드린 특징.
  • 현대, 통신 속도, 낮은 지연, 데이터 전송 효과
  • 다양한 언어 간의 통신을 단순화할 수 있음
  • 마이크로 서비스의 API는 종종 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
    }
    
    

    장점

  • API 설계/사양의 정의가 쉽고 규칙을 벗어나기 어렵다
  • HTTP/2의 은혜(고속, 쌍방 간류 통신)
  • 언어에 의존하지 않고 다양한 언어로 gRPC
  • 사용 가능
  • 인증, Load balaning, log, 모니터링 등을 비교적 간단하게 구현하고 API 개발에 주력할 수 있음
  • 결점

  • 데이터가 엄숙해져서 디버깅하기 어려울 것 같다
  • 많은 문서와 정보가 일본어화되지 않았다.(영어로 투덜거리는 게 좋을 것 같다)
  • 추천하는 학습 방법


  • 공식 페이지에서 Protocol Buffers에 API의 규격을 쓰는 것이 어떤 느낌인지 이해한다.
    (처음에는 잘 몰라도 괜찮다고 생각했어요. 저도 공식 홈페이지인 핸즈 온을 읽고'이게 뭐예요?'의 상태입니다.GRPC 개발이 실제로 사용되었는지 나중에 알게 될 것입니다.)

  • gRPC의 공식 대체로 어떤 gRPC를 입력했는지(포함하지 않고 아마 이런 느낌일 거예요. 이렇게 이해하면 될 것 같아요.)
  • 간단한 것을 만들어 보세요.(이곳에서 한꺼번에 이해가 깊어진다.)
  • 3단계 내가 배운 교재는 UdemygRPC [Golang] Master Class: Build Modern API & Microservices입니다.
    영어 설명(일본어 자막 없음)이지만 설명이 간단하고 알기 쉬워 영어를 할 줄 아는 사람에게 추천한다.
    일본어 교재면성형 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 공식

    좋은 웹페이지 즐겨찾기