一、介绍

在上一章节 go微服务框架Kratos (连载三) :创建restful接口
我们介绍了 如何来生成一个 restful接口。
本章我们详细了解一下,kratos生成的_http.pb.go文件。
我们打开 user_http.pb.go 文件,主要有两大部分组成。

  1. 服务端接口UserHTTPServer,以及路由注册函数RegisterUserHTTPServer()
  2. 客户端接口UserHTTPClient,以及初始化客户端命令NewUserHTTPClient()供调用方使用。

二、创建服务器

自动生成的user_http.pb.go,帮助我们创建服务端,主要内容有2步。

  1. UserHTTPServer 接口
  2. RegisterUserHTTPServer 注册路由

2.1 具体实现 UserHTTPServer 接口

我们在,第三章中介绍了,使用kratos自带的service工具,生成了user.go文件来作为
user_http.pb.go文件中UserHTTPServer接口的具体实现。

kratos proto server api/helloworld/v1/user.proto -t internal/service

生成的UserService结构体,内嵌了user_grpc.pb.go里面的UnimplementedUserServer方法,作为一个标识,代表是使用protobuf生成的接口的具体实现。这样一目了然。

2.2 RegisterUserHTTPServer 注册路由

我们在server的地方调用RegisterUserHTTPServer,就可以直接把实现user_http.pb.go中UserHTTPServer接口的 service注册到http服务器中。

// NewHTTPServer new a HTTP server.
func NewHTTPServer(c *conf.Server, greeter *service.GreeterService, userService *service.UserService, logger log.Logger) *http.Server {
    var opts = []http.ServerOption{
        http.Middleware(
            recovery.Recovery(),
        ),
    }
    if c.Http.Network != "" {
        opts = append(opts, http.Network(c.Http.Network))
    }
    if c.Http.Addr != "" {
        opts = append(opts, http.Address(c.Http.Addr))
    }
    if c.Http.Timeout != nil {
        opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))
    }
    srv := http.NewServer(opts...)
    v1.RegisterGreeterHTTPServer(srv, greeter)
    v1.RegisterUserHTTPServer(srv, userService) //在这里注册我们的service到http服务器中。
    return srv
}

三、创建客户端

自动生成的user_http.pb.go,帮助我们创建client,主要内容有2步。

  1. UserHTTPClient接口,提供对外的可以接入的方法
  2. NewUserHTTPClient,创建客户端。
    这样就提供了一个restful客户端接入方法。
    我们来使用一下。
func TestUserService_GetUser(t *testing.T) {
    client, err := http.NewClient(
        context.Background(),
        http.WithEndpoint("http://localhost:8000"),
    )
    if err != nil {
        t.Error(err)
    }
    userClient := v1.NewUserHTTPClient(client)
    resp, err := userClient.GetUser(context.Background(), &v1.GetUserRequest{Id: 1})
    t.Log(resp, err)
}

只要填入一个 http://localhost:8000这个地址为http服务器地址。
和grpc的调用很类似,都是连接到服务器,然后调用 方法。


海生
104 声望32 粉丝

与黑夜里,追求那一抹萤火。