首先还是参考文档

首先准备工作

先创建工作目录,然后创建三个idl文件
image-1733280743611
然后生成代码
kitex -module example_shop idl/item.thrift
kitex -module example_shop idl/stock.thrift
创建rpc的工作目录,这个目录就是rpc服务的存放位置
mkdir -p rpc/item rpc/stock
然后

// item 目录下执行
kitex -module example_shop -service example.shop.item -use example_shop/kitex_gen ../../idl/item.thrift

// stock 目录下执行
kitex -module example_shop -service example.shop.stock -use example_shop/kitex_gen ../../idl/stock.thrift

image-1733280938173
然后 go mod tidy 拉取依赖

根据文档实现服务逻辑

这里就不详细展开了,按照文档步骤操作即可
然后可以 sh build.sh利用脚本编译服务,会生成output文件夹,sh ./output/bootstrap.sh,运行该服务

运行 API 服务

根据文档内容:
有了商品服务后,接下来就让我们编写 API 服务用于调用刚刚运行起来的商品服务,并对外暴露 HTTP 接口。
首先,同样的,我们回到项目根目录先创建一个目录用于存放我们的代码:
mkdir api
创建main.go

package main

import (
	"context"
	"log"
	"time"

	"example_shop/kitex_gen/example/shop/item"
	"example_shop/kitex_gen/example/shop/item/itemservice"

	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/app/server"
	"github.com/cloudwego/kitex/client"
	"github.com/cloudwego/kitex/client/callopt"
)

var (
	cli itemservice.Client
)

func main() {
	c, err := itemservice.NewClient("example.shop.item", client.WithHostPorts("0.0.0.0:8888"))
	if err != nil {
		log.Fatal(err)
	}
	cli = c

	hz := server.New(server.WithHostPorts("localhost:8889"))

	hz.GET("/api/item", Handler)

	if err := hz.Run(); err != nil {
		log.Fatal(err)
	}
}

func Handler(ctx context.Context, c *app.RequestContext) {
	req := item.NewGetItemReq()
	req.Id = 1024
	resp, err := cli.GetItem(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
	if err != nil {
		log.Fatal(err)
	}

	c.String(200, resp.String())
}

然后就是下边的补充商品服务和实现库存逻辑

根据文档操作即可
注意到每一种服务都暴露出了自己调用的网络接口,我们通过api统一调用了这些服务

接下来就是正文了,服务注册与服务发现

首先是配置,使用什么注册中心
在给出的文档里使用了etcd,这里我也使用etcd
访问etcd官网,然后下载windows版本,解压之后,将image-1733281658615
这两个复制到$GOROOT/bin目录下
然后将etcd解压后的目录配置到环境变量里
image-1733281793427
在命令行打开输入etcd --version配置成功可以查看到etcd版本号
然后go下载 依赖
go get github.com/kitex-contrib/registry-etcd

根据参考文档

在 Kitex 中使用注册中心的流程比较简单,大致分为两步:

创建 Registry
在创建服务实例时通过 Option 参数指定 Registry 与服务基本信息
使用 etcd 时,可以使用以下函数创建 Registry:

func NewEtcdRegistry(endpoints []string, opts …Option) (registry.Registry, error)

func NewEtcdRegistryWithAuth(endpoints []string, username, password string) (registry.Registry, error)

func NewEtcdRegistryWithRetry(endpoints []string, retryConfig *retry.Config, opts …Option)

在代码中是这样的实现
r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"})
注册到服务中心
newserver的时候指定

svr := stock.NewServer(new(StockServiceImpl),
       server.WithServiceAddr(addr),
       // 指定 Registry 与服务基本信息
       server.WithRegistry(r),
       server.WithServerBasicInfo(
          &rpcinfo.EndpointBasicInfo{
             ServiceName: "example.shop.stock",
          },
       ),
    )

服务发现

根据参考文档
在 Kitex 中使用发现中心的流程比较简单,大致分为两步:

创建 Resolver
在创建服务调用客户端时通过 Option 参数指定 Resolver。
使用 etcd 时,可以使用以下函数创建 Resolver:

func NewEtcdResolver(endpoints []string, opts …Option) (discovery.Resolver, error)

func NewEtcdResolverWithAuth(endpoints []string, username, password string) (discovery.Resolver, error)

指定 Resolver 使用 client.WithResolver() 作为 option 参数在创建 client 时传入。

api的main.go中更新代码

resolver, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"})
if err != nil {
	log.Fatal(err)
}
c, err := itemservice.NewClient("example.shop.item", lient.WithResolver(resolver)) // 指定 Resolver
if err != nil {
	log.Fatal(err)
}

然后再次各自启动服务,在浏览器调用,注意别忘了启动etcd