一、介绍
在上一章节 go微服务框架Kratos (连载三) :创建restful接口
我们介绍了 如何来生成一个 restful接口。
本章我们详细了解一下,kratos生成的_http.pb.go文件。
我们打开 user_http.pb.go 文件,主要有两大部分组成。
- 服务端接口UserHTTPServer,以及路由注册函数RegisterUserHTTPServer()
- 客户端接口UserHTTPClient,以及初始化客户端命令NewUserHTTPClient()供调用方使用。
二、创建服务器
自动生成的user_http.pb.go,帮助我们创建服务端,主要内容有2步。
- UserHTTPServer 接口
- 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步。
- UserHTTPClient接口,提供对外的可以接入的方法
- 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的调用很类似,都是连接到服务器,然后调用 方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。