콘텐츠로 이동

RPC 서비스 만들기

이 가이드는 API 게이트웨이가 gRPC로 호출할 수 있는 user RPC service를 만듭니다.

  • protoc 설치
  • protoc-gen-go, protoc-gen-go-grpc 설치

설치하지 않았다면 protoc 설치를 확인하세요.

Terminal window
goctl rpc new user
cd user
go mod tidy

Goctl은 .proto 파일과 전체 서비스 골격을 생성합니다.

user/
├── etc/
│ └── user.yaml
├── internal/
│ ├── config/config.go
│ ├── logic/
│ │ └── getuserlogic.go # 예시입니다
│ ├── server/userserver.go # 예시입니다
│ └── svc/servicecontext.go
├── user/
│ └── user.pb.go # 예시입니다
│ └── user_grpc.pb.go # 예시입니다
├── user.go # entrypoint
└── user.proto # 예시입니다

user.proto를 엽니다.

syntax = "proto3";
package user;
option go_package = "./user";
service User {
rpc GetUser(GetUserRequest) returns (GetUserResponse);
}
message GetUserRequest {
int64 id = 1;
}
message GetUserResponse {
int64 id = 1;
string name = 2;
}

internal/logic/getuserlogic.go를 수정합니다.

func (l *GetUserLogic) GetUser(in *user.GetUserRequest) (*user.GetUserResponse, error) {
// In, DB 예시입니다
return &user.GetUserResponse{
Id: in.Id,
Name: "alice",
}, nil
}

etc/user.yaml을 엽니다. 기본 포트는 8080입니다.

Name: user.rpc
ListenOn: 0.0.0.0:8080

RPC 서버를 실행합니다.

Terminal window
go run user.go
# 시작합니다

5단계 — API 서비스에서 호출하기

섹션 제목: “5단계 — API 서비스에서 호출하기”

API 게이트웨이가 사용할 RPC 클라이언트 스텁을 생성합니다.

Terminal window
goctl rpc protoc user.proto \
--go_out=./user \
--go-grpc_out=./user \
--zrpc_out=./client

API 서비스의 servicecontext.go에 다음 클라이언트를 주입합니다.

UserRpc userclient.User // 예시입니다

그다음 로직 파일에서 호출합니다.

resp, err := l.svcCtx.UserRpc.GetUser(l.ctx, &user.GetUserRequest{Id: 1})

go-zero는 연결 풀링, 부하 분산, 서킷 브레이킹을 자동으로 처리합니다.

Terminal window
goctl rpc protoc user.proto \
--go_out=./user \
--go-grpc_out=./user \
--zrpc_out=.