这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
- demo展示
上篇文章展示了kitex的环境是如何配置juejin.cn/post/719833… 本文则是将重点落在demo展示上,并且成功run起来
二、demo展示:
以kitex为框架的项目,可以分成服务器server和客户端client,其代码生成器也是与之对应的。 1.在开始之前需要编写protoc或者thriftgo文件作为,其对应的参数在这里不多逼逼。
namespace go api
struct Request {
1: string message (api.query="message")
}
struct Response {
1: string message
}
struct LoginRequest{
1: string username
2: string password
}
struct LoginResponse{
1: string statuscode
}
service Echo {
Response echo(1: Request req)
LoginResponse login(1: LoginRequest req)
Response test(1: LoginRequest req)
}
这这里namespace可以理解为包名,下边的struct为请求、响应结构体,service则是rpc中的服务(protoc类似,可以自行查看文档)
2.基于thriftgo文件生成服务器代码
kitex -module example -service example echo.thrift
其中module为项目包名(需要和项目一致,不然会报错),service为服务器名,如果是namespace的名字则是kitex_gen下的目录名,但是service对应的是kitex.yaml的名字,建议还是提前统一,不然后期引入包的时候再加上别名,真的就是套娃了。 生成的文件很多,但是都不用管,只需要填handler.go的业务逻辑代码就可。
package main
import (
"context"
"example/kitex_gen/api"
"example/service"
)
// EchoImpl implements the last service interface defined in the IDL.
type EchoImpl struct{}
// Echo implements the EchoImpl interface.
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
// TODO: Your code here...
return &api.Response{Message: req.Message}, nil
}
// Login implements the EchoImpl interface.
func (s *EchoImpl) Login(ctx context.Context, req *api.LoginRequest) (resp *api.LoginResponse, err error) {
// TODO: Your code here...
res, err := service.LoginService(req)
return &api.LoginResponse{Statuscode: res}, nil
}
// Test implements the EchoImpl interface.
func (s *EchoImpl) Test(ctx context.Context, req *api.LoginRequest) (resp *api.Response, err error) {
// TODO: Your code here...
return
}
填写完毕之后,则需要创建服务器,即补充main.go生成服务端(本文使用了nacos进行注册,下次会填坑,不用nacos,则是注释部分)
//svr := api.NewServer(new(EchoImpl))
//
//err := svr.Run()
//
//if err != nil {
// log.Println(err.Error())
//}
func main() {
r, err := registry.NewDefaultNacosRegistry()
if err != nil {
panic(err)
}
svr := echo.NewServer(
new(EchoImpl),
server.WithServiceAddr(&net.TCPAddr{Port: 50052}),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "hello"}),
server.WithRegistry(r),
)
if err := svr.Run(); err != nil {
log.Println("server stopped with error:", err)
} else {
log.Println("server stopped")
}
}
3.客户端代码
生不生都行,我好像没生成,反正就是创建client来接受(nacos的不一样,下面则是拿官方文档来作为实例)
c, err := echo.NewClient("example", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
req := &api.Request{Message: "my request"}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.Println(resp)
三、运行
1.服务端启动
go run
解释一下,第1,2个表示启动成功,后面则是nacos注册上去,显示这些则代表服务器启动了
2.客户端测试调用
3.其他的可以看官方文档的比较。
四、个人总结:
- 总结,kitex具有天然优势,微服务的架构中,服务与服务之间使用kitex的rpc就非常的好,既体现了速度,也方便了开发。
- 然后http协议使用字节的hertz,与kitex的关联也成熟和方便,体现在nacos的注册和解析都蛮方便的。