请求帮助: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 上去?
我新建的测试项目貌似没这个问题,那可能是我之前那些代码出了一些问题!这段时间打扰了!