[go] Go 언어를 사용한 분산 시스템 간 통신 방법

분산 시스템은 여러 개의 독립적인 컴퓨터 시스템이 네트워크를 통해 연결되어 작업을 수행하는 시스템입니다. 이러한 분산 시스템에서 컴퓨터들은 서로간에 통신을 해야 합니다. Go 언어는 효율적인 분산 시스템을 구축하기 위해 사용할 수 있는 강력한 기능을 제공합니다. 이 글에서는 Go 언어에서 분산 시스템 간 통신을 위한 몇 가지 방법을 살펴보겠습니다.

1. HTTP 통신

Go 언어는 표준 라이브러리에서 net/http 패키지를 제공하여 HTTP 통신을 손쉽게 구현할 수 있습니다. 이를 이용하여 분산 시스템 간의 통신을 구현할 수 있습니다. 예를 들어, 서버 측에서는 http.ListenAndServe 함수로 HTTP 서버를 시작할 수 있고, 클라이언트 측에서는 http.Get 함수로 HTTP 요청을 보낼 수 있습니다.

// 서버
func handleRequest(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", handleRequest)
    http.ListenAndServe(":8080", nil)
}

// 클라이언트
resp, err := http.Get("http://localhost:8080")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}

fmt.Println(string(body))

2. gRPC 통신

gRPC는 Google에서 개발한 고성능의 RPC 프레임워크로, Protocol Buffers를 기반으로 구현되어 있습니다. Go 언어는 기본적으로 gRPC를 지원하고 있어, 이를 이용하여 분산 시스템 간의 통신을 구현할 수 있습니다. gRPC는 다양한 언어로 작성된 서버와 클라이언트 간의 통신을 지원하기 때문에, 서로 다른 언어로 작성된 시스템들 간의 통신에 유용합니다.

먼저, 프로토콜 버퍼 파일을 작성하여 메시지 형식을 정의합니다.

syntax = "proto3";

message Greeting {
    string message = 1;
}

service HelloWorld {
    rpc SayHello (Greeting) returns (Greeting);
}

그리고 다음과 같이 Go 코드를 작성하여 서버와 클라이언트를 구현할 수 있습니다.

// 서버
type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.Greeting) (*pb.Greeting, error) {
    return &pb.Greeting{Message: "Hello, " + in.Message}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer()
    pb.RegisterHelloWorldServer(s, &server{})

    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

// 클라이언트
func main() {
    conn, err := grpc.Dial(":8080", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()

    c := pb.NewHelloWorldClient(conn)

    message := "World"
    resp, err := c.SayHello(context.Background(), &pb.Greeting{Message: message})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }

    fmt.Println(resp.Message)
}

결론

Go 언어를 사용하면 분산 시스템 간의 통신을 손쉽게 구현할 수 있습니다. 표준 라이브러리에서 제공하는 net/http 패키지로 간단한 HTTP 통신을 구현하거나, gRPC를 사용하여 더 효율적이고 속도가 빠른 RPC 통신을 구현할 수 있습니다. 이러한 통신 방법들을 활용하여 Go 언어로 분산 시스템을 구축해 보세요.

참고 문서: