이 페이지에서는 gRPC를 사용하여 Knative serving 서비스를 다른 서비스(예: 내부 마이크로서비스 간의 간단하면서 고성능의 통신 제공)와 연결하려는 개발자를 위한 Knative serving 관련 세부정보를 보여줍니다. Knative serving은 단항 및 스트리밍 gRPC 호출을 모두 지원합니다.
gRPC 단항
단항 RPC 호출에서 클라이언트는 서버에 단일 요청을 보내고 일반적인 함수 호출과 유사한 단일 응답을 받습니다.
대량의 데이터. 이 경우 gRPC는 REST 호출보다 최대 7배 빠른 프로토콜 버퍼를 사용합니다.
간단한 서비스 정의만 필요한 경우에는 전체 클라이언트 라이브러리를 작성하지 않아도 됩니다.
서비스를 gRPC와 통합하려면 다음 안내를 따르세요.
proto 파일에서 요청 메시지와 응답을 정의하고 컴파일합니다.
요청을 처리하고 응답을 반환하는 gRPC 서버를 만듭니다. 이 서버는 PORT 환경 변수를 리슨해야 합니다.
gRPC 서버에서 요청을 보내고 응답을 처리하는 클라이언트를 만듭니다.
원할 경우 인증을 추가합니다.
서비스를 빌드하고 배포합니다.
proto 파일에서 메시지 정의 및 컴파일
proto 정의에 추가할 추가 항목 또는 Knative serving 관련 항목이 없습니다. 다른 용도로 gRPC를 사용할 때와 마찬가지로 서비스 정의 및 데이터 직렬화에는 gRPC 프로토콜 버퍼를 사용합니다.
gRPC 클라이언트 만들기
gRPC를 사용하는 클라이언트에 추가할 추가 항목 또는 Knative serving 관련 항목이 없습니다. 클라이언트 코드의 서비스 정의 사용에 관한 gRPC 문서 및 언어별 gRPC 튜토리얼에 제공된 샘플 클라이언트를 따르세요.
Knative serving 서비스에서 gRPC 요청 리슨
Knative serving에서 실행 중인 gRPC 서버에 적용되는 특별한 요구사항은 단 한 가지인데, 이는 다음 코드에 표시된 바와 같이 PORT 환경 변수로 지정된 포트를 리슨해야 한다는 것입니다.
Go
funcmain(){log.Printf("grpc-ping: starting server...")port:=os.Getenv("PORT")ifport==""{port="8080"log.Printf("Defaulting to port %s",port)}listener,err:=net.Listen("tcp",":"+port)iferr!=nil{log.Fatalf("net.Listen: %v",err)}grpcServer:=grpc.NewServer()pb.RegisterPingServiceServer(grpcServer,&pingService{})iferr=grpcServer.Serve(listener);err!=nil{log.Fatal(err)}}
서비스에 대한 gRPC 연결 열기
서비스에 대한 gRPC 연결을 열어 gRPC 메시지를 보내려면 Knative serving 서비스의 URL 또는 해당 서비스에 매핑된 커스텀 도메인인 호스트 도메인을 gRPC에서 사용할 것으로 예상되는 포트 443과 함께 지정해야 합니다.
Go
import("crypto/tls""crypto/x509""google.golang.org/grpc""google.golang.org/grpc/credentials")// NewConn creates a new gRPC connection.// host should be of the form domain:port, e.g., example.com:443funcNewConn(hoststring,insecurebool)(*grpc.ClientConn,error){varopts[]grpc.DialOptionifhost!=""{opts=append(opts,grpc.WithAuthority(host))}ifinsecure{opts=append(opts,grpc.WithInsecure())}else{// Note: On the Windows platform, use of x509.SystemCertPool() requires// Go version 1.18 or higher.systemRoots,err:=x509.SystemCertPool()iferr!=nil{returnnil,err}cred:=credentials.NewTLS(&tls.Config{RootCAs:systemRoots,})opts=append(opts,grpc.WithTransportCredentials(cred))}returngrpc.Dial(host,opts...)}
인증 없이 gRPC 요청 전송
다음 샘플은 앞서 설명한 대로 구성된 gRPC 연결을 사용하여 인증 없이 요청을 보내는 방법을 보여줍니다.
Go
import("context""time"pb"github.com/GoogleCloudPlatform/golang-samples/run/grpc-ping/pkg/api/v1""google.golang.org/grpc")// pingRequest sends a new gRPC ping request to the server configured in the connection.funcpingRequest(conn*grpc.ClientConn,p*pb.Request)(*pb.Response,error){ctx,cancel:=context.WithTimeout(context.Background(),30*time.Second)defercancel()client:=pb.NewPingServiceClient(conn)returnclient.Send(ctx,p)}
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["이해하기 어려움","hardToUnderstand","thumb-down"],["잘못된 정보 또는 샘플 코드","incorrectInformationOrSampleCode","thumb-down"],["필요한 정보/샘플이 없음","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-09-04(UTC)"],[],[],null,["# Invoking with gRPC\n\nThis page shows Knative serving-specific details for developers who\nwant to use [gRPC](https://grpc.io/) to connect a\nKnative serving service with other services, for example, to provide\nsimple, high performance communication between internal\nmicroservices. Knative serving supports both\n[unary](#before-you-begin)\nand\n[streaming](#before-you-begin)\ngRPC calls. \n\n### gRPC Unary\n\nIn a unary RPC call, the client sends a single request to the server and gets a single response back, similar to a normal function call: \n\n```\nrpc SayHello(HelloRequest) returns (HelloResponse);\n``` \nOK \n\n### gRPC Streaming\n\n\u003cbr /\u003e\n\nThe following streaming options are available with gRPC.\nServer streaming RPCs where the client sends a request to the server and gets a\nstream to read containing a sequence of messages. The client reads the returned\nstream until there are no more messages. \n\n```\nrpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);\n```\n\n\u003cbr /\u003e\n\nClient streaming RPCs where the client writes a sequence of messages and sends\nthem to the server in a stream. After the client finishes writing messages, it\nwaits for the server to return its response. \n\n```\nrpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);\n```\n\n\u003cbr /\u003e\n\nBidirectional streaming RPCs where client and server send messages in two\nread-write streams that operate independently. \n\n```\nrpc BidiHello(stream HelloRequest) returns (stream HelloResponse);\n``` \nOK\n\nPossible use cases include:\n\n- Communication between internal microservices.\n- High loads of data (gRPC uses [protocol buffers](https://developers.google.com/protocol-buffers), which are up to seven times faster than REST calls).\n- Only a simple service definition is needed, you don't want to write a full client library.\n\nTo integrate your service with gRPC,\n\n- Define the request messages and responses in a proto file and compile them.\n- Create a gRPC server to handle requests and return responses: it should listen to the `PORT` environment variable.\n- Create a client that sends requests and handles responses from the gRPC server.\n- Optionally, add authentication.\n- Build and deploy your service.\n\nDefining and compiling messages in a proto file\n-----------------------------------------------\n\nThere are no extra or Knative serving specific things to add to your proto\ndefinitions. Just as with any other use of gRPC, you use\n[gRPC protocol buffers](https://grpc.io/docs/guides/#working-with-protocol-buffers)\nfor service definitions and data serialization.\n\nCreating a gRPC client\n----------------------\n\nThere are no extra or Knative serving specific things to add to a client\nthat uses gRPC: follow the gRPC docs on using service definitions in\n[client code](https://grpc.io/docs/guides/concepts/#using-the-api), and the\nsample clients provided in the language-specific\n[gRPC tutorials](https://grpc.io/docs/languages).\n\nListening for gRPC requests in a Knative serving service\n--------------------------------------------------------\n\nThe only special requirement for a gRPC server running in\nKnative serving is to listen at the port specified by the `PORT`\nenvironment variable as shown in the code:\n\n\n### Go\n\n func main() {\n \tlog.Printf(\"grpc-ping: starting server...\")\n\n \tport := os.Getenv(\"PORT\")\n \tif port == \"\" {\n \t\tport = \"8080\"\n \t\tlog.Printf(\"Defaulting to port %s\", port)\n \t}\n\n \tlistener, err := net.Listen(\"tcp\", \":\"+port)\n \tif err != nil {\n \t\tlog.Fatalf(\"net.Listen: %v\", err)\n \t}\n\n \tgrpcServer := grpc.NewServer()\n \tpb.RegisterPingServiceServer(grpcServer, &pingService{})\n \tif err = grpcServer.Serve(listener); err != nil {\n \t\tlog.Fatal(err)\n \t}\n }\n\n\u003cbr /\u003e\n\nOpening a gRPC connection to a service\n--------------------------------------\n\nTo open a gRPC connection to a service so you can send gRPC messages, you need\nto specify the host domain, which is the URL of the Knative serving service\nor the custom domain [mapped](/kubernetes-engine/enterprise/knative-serving/docs/mapping-custom-domains) to that service,\nalong with the port 443, which is the port expected to be used by gRPC.\n\n\n### Go\n\n\n import (\n \t\"crypto/tls\"\n \t\"crypto/x509\"\n\n \t\"google.golang.org/grpc\"\n \t\"google.golang.org/grpc/credentials\"\n )\n\n // NewConn creates a new gRPC connection.\n // host should be of the form domain:port, e.g., example.com:443\n func NewConn(host string, insecure bool) (*grpc.ClientConn, error) {\n \tvar opts []grpc.DialOption\n \tif host != \"\" {\n \t\topts = append(opts, grpc.WithAuthority(host))\n \t}\n\n \tif insecure {\n \t\topts = append(opts, grpc.WithInsecure())\n \t} else {\n \t\t// Note: On the Windows platform, use of x509.SystemCertPool() requires\n \t\t// Go version 1.18 or higher.\n \t\tsystemRoots, err := x509.SystemCertPool()\n \t\tif err != nil {\n \t\t\treturn nil, err\n \t\t}\n \t\tcred := credentials.NewTLS(&tls.Config{\n \t\t\tRootCAs: systemRoots,\n \t\t})\n \t\topts = append(opts, grpc.WithTransportCredentials(cred))\n \t}\n\n \treturn grpc.Dial(host, opts...)\n }\n\n\u003cbr /\u003e\n\nSending gRPC requests without authentication\n--------------------------------------------\n\nThe following sample shows how to send a request without authentication, using\na [gRPC connection](#connect) configured as mentioned previously.\n\n\n### Go\n\n\n import (\n \t\"context\"\n \t\"time\"\n\n \tpb \"github.com/GoogleCloudPlatform/golang-samples/run/grpc-ping/pkg/api/v1\"\n \t\"google.golang.org/grpc\"\n )\n\n // pingRequest sends a new gRPC ping request to the server configured in the connection.\n func pingRequest(conn *grpc.ClientConn, p *pb.Request) (*pb.Response, error) {\n \tctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\n \tdefer cancel()\n\n \tclient := pb.NewPingServiceClient(conn)\n \treturn client.Send(ctx, p)\n }\n\n\u003cbr /\u003e"]]