Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请求帮助:kitex 单 Server 多 Service #1345

Closed
fan-x-ing opened this issue May 9, 2024 · 14 comments
Closed

请求帮助:kitex 单 Server 多 Service #1345

fan-x-ing opened this issue May 9, 2024 · 14 comments
Assignees

Comments

@fan-x-ing
Copy link

问题

在使用 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 方法,没有在服务端注册成功,希望有大佬能够帮助下,折腾一上午了~

@HeyJavaBean
Copy link
Member

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

@Marina-Sakai
Copy link
Contributor

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.

@fan-x-ing
Copy link
Author

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

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

kitex -module drive idl/file.thrift

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

@fan-x-ing
Copy link
Author

fan-x-ing commented May 9, 2024

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 ,但是好像仍然出现对应错误

@Marina-Sakai
Copy link
Contributor

Marina-Sakai commented May 9, 2024

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

Both client and server?

@fan-x-ing
Copy link
Author

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

Both client and server?

yes, client and server

@fan-x-ing
Copy link
Author

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

Both client and server?

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

@fan-x-ing
Copy link
Author

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

Both client and server?

hello ?

@felix021
Copy link
Contributor

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

Both client and server?

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

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

@felix021
Copy link
Contributor

felix021 commented May 10, 2024

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

@felix021 felix021 assigned felix021 and unassigned Marina-Sakai May 10, 2024
@Marina-Sakai Marina-Sakai self-assigned this May 10, 2024
@fan-x-ing
Copy link
Author

麻烦给一个完整的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

@fan-x-ing
Copy link
Author

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

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

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

@felix021
Copy link
Contributor

felix021 commented May 13, 2024

麻烦给一个完整的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 上去?

@fan-x-ing
Copy link
Author

麻烦给一个完整的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 上去?

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

4 participants