这是我参与「第五届青训营 」伴学笔记创作活动的第 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 := ¬edemo.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)
}
现在可以发起调用了。