这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
kitex框架示例项目easy_note的简单分析
项目实现过程分析
如下图:
从图中我们可以发现该项目主要分三个部分demoapi,demonote,demouser,demoapi接收用户的request,然后通过etcd找寻服务再将请求发送到相应的服务中,当然前提是demonote和demouser服务会先注册到etdc,让其能够通过demoapi的request解析到相应的地址,每个服务之间用rpc进行通信,里面两个服务用了两个不一样的rpc协议,分别是thrift和protobuf。
代码部分
代码结构如下:
其中cmd文件夹下是业务代码,idl文件夹是note服务的thirft和user服务的protobuf文件
kitex_gen文件夹是kitex自动生成的代码,pkg里面放的是一些中间件,统一错误处理,链路追踪,cpu监控以及常量
在api服务中handlers文件夹通过gin框架写了http请求的解析,然后通过调用rpc里面的方法进行rpc通信,在此之前会先对etcd中的服务进行解析,也就是初始化rpc代码如下
func initNoteRpc() {
r, err := etcd.NewEtcdResolver([]string{constants.EtcdAddress})
if err != nil {
panic(err)
}
c, err := noteservice.NewClient(
constants.NoteServiceName,
client.WithMiddleware(middleware.CommonMiddleware),
client.WithInstanceMW(middleware.ClientMiddleware),
client.WithMuxConnection(1), // mux
client.WithRPCTimeout(3*time.Second), // rpc timeout
client.WithConnectTimeout(50*time.Millisecond), // conn timeout
client.WithFailureRetry(retry.NewFailurePolicy()), // retry
client.WithSuite(trace.NewDefaultClientSuite()), // tracer
client.WithResolver(r), // resolver
)
if err != nil {
panic(err)
}
noteClient = c
}
代码中可以发现调用了newclient方法生成了一个新的客户端连接方法里面传入了service的名字和一些中间件以及链路追踪以及rpc的最大时间和连接的最大时间最后解析。
在note服务中dal文件写了对数据库的操作,在此不过多赘述,rpc文件夹写的是与user服务进行通信,大概内容和上面代码差不多在此不过多赘述,service文件夹写的是对数据逻辑处理,handler文件中写的是对rpc数据进行接收,etcd服务的注册写在main文件里,代码如下:
r, err := etcd.NewEtcdRegistry([]string{constants.EtcdAddress}) // r should not be reused.
if err != nil {
panic(err)
}
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8888")
if err != nil {
panic(err)
}
Init()
svr := note.NewServer(new(NoteServiceImpl),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: constants.NoteServiceName}), // server name
server.WithMiddleware(middleware.CommonMiddleware), // middleWare
server.WithMiddleware(middleware.ServerMiddleware),
server.WithServiceAddr(addr), // address
server.WithLimit(&limit.Option{MaxConnections: 1000, MaxQPS: 100}), // limit
server.WithMuxTransport(), // Multiplex
server.WithSuite(trace.NewDefaultServerSuite()), // tracer
server.WithBoundHandler(bound.NewCpuLimitHandler()), // BoundHandler
server.WithRegistry(r), // registry
)
大概的内容是将自己的服务地址和服务名注册到etcd中,里面添加了rpc和连接超时以及一些中间件和链路追踪。 user服务内容和note大相径庭在此不过多赘述。
代码截图参考:github.com/cloudwego/k…