cloudwego/kitex

请求帮助:kitex 单 Server 多 Service

fan-x-ing opened this issue · 14 comments

问题

在使用 kitex 单 Server 多 Service 时,多个 service 只成功注册一个,但并没有出现 error.

环境

  • kitex:v0.9.1
  • golang: 1.21.4
  • 系统环境:deepin v23 beta

问题详细描述

服务端

我尝试使用 单 Server 多 Service,我使用 kitex 生成了我的 kitex_gen 和 脚手架代码。
FileSystemImpl 相关代码之前已存在,我在 idl 中添加了 StoragesImpl 相关框架和方法,随后生成脚手架相关代码。
但是可能由于是新增方法,他并没有自动创建 StoragesImpl,于是我手动创建 StoragesImpl
随后我尝试在 main 函数中对 StoragesImpl 进行注册,注册和启动过程中,没有出现任何错误,正确运行程序。
下面是 main 函数的部分代码(包含注册和启动服务器流程):

	r, err := etcd.NewEtcdRegistry([]string{env.Config.Etcd.DSN})
	if err != nil {
		flog.Logger.Panic().Err(err).Msg("etcd注册中心连接失败")
	}
	addr, _ := net.ResolveTCPAddr("tcp", "0.0.0.0:9000")
	svr := server.NewServer(
		server.WithRegistry(r),
		server.WithServerBasicInfo(
			&rpcinfo.EndpointBasicInfo{ServiceName: "file"},
		),
		server.WithRefuseTrafficWithoutServiceName(),
		server.WithServiceAddr(addr),
		server.WithMaxConnIdleTime(time.Second),
		server.WithMuxTransport(),
	)

	err = storages.RegisterService(svr, new(StoragesImpl))
	if err != nil {
		flog.Logger.Panic().Err(err).Msg("服务注册失败")
	}
	err = filesystem.RegisterService(svr, new(FileSystemImpl))
	if err != nil {
		flog.Logger.Panic().Err(err).Msg("服务注册失败")
	}

	err = svr.Run()
	if err != nil {
		flog.Logger.Panic().Err(err).Msg("服务启动失败")
	}

客户端

随后我在客户端使用 StoragesImpl 相关方法:

func getStoragesConn() (storages.Client, error) {
	// 创建一个新的 Etcd 解析器
	r, err := etcd.NewEtcdResolver([]string{env.Config.Etcd.DSN})
	if err != nil {
		return nil, err
	}

	conn, err := storages.NewClient(
		"file",
		client.WithResolver(r),
		client.WithMuxConnection(2),
		client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "file"}),
		client.WithLongConnection(
			connpool.IdleConfig{
				MaxIdlePerAddress: 10,
				MinIdlePerAddress: 2,
			},
		),
		client.WithTransportProtocol(transport.TTHeader),
		client.WithMetaHandler(transmeta.ClientTTHeaderHandler),
	)

	return conn, err
}
func Upload(ctx context.Context, id int32, key string, metaData map[string]string) (URL string, err error) {
	conn, err := getStoragesConn()
	if err != nil {
		return
	}

	resp, err := conn.Upload(ctx, &file2.UploadReq{
		ID:       id,
		Key:      key,
		MetaData: metaData,
	})
	if err != nil {
		return
	}

	URL = resp.GetURL()
	return
}

相关报错

在客户端调用后,分别出现以下错误:

  • 客户端:remote or network error: conn closed
  • 服务端:{"level":"error","message":"KITEX: write error reply failed, remote=192.168.1.11:34372, error=empty methodName in thrift Marshal"}

貌似我的 Upload 方法,没有在服务端注册成功,希望有大佬能够帮助下,折腾一上午了~

可以重新生成一下 client 侧的代码后再试试,看起来更像是 client 客户端的包没有发送 method 名称,而不是 server 没注册上内容导致的报错

Also, there was a bug with Mux mode and it was fixed in #1294.
Please try to upgrade kitex version >= v0.9.2-rc1 on the server side.

可以重新生成一下 client 侧的代码后再试试,看起来更像是 client 客户端的包没有发送 method 名称,而不是 server 没注册上内容导致的报错

重新生成?是重新生成 kitex_gen 吗,我使用这个语句生成相关代码:

kitex -module drive idl/file.thrift

生成后,依旧出现这样的错误

Also, there was a bug with Mux mode and it was fixed in #1294. Please try to upgrade kitex version >= v0.9.2-rc1 on the server side.

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

Both client and server?

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

Both client and server?

yes, client and server

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

Both client and server?

我现在怀疑,是我的代码生成错误了,即 kitex -module *** 这样的语句编写错误,请问是否方便为我提供正确的 单 Server 多 Service 的代码生成语句?

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

Both client and server?

hello ?

我已经升级了我的版本,目前我的 kitex 版本为 v0.9.2-rc1 ,但是好像仍然出现对应错误

Both client and server?

我现在怀疑,是我的代码生成错误了,即 kitex -module *** 这样的语句编写错误,请问是否方便为我提供正确的 单 Server 多 Service 的代码生成语句?

multiservice 在代码生成上没有特殊参数

麻烦给一个完整的demo(包含server&client),我可以试试看能否复现,以便进一步排查

麻烦给一个完整的demo(包含server&client),我可以试试看能否复现,以便进一步排查

我预计将我的 IDL 给你,由你本地测试,如何?

namespace go file

struct AddObjectReq {}

struct AllResp {
    1: string msg
}

service FileSystem {
    AllResp OpenObject()
    AllResp AddObject()
    AllResp DelObject()
    AllResp ListObject()
    AllResp Mkdir()
}

service Storages {
    AllResp Download()
    AllResp Upload()
    AllResp Delete()
    AllResp Check()
    AllResp Head()
}

这是我在测试中预计做的一个 IDL

麻烦给一个完整的demo(包含server&client),我可以试试看能否复现,以便进一步排查

我使用下面这些语句来生成代码:

 kitex -module file idl/file.thrift
cd cmd
kitex -module file -service file -use file/kitex_gen ../idl/file.thrift

麻烦给一个完整的demo(包含server&client),我可以试试看能否复现,以便进一步排查

我使用下面这些语句来生成代码:

 kitex -module file idl/file.thrift
cd cmd
kitex -module file -service file -use file/kitex_gen ../idl/file.thrift

能否在 github 上建个项目,把idl、生成好的代码,以及你的测试 client/server 都 push 上去?

麻烦给一个完整的demo(包含server&client),我可以试试看能否复现,以便进一步排查

我使用下面这些语句来生成代码:

 kitex -module file idl/file.thrift
cd cmd
kitex -module file -service file -use file/kitex_gen ../idl/file.thrift

能否在 github 上建个项目,把idl、生成好的代码,以及你的测试 client/server 都 push 上去?

我新建的测试项目貌似没这个问题,那可能是我之前那些代码出了一些问题!这段时间打扰了!