gRPC 서비스용 RESTful API를 추가하는 데 5분
HTTP 인터페이스를 사용하는 gRPC 서비스?
go-zero는 개발자에게 뛰어난 RESTful 및 gRPC 서비스 개발 경험을 제공했지만 더 많은 기대가 생겼습니다.
말이 되는군요! 사용자가 말하는 것을 볼 수 있습니다.
User A: a set of logic, HTTP and gRPC together.
User B: if go-zero can simplify this step I feel it will become the the best microservices framework, ever.
그래서 깊은 생각에 빠졌습니다. 사용자는 결코 틀린 것이 아니지만 우리는 그것을 제공하고 싶습니까?
여기 기사가 옵니다.
먼저 gRPC 서비스를 작성해 봅시다
우리는 이 서비스에 너무 익숙합니다. 새 디렉토리를 만들고 이름을
grpc-restufl
로 지정하고 sum.proto
파일을 넣습니다.syntax = "proto3";
package sum;
option go_package="./pb";
message SumRequest {
int64 a = 1;
int64 b = 2;
}
message SumResponse {
int64 result = 1;
}
service Sum {
rpc Add(SumRequest) returns (SumResponse) {}
}
원클릭 세대입니다.
$ goctl rpc protoc --go_out=. --go-grpc_out=. --zrpc_out=. sum.proto
당신이 얻는 것을보십시오
.
├── etc
│ └── sum.yaml
├── go.mod
├── internal
│ ├── config
│ │ └── config.go
│ ├── logic
│ │ └── addlogic.go
│ ├── server
│ │ └── sumserver.go
│ └── svc
│ └── servicecontext.go
├─ pb
│ ├── sum.pb.go
│ └── sum_grpc.pb.go
├─ sum
│ └── sum.go
├── sum.go
└── sum.proto
비즈니스 로직을 구현하려면
Add
의 internal/logic/addlogic.go
메서드를 다음과 같이 수정합니다.func (l *AddLogic) Add(in *pb.SumRequest) (*pb.SumResponse, error) {
return &pb.SumResponse{
Result: in.A+in.B,
}, nil
}
실행할 수 있고 비즈니스 로직이 있습니다(데모용으로 매우 간단하지만).
$ go mod tidy && go run sum.go
Starting rpc server at 127.0.0.1:8080...
고제로에 익숙한 분들은 여기서 하이라이트(신지식)는 없으니 가보시죠~
HTTP 인터페이스 제공
제로 제로 업데이트
먼저 go-zero를
v1.4.0
버전으로 업데이트하고,$ go get -u github.com/zeromicro/go-zero@latest
프로토 파일 수정
수정
sum.proto
, 다음과 같이 새sum-api.proto
를 생성했습니다.syntax = "proto3";
package sum;
option go_package="./pb";
import "google/api/annotations.proto";
message SumRequest {
int64 a = 1;
int64 b = 2;
}
message SumResponse {
int64 result = 1;
}
service Sum {
rpc Add(SumRequest) returns (SumResponse) {
option (google.api.http) = {
post: "/v1/sum"
body: "*"
};
}
}
proto 설명자 파일 생성
protoc --include_imports --proto_path=. --descriptor_set_out=sum.pb sum-api.proto
구성 파일 수정
수정
internal/config/config.go
은 다음과 같습니다(일부).type Config struct {
zrpc.RpcServerConf
Gateway gateway.GatewayConf
Gateway.GatewayConf }
수정
etc/sum.yaml
은 다음과 같습니다.Gateway:
Name: gateway
Port: 8081
Upstreams:
- Grpc:
Endpoints:
- localhost:8080
ProtoSets:
- sum.pb
주요 기능 수정
gateway
를 생성하고 ServiceGroup
를 사용하여 gRPC server
및 gateway server
를 관리하는 코드의 일부는 다음과 같습니다. gw := gateway.MustNewServer(c.Gateway)
group := service.NewServiceGroup()
group.Add(s)
group.Add(gw)
defer group.Stop()
fmt.Printf("Starting rpc server at %s... \n", c.ListenOn)
fmt.Printf("Starting gateway at %s:%d... \n", c.Gateway.Host, c.Gateway.Port)
group.Start()
잘 했어!
서비스를 시작합시다
$ go run sum.go
Starting rpc server at 127.0.0.1:8080...
Starting gateway at 0.0.0.0:8081...
curl
로 테스트$ curl -i -H "Content-Type: application/json" -d '{"a":2, "b":3}' localhost:8081/v1/sum
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-ad5b7df7a834a1c05ee64999e3310811-195ba1f4f9956cc4-00
Date: Mon, 18 Jul 2022 14:33:11 GMT
Content-Length: 20
{
"result": "5"
}
클라이언트가 받은 내용에 해당하는
gateway
및 gRPC
로그의 링크 정보를 살펴보십시오.{"@timestamp": "2022-07-18T22:33:11.437+08:00", "caller": "serverinterceptors/statinterceptor.go:76", "content": "127.0.0.1:61635 - /sum. Sum/Add - {\"a\":2,\"b\":3}", "duration": "0.0ms", "level": "info", "span": "b3c85cd32a76f8c9", "trace":" ad5b7df7a834a1c05ee64999e3310811"}
{"@timestamp": "2022-07-18T22:33:11.438+08:00", "caller": "handler/loghandler.go:197", "content":"[HTTP] 200 - POST /v1/sum - 127.0.0.1: 61662 - curl/7.79.1", "duration": "0.7ms", "level": "info", "span": "195ba1f4f9956cc4", "trace": "ad5b7df7a834a1c05ee64999e3310811"}
결론
HTTP
서비스에 gRPC
인터페이스를 추가하는 것이 매우 쉽습니다. 그렇지?또한 이 간단한
gateway
을 과소평가하지 마십시오. 구성이 뒤에 있는 gRPC
서비스에 도킹된 경우 자동으로 로드 균형을 조정하고 미들웨어를 사용자 정의하여 원하는 대로 제어할 수도 있습니다.그런데 이 예제의 전체 코드는 에 있습니다.
https://github.com/kevwan/grpc-restful
프로젝트 주소
https://github.com/zeromicro/go-zero
go-zero
를 자유롭게 사용하시고 별표를 달아 우리를 응원해주세요!
Reference
이 문제에 관하여(gRPC 서비스용 RESTful API를 추가하는 데 5분), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kevwan/5-minutes-to-add-restful-apis-for-your-grpc-services-2dnl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)