Go 语言微服务框架 Kratos 是怎么让 gRPC 自动变成 REST 接口的?

protoc-gen-go-http 是 Kratos 在 gRPC 生态上的一次重要增强。它让开发者可以在一份 .proto 文件中同时定义 gRPC 与 HTTP 接口,并自动生成服务代码,避免维护多套路由逻辑。

介绍

Kratos 官方提供了 protoc-gen-go-http 插件,该插件根据 .proto 文件中的 google.api.http option,生成 HTTP handler、路由注册代码、参数绑定逻辑。

与 grpc-gateway 不同,protoc-gen-go-http 并不需要额外的“网关”层。它直接在服务端生成原生的 http.Handler,让 gRPC 服务天然具备 REST 能力。

google.api.http option 详解

google.api.http option 是 Google API 的一个 Protobuf 扩展,用来把 gRPC 方法映射为 HTTP REST 接口。

syntax = "proto3";

package helloworld.v1;

import"google/api/annotations.proto";

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      get: "/helloworld/{name}"
      // 可以添加附加接口
      additional_bindings {
          // 定义一个 POST 接口,并且把 body 映射到 HelloRequest
          post: "/v1/greeter/say_hello",
          body: "*",
      }
    };
  }
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}

阅读上面这段代码,我们可以在 .proto 文件中添加 google.api.http option,其中,get: "/helloworld/{name}" 是把 name 映射到 URL 路径参数,即 /helloworld/frank;

post: "/v1/greeter/say_hello" 定义一个 POST 请求方式的 API,body: "*" 代表整个请求体(JSON)映射到 HelloRequest;

additional_bindings 可以让同一个 RPC 方法绑定多个 HTTP endpoint(GET/POST/PUT等)。

需要注意的是,如果希望通过 gRPC 服务自动生成 REST 接口,可以使用 Google 官方的 grpc-gateway 插件 protoc-gen-grpc-gateway,它会在 gRPC 服务前增加一层 HTTP 转发网关,将 HTTP 请求映射并转发到 gRPC 服务端。

相比之下,grpc-gateway 适合已有 gRPC 服务、希望兼容 REST 访问的场景;而 protoc-gen-go-http 则更偏向在 Kratos 中统一生成原生 gRPC + HTTP 服务代码,部署更轻量。

关于 grpc-gateway 的使用,我们在之前的文章「Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?」中介绍过,本文不再赘述。

在 Kratos 中使用 protoc-gen-go-http 插件

protoc-gen-go-http 插件是 Kratos 的一部分,它是 Kratos 官方开发和维护的,让我们可以通过 Protobuf IDL 同时生成 gRPC 服务和原生 HTTP 服务(基于 net/http),无需使用额外的 “网关”。

该插件的作用是根据 .proto 文件中的 google.api.http option,生成相应的 HTTP 适配层代码。具体来说,它会生成:

  • 一个 RegisterXXXHTTPServer(mux, server) 函数(用于把 gRPC 风格的服务注册为 HTTP handler)。
  • 一个接口 XXXHTTPServer,定义 HTTP 层方法签名。
  • 自动路由注册表(根据 google.api.http 选项里的路径映射)。

这些代码都是纯 Go 的,在生成的代码文件 api/helloworld/v1/greeter_http.pb.go 中,不依赖 grpc-gateway 或任何中间层。

理论讲完了,接下来我们进入实战环节:如何用 protoc-gen-go-http 生成可直接运行的 HTTP 服务代码。

安装插件:

在使用 protoc-gen-go-http 插件之前,我们先通过命令安装插件:

go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2@latest

生成代码:

在 Part 02 中,我们定义的 .proto 文件,可以使用 protoc,或者 make 命令,或者 Kratos 提供的 CLI 工具 kratos,生成 Client 和 Service 代码。

我们以 kratos cli 为例,代码如下:

生成 Client 代码:

kratos proto client api/helloworld/v1/greeter.proto

    生成代码文件:

    api/helloworld/v1/greeter.pb.go
    api/helloworld/v1/greeter_grpc.pb.go
    # 注意 http 代码只会在 proto 文件中声明了 http 时才会生成
    api/helloworld/v1/greeter_http.pb.go

    其中,api/helloworld/v1/greeter_http.pb.go 文件就是提供 REST API 的相关代码。

    // ...
    type GreeterHTTPServer interface {
     // SayHello Sends a greeting
     SayHello(context.Context, *HelloRequest) (*HelloReply, error)
    }
    
    func RegisterGreeterHTTPServer(s *http.Server, srv GreeterHTTPServer) {
     r := s.Route("/")
     r.POST("/v1/greeter/say_hello", _Greeter_SayHello0_HTTP_Handler(srv))
     r.GET("/helloworld/{name}", _Greeter_SayHello1_HTTP_Handler(srv))
    }
    // ...
    总结

    protoc-gen-go-http 是 Kratos 在 gRPC 生态上的一次重要增强。

    它让开发者可以在一份 .proto 文件中同时定义 gRPC 与 HTTP 接口,并自动生成服务代码,避免维护多套路由逻辑。

    对于希望使用 Kratos 构建同时支持 gRPC + REST 的 Go 服务,这个插件几乎是“必备工具”。

    AI大模型学习福利

    作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    一、全套AGI大模型学习路线

    AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

    二、640套AI大模型报告合集

    这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    三、AI大模型经典PDF籍

    随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    四、AI大模型商业化落地方案

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值