"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > gRPC 및 Go: 고성능 웹 서비스 구축

gRPC 및 Go: 고성능 웹 서비스 구축

2024년 11월 17일에 게시됨
검색:419

gRPC and Go: Building High-Performance Web Services

소개

마이크로서비스와 분산 시스템의 세계에서는 서비스 간의 효율적인 통신이 중요합니다. Google이 개발한 고성능 RPC(원격 프로시저 호출) 프레임워크인 gRPC가 작동하는 곳입니다. 단순성과 효율성을 위해 설계된 정적으로 유형이 지정되고 컴파일된 프로그래밍 언어인 Go와 결합된 gRPC는 강력하고 확장 가능한 웹 서비스를 구축하는 데 도움이 될 수 있습니다.

gRPC란 무엇입니까?

gRPC는 google Remote Procedure Call을 의미합니다. 이는 전송을 위해 HTTP/2, 인터페이스 설명 언어로 프로토콜 버퍼를 사용하고 인증, 로드 밸런싱 등과 같은 기능을 제공하는 오픈 소스 프레임워크입니다. gRPC를 사용하면 .proto 파일에서 서비스 방법과 메시지 유형을 정의할 수 있으며, 이를 사용하여 여러 언어로 클라이언트 및 서버 코드를 생성할 수 있습니다.

Go에서 gRPC를 사용하는 이유는 무엇입니까?

  1. 성능: gRPC는 단일 연결을 통해 여러 요청을 다중화하여 지연 시간을 줄이고 성능을 향상시키는 HTTP/2를 사용합니다.
  2. 코드 생성: 프로토콜 버퍼를 사용하면 서비스를 한 번 정의하고 Go에서 클라이언트 및 서버 코드를 생성하여 일관성을 보장하고 상용구 코드를 줄일 수 있습니다.
  3. 스트리밍: gRPC는 클라이언트 측, 서버 측 및 양방향 스트리밍을 지원하므로 실시간 애플리케이션에 이상적입니다.
  4. 상호 운용성: gRPC 서비스는 다양한 언어로 작성된 클라이언트에서 사용할 수 있으므로 다중 언어 환경에서 다양한 선택이 가능합니다.

Go에서 gRPC 시작하기

  • ### 전제 조건

    시작하기 전에 다음이 설치되어 있는지 확인하세요.

    • Go(두 가지 최신 주요 릴리스 중 하나)
    • 프로토콜 버퍼 컴파일러(protoc)
    • 프로토콜 버퍼 컴파일러용 Go 플러그인

    다음 명령을 사용하여 Go 플러그인을 설치할 수 있습니다.

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    

    protoc 컴파일러가 플러그인을 찾을 수 있도록 PATH를 업데이트하세요.

    export PATH="$PATH:$(go env GOPATH)/bin"
    

    터미널을 열고 다음을 입력하여 시스템에 protoc이 설치 및 구성되어 있는지 확인하세요.

    protoc --version
    

    다음과 유사한 출력이 표시됩니다.

    C:\Users\Guest>protoc --version
    ~ libprotoc 27.3
    

    protoc 명령을 인식하지 못하는 경우 Windows용 Chocolatey를 사용하여 프로토콜 버퍼를 설치할 수 있습니다.

    choco install protoc
    

    그렇지 않고 초콜릿이 설치되어 있지 않거나 다른 OS를 사용하는 경우 여기에서 공식 설치 문서를 참조할 수 있습니다.

    서비스 정의

    gRPC 서비스를 정의하는 .proto 파일을 만듭니다. 예를 들어:

    helloworld.proto

    syntax = "proto3";
    package helloworld;
    
    message HelloRequest {
        string name = 1;
    }
    message HelloResponse {
        string message = 1;
    }
    
    service Greeter {
        rpc SayHello (HelloRequest) returns (HelloResponse) {}
    }
    

    코드 생성

    .proto 파일에서 Go 코드를 생성합니다.

    protoc --go_out=. --go-grpc_out=. helloworld.proto
    

    서버 구현

    Go에서 서버 만들기:

    server.go

    package main
    
    import (
        "context"
        "log"
        "net"
    
        "google.golang.org/grpc"
        pb "path/to/your/proto"
    )
    
    type server struct {
        pb.GreeterServer
    }
    
    func main() {
        lis, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Fatalf("failed to listen: %v", err)
        }
    
        log.Printf("Server started at %v", lis.Addr())
    
        grpcServer := grpc.NewServer()
        pb.RegisterGreeterServer(grpcServer, &server{})
        if err := grpcServer.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }
    }
    
    // SayHello name should be the same RPC name as defined in your proto file
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
        return &pb.HelloResponse{Message: "Hello "   in.Name}, nil
    }
    

    클라이언트 생성

    Go에서 클라이언트 만들기:

    client.go

    package main
    
    import (
        "context"
        "log"
        "os"
        "time"
    
        "google.golang.org/grpc"
        pb "path/to/your/proto"
    )
    
    func main() {
        conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
            log.Fatalf("did not connect: %v", err)
        }
        defer conn.Close()
        client := pb.NewGreeterClient(conn)
    
        name := "John Doe"
        if len(os.Args) > 1 {
            name = os.Args[1]
        }
    
        callSayHello( client, name )
    }
    
    func callSayHello(client pb.GrpcServiceClient, name string) {
        ctx, cancel := context.WithTimeout(context.Background(), time.Second)
        defer cancel()
    
        res, err := client.SayHello(ctx, &pb.HelloRequest{Name: name})
        if err != nil {
            log.Fatalf("Failed to called: %v", err)
        }
        log.Printf("%v", res)
    }
    

결론

gRPC와 Go는 함께 확장 가능한 고성능 웹 서비스를 구축하기 위한 강력한 조합을 제공합니다. 두 가지의 장점을 모두 활용하면 유지 관리 및 확장이 용이하고 효율적이고 안정적인 애플리케이션을 만들 수 있습니다.

데모 저장소 링크: Github.com

릴리스 선언문 이 기사는 https://dev.to/amarjit/grpc-and-go-building-high-performance-web-services-5ea6?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다. 그것
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3