CNCF 실천--gRPC

14739 단어 서비스 컴 퓨 팅
gRPC 안내
참고 문서
  • gRPC 는 고성능,오픈 소스,유 니 버 설 RPC 프레임 워 크 로 구 글 에서 출시 되 었 으 며 HTTP/2 프로 토 콜 표준 디자인 개발 을 바탕 으로 기본적으로 Protocol Buffers 데이터 직렬 화 프로 토 콜 을 사용 하여 다양한 개발 언어 를 지원 합 니 다.gRPC 는 간단 한 방법 으로 서 비 스 를 정확하게 정의 하고 클 라 이언 트 와 서버 에 신뢰 할 수 있 는 기능 라 이브 러 리 를 자동 으로 생 성 합 니 다
  • gRPC 클 라 이언 트 에서 서로 다른 서버 의 원 격 프로그램 을 직접 호출 할 수 있 고 사용 자 세 는 로 컬 프로그램 을 호출 하 는 것 처럼 보 이 며 분포 식 응용 과 서 비 스 를 구축 하기 쉽다.많은 RPC 시스템 과 마찬가지 로 서버 는 정 의 된 인 터 페 이 스 를 실현 하고 클 라 이언 트 의 요청 을 처리 하 며 클 라 이언 트 는 인터페이스 설명 에 따라 필요 한 서 비 스 를 직접 호출 합 니 다.클 라 이언 트 와 서버 는 각각 gRPC 가 지원 하 는 서로 다른 언어 로 구현 할 수 있 습 니 다

  • 특성
  • 강력 한 IDL gRPC 는 ProtoBuf 를 사용 하여 서 비 스 를 정의 합 니 다.ProtoBuf 는 Google 이 개발 한 데이터 직렬 화 프로 토 콜(XML,JSON,hessian 과 유사)입 니 다.ProtoBuf 는 데 이 터 를 직렬 화 할 수 있 고 데이터 저장,통신 프로 토 콜 등에 광범 위 하 게 응용 할 수 있다
  • 다 중 언어 지원 gRPC 는 다양한 언어 를 지원 하고 언어 를 바탕 으로 클 라 이언 트 와 서버 기능 라 이브 러 리 를 자동 으로 생 성 할 수 있 습 니 다.현재 C 버 전 grpc,자바 버 전 grpc-java 와 Go 버 전 grpc-go 를 제공 하고 있 으 며,다른 언어의 버 전 은 적극적으로 개발 중 입 니 다.그 중에서 grpc 는 C,C++,Node.js,Python,Ruby,Objective-C,PHP 와 C\#등 언어 를 지원 하고 있 으 며,grpc-java 는 안 드 로 이 드 개발 을 지원 합 니 다
  • HTTP/2 gRPC 는 HTTP/2 표준 디자인 을 바탕 으로 하기 때문에 다른 RPC 프레임 워 크 에 비해 gRPC 는 더 많은 강력 한 기능 을 가 져 왔 다.예 를 들 어 양 방향 흐름,머리 압축,다 중 재 활용 요청 등 이다.이러한 기능 은 대역 폭 절약,TCP 링크 횟수 감소,CPU 사용 절감 과 배터리 수명 연장 등 모 바 일 기기 에 중대 한 이점 을 가 져 다 준다.또한 gRPC 는 클 라 우 드 서비스 와 웹 애플 리 케 이 션 의 성능 도 향상 시 킬 수 있다.gRPC 는 클 라 이언 트 에서 도 응용 할 수 있 고 서버 에서 도 응용 할 수 있어 클 라 이언 트 와 서버 의 통신 을 투명 하 게 실현 하고 통신 시스템 의 구축 을 간소화 할 수 있다

  • 환경 설정
    gRPC-go
    홈 페이지 설치 방법
    $ go get -u google.golang.org/grpc
    

    하지만 centos 가상 컴퓨터 에는 사다리 가 없습니다!!그럼 방식 을 바 꿔 서 github 에서 끌 어 내 립 니 다.참고 하 세 요.
    $ git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
    $ git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
    $ git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text 
    $ git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
    
    $ cd $GOPATH/src/
    $ go install google.golang.org/grpc
    

    하지만 아직 부족 해!Protocol Buffers 데이터 직렬 화 프로 토 콜 을 사용 하기 때문에 protobuf(약칭)를 설치 해 야 합 니 다!
    protobuf
    protobuf-3.6.1 을 다운로드 하고 압축 을 푼 후 폴 더 에 들 어가 다음 명령 을 수행 합 니 다.
    $ ./configure
    $ sudo make
    $ make install
    #         
    $ protoc --version
    

    Golang protobuf 플러그 인
    $ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
    

    소 칼 을 조금 시험 해 보다.
    관례 는 examples 의 helloword 부터 시도 합 니 다.
    #   
    $ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld
    #      
    $ go run greeter_server/main.go
    
    #             ,         
    $ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld
    $ go run greeter_client/main.go
    

    서버 결과
    2019/01/18 20:25:47 Received: world
    

    클 라 이언 트 결과
    2019/01/18 20:25:47 Greeting: Hello world
    

    샘플 분석
    helloworld.proto
    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "io.grpc.examples.helloworld";
    option java_outer_classname = "HelloWorldProto";
    
    package helloworld;
    
    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    // The request message containing the user's name.
    message HelloRequest {
      string name = 1;
    }
    
    // The response message containing the greetings
    message HelloReply {
      string message = 1;
    }
    

    서비스 SayHello,요청 한 매개 변수 정보 HelloRequest,되 돌아 오 는 정보 HelloReply 를 설명 합 니 다..proto 파일 을 이용 하여 gRPC 서 비 스 를 정의 하고 protoc 컴 파일 러 를 통 해.pb.go 파일 을 생 성 합 니 다.컴 파일 명령:
    protoc --go_out=plugins=grpc:. helloworld.proto
    

    실행 후 helloworld.pb.go 생 성
    서버 main.go
    package main
    
    import (
    	"context"
    	"log"
    	"net"
    
    	"google.golang.org/grpc"
    	pb "google.golang.org/grpc/examples/helloworld/helloworld"
    	"google.golang.org/grpc/reflection"
    )
    
    const (
    	port = ":50051"
    )
    
    // server is used to implement helloworld.GreeterServer.
    type server struct{}
    
    // SayHello implements helloworld.GreeterServer
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    	log.Printf("Received: %v", in.Name)
    	return &pb.HelloReply{Message: "Hello " + in.Name}, nil
    }
    
    func main() {
    	lis, err := net.Listen("tcp", port)
    	if err != nil {
    		log.Fatalf("failed to listen: %v", err)
    	}
    	s := grpc.NewServer()
    	pb.RegisterGreeterServer(s, &server{})
    	// Register reflection service on gRPC server.
    	reflection.Register(s)
    	if err := s.Serve(lis); err != nil {
    		log.Fatalf("failed to serve: %v", err)
    	}
    }
    

    서비스 sayHello 를 실현 하고 protobuf 서버 를 등록 하 며 gRPC 서버 를 등록 하고 포트 50051 을 감청 합 니 다.
    클 라 이언 트 main.go
    package main
    
    import (
    	"context"
    	"log"
    	"os"
    	"time"
    
    	"google.golang.org/grpc"
    	pb "google.golang.org/grpc/examples/helloworld/helloworld"
    )
    
    const (
    	address     = "localhost:50051"
    	defaultName = "world"
    )
    
    func main() {
    	// Set up a connection to the server.
    	conn, err := grpc.Dial(address, grpc.WithInsecure())
    	if err != nil {
    		log.Fatalf("did not connect: %v", err)
    	}
    	defer conn.Close()
    	c := pb.NewGreeterClient(conn)
    
    	// Contact the server and print out its response.
    	name := defaultName
    	if len(os.Args) > 1 {
    		name = os.Args[1]
    	}
    	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    	defer cancel()
    	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    	if err != nil {
    		log.Fatalf("could not greet: %v", err)
    	}
    	log.Printf("Greeting: %s", r.Message)
    }
    

    서버 와 의 연결 을 만 들 고 protobuf 클 라 이언 트 를 만 들 며 클 라 이언 트 에서 sayHello 를 호출 합 니 다.

    좋은 웹페이지 즐겨찾기