[ easy_note第三天 | 青训营笔记]

172 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

1 开始起号

从note模块干起。创建项目目录。在开始后续的步骤之前,先让我们创建一个项目目录用于后续。

mkdir notedemo
cd notedemo
vim note.thrift

编写IDL。创建一个名为 note.thrift 的 thrift IDL 文件。然后在里面定义我们的服务

//   ./notedemo/note.thrift
namespace go notedemo

struct BaseResp {
    1:i64 status_code
    2:string status_message
    3:i64 service_time
}
struct CreateNoteRequest {
    1:string title
    2:string content
    3:i64 user_id
}
struct CreateNoteResponse {
    1:BaseResp base_resp
}

service NoteService {
    CreateNoteResponse CreateNote(1:CreateNoteRequest req)
}

生成note服务代码。有了 IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令:

$ kitex -module notedemo -service noteservice note.thrift

上述命令中,-module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的 notedemo 为该服务的名字。最后一个参数则为该服务的 IDL 文件。 获取最新的 Kitex 框架

go get github.com/cloudwego/kitex@latest
go mod tidy

编写 note 服务逻辑.我们需要编写的服务端逻辑都在handler.go,

package main

import (
   "context"
   notedemo "notedemo/kitex_gen/notedemo"
   "notedemo/pack"
   "notedemo/pkg/constants"
   "notedemo/pkg/errno"
   "notedemo/service"
)

type NoteServiceImpl struct{}

func (s *NoteServiceImpl) CreateNote(ctx context.Context, req *notedemo.CreateNoteRequest) (resp *notedemo.CreateNoteResponse, err error) {
   resp = new(notedemo.CreateNoteResponse)

   if req.UserId <= 0 || len(req.Title) == 0 || len(req.Content) == 0 {
      resp.BaseResp = pack.BuildBaseResp(errno.ParamErr)
      return resp, nil
   }

   err = service.NewCreateNoteService(ctx).CreateNote(req)
   if err != nil {
      resp.BaseResp = pack.BuildBaseResp(err)
      return resp, nil
   }

   resp.BaseResp = pack.BuildBaseResp(errno.Success)
   return resp, nil
}

给服务器端添加数据库配置。修改notedemo/main.go文件:

package main
import (
    "github.com/cloudwego/kitex/pkg/limit"
    "github.com/cloudwego/kitex/server"
    "log"
    "net"
    "notedemo/dal"
    notedemo "notedemo/kitex_gen/notedemo/noteservice"
)
func Init() {
    dal.Init()
}
func main() {
    addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8888")
    if err != nil {
        panic(err)
    }
    Init()
    svr := notedemo.NewServer(new(NoteServiceImpl),
    server.WithServiceAddr(addr),                                       // address
    server.WithLimit(&limit.Option{MaxConnections: 1000, MaxQPS: 100}), // limit
    server.WithMuxTransport(),//添加多路复用,客户端也需要同样配置
    )
    err = svr.Run()
    if err != nil {
        log.Println(err.Error())
    }
}

编译运行。 kitex 工具已经帮我们生成好了编译和运行所需的脚本:

编译:

sh build.sh
sh output/bootstrap.sh

执行上述命令后,noteservice 服务就开始运行啦! 编写客户端。有了服务端后,接下来就让我们编写一个客户端用于调用刚刚运行起来的服务端。

首先,同样的,先创建一个目录用于存放我们的客户端代码:

mkdir client
cd client

创建一个 main.go 文件,然后就开始编写客户端代码了。

package main

import (
   "context"
   "github.com/cloudwego/kitex/client"
   "github.com/cloudwego/kitex/client/callopt"
   "log"
   "notedemo/kitex_gen/notedemo"
   "notedemo/kitex_gen/notedemo/noteservice"
   "time"
)
func main(){
   c, err := noteservice.NewClient("example",
      client.WithHostPorts("0.0.0.0:8888"),
      client.WithMuxConnection(1),
   )
    if err != nil {
       log.Fatal(err)
    }
    //req := &api.Request{Message: "my request"}
    req := &notedemo.CreateNoteRequest{Title: "xx", Content: "d", UserId: 1}
    //resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
    resp, err := c.CreateNote(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
    if err != nil {
       log.Fatal(err)
    }
    log.Println(resp)
    }

现在可以发起调用了。