第五届青训营后端第二天学习笔记| 青训营笔记

40 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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注册上去,显示这些则代表服务器启动了 image.png 2.客户端测试调用

image.png 3.其他的可以看官方文档的比较。

四、个人总结:

  • 总结,kitex具有天然优势,微服务的架构中,服务与服务之间使用kitex的rpc就非常的好,既体现了速度,也方便了开发。
  • 然后http协议使用字节的hertz,与kitex的关联也成熟和方便,体现在nacos的注册和解析都蛮方便的。

五、引用参考:

  1. www.cloudwego.io/zh/docs/kit…