> 백엔드 개발 > Golang > gRPC 및 Go: 고성능 웹 서비스 구축

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

Barbara Streisand
풀어 주다: 2024-09-30 20:07:03
원래의
273명이 탐색했습니다.

gRPC and Go: Building High-Performance Web Services

소개

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

gRPC란 무엇입니까?

gRPC는 google Remote ProcedureCall의 약자입니다. 이는 전송을 위해 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

위 내용은 gRPC 및 Go: 고성능 웹 서비스 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿