CNCF 실천--gRPC
14739 단어 서비스 컴 퓨 팅
참고 문서
특성
환경 설정
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 를 호출 합 니 다.