gRPC 서비스용 RESTful API를 추가하는 데 5분

15318 단어 gogatewaygrpcwebdev

HTTP 인터페이스를 사용하는 gRPC 서비스?



go-zero는 개발자에게 뛰어난 RESTful 및 gRPC 서비스 개발 경험을 제공했지만 더 많은 기대가 생겼습니다.
  • 코드를 한 번만 작성하고 싶습니다.
  • gRPC 및 HTTP 인터페이스를 모두 원합니다
  • .

    말이 되는군요! 사용자가 말하는 것을 볼 수 있습니다.

    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
    


    비즈니스 로직을 구현하려면 Addinternal/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 servergateway 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"
    }
    


    클라이언트가 받은 내용에 해당하는 gatewaygRPC 로그의 링크 정보를 살펴보십시오.

    {"@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를 자유롭게 사용하시고 별표를 달아 우리를 응원해주세요!

    좋은 웹페이지 즐겨찾기