kitex框架easy_note简单分析

331 阅读2分钟
这是我参与「第五届青训营」伴学笔记创作活动的第 2 天

kitex框架示例项目easy_note的简单分析

项目实现过程分析

如下图:

QQ截图20220611221302.png 从图中我们可以发现该项目主要分三个部分demoapi,demonote,demouser,demoapi接收用户的request,然后通过etcd找寻服务再将请求发送到相应的服务中,当然前提是demonote和demouser服务会先注册到etdc,让其能够通过demoapi的request解析到相应的地址,每个服务之间用rpc进行通信,里面两个服务用了两个不一样的rpc协议,分别是thrift和protobuf。

代码部分

代码结构如下:

QQ截图20220611224302.png 其中cmd文件夹下是业务代码,idl文件夹是note服务的thirft和user服务的protobuf文件 kitex_gen文件夹是kitex自动生成的代码,pkg里面放的是一些中间件,统一错误处理,链路追踪,cpu监控以及常量

QQ截图20220611225034.png 在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…