현재 유행하는 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 공식

    좋은 웹페이지 즐겨찾기