golang入门笔记——kitex

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

WSL的安装

由于Kitex并不支持Linux所以需要首先安装WSL2

WSL一句话来说就是微软出的一个虚拟机工具

Win11下安装WSL2的步骤为

1.“开始菜单”搜索功能打开“启动或关闭Window功能”
image.png
2.勾选以下功能
1.适用于Linux的Window子系统
2.虚拟机平台
image.png

3.微软商店搜索wsl点击安装
image.png
4.安装完打开安装完之后输入用户的账号密码
image.png
如果安装过程中出现下面这种情况
image.png
说明内核没有更新需要更新
打开一个终端输入以下命令
wsl --update
5.安装完成之后输入下列命令查看wsl的状态
wsl -l -v
启动wsl命令
wsl
6.安装完成之后我的电脑左下角会出现一个linux盘为linux子系统的文件系统

image.png

Kitex

Kitex的准备工作

安装kitex
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

安装thriftgo
go install github.com/cloudwego/thriftgo@latest

安装成功后使用以下命令验证是否安装成功
kitex --version
thriftgo --version

创建IDL文件

Kitex最典型的情况是使用thrift定义的IDL来编写服务接口实现客户端和服务端的通信

hello.thrift文件内容如下

namespace go api

struct Request {
        1: string message
}

struct Response {
        1: string message
}

service Hello {
    Response echo(1: Request req)
}

1.namespace go api这里指我们定义了一个命名空间apiapi代表生成的代码中有一个目录api。
2.struct Request{}表示我们编写一个请求消息体。struct中变量的格式为不重复的编号:类型:命名
3.struct Response{}表示我们编写了一个返回消息体。
4.service Hello{}表示定义了一个Hello服务
5.Response echo(1:Request req)表示服务Hello中有一个叫做echo的方法方法的返回消息为Response请求消息为Request请求消息的格式为编号: 请求消息:命名

生成代码

使用以下命令生成代码
kitex -module "mod_name" -service a.b.c hello.thrift

-module mod_name
指定生成的代码所属的go模块会影响生成代码里的import path
GOPATH/src 下的一个目录那么可以不指定该参数kitex 会使用GOPATH/src 开始的相对路径作为 import path 前缀。
如果当前目录不在 $GOPATH/src 下那么必须指定该参数。
如果指定了 -module 参数那么 kitex 会从当前目录开始往上层搜索 go.mod 文件

-service service_name
kitex 会生成构建一个服务的脚手架代码参数 service_name 给出启动时服务自身的名字通常其值取决于使用 Kitex 框架时搭配的服务注册和服务发现功能。

运行命令后生成的代码目录

image.png

然后执行命令
go mod tidy下载依赖

一个问题以及解决

代码生成后的hello/hello.go报错这是因为
github.com/apache/thrift 这个包使用的是v0.17.0版本的但v0.14.0之后的包中很多函数增加了context上下文参数所以很多函数由于缺少参数报错。
只需要修改go.mod中的require中github.com/apache/thrift v0.17.0
github.com/apache/thrift v0.13.0然后再执行go mod tidy问题就能解决

客户端的调用

import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"
import "example/kitex_gen/api"

...
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)

其中echo.NewClient(“example”, client.WithHostPorts(“0.0.0.0:8888”))是创建一个客户端连接第一个参数是服务名要与生成代码中的service_name保持一致第二个参数是指定server的地址和端口号server默认占用8888端口

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go