Go 如何通过grpc网关处理多个端点?

Go 如何通过grpc网关处理多个端点?,go,go-micro,grpc-gateway,Go,Go Micro,Grpc Gateway,我确信所有服务都正常工作。 我的代码如下: 此代码段用于注册两个端点 func RegisterEndpoints(ctx context.context,c*utils.AppConfig,r resolver.Builder)(http.Handler,错误){ 变量错误 mux:=runtime.NewServeMux() dialOpts:=[]grpc.DialOption{grpc.WithBalancerName(“循环”),grpc.WithUnsecure()} err=pro

我确信所有服务都正常工作。

我的代码如下:

此代码段用于注册两个端点

func RegisterEndpoints(ctx context.context,c*utils.AppConfig,r resolver.Builder)(http.Handler,错误){
变量错误
mux:=runtime.NewServeMux()
dialOpts:=[]grpc.DialOption{grpc.WithBalancerName(“循环”),grpc.WithUnsecure()}
err=protos.RegisterUserCenterHandlerFromEndpoint(ctx,mux,r.Scheme()+“://作者/用户中心”,拨号选项)
如果错误!=零{
返回零,错误
}
err=protos.RegisterSsoHandlerFromEndpoint(ctx,mux,r.Scheme()+“://author/sso”,dialOpts)
如果错误!=零{
返回零,错误
}
返回多路复用器,无
}
在我的
main.go
中,我构建了一个解析器,将名称解析为地址,然后注册两个端点并在端口8080上侦听

func run()错误{
c:=utils.GetAppConfig()
ctx:=context.Background()
ctx,cancel:=上下文。带取消(ctx)
推迟取消
r:=localresolver.NewResolver(fmt.Sprintf(“%s:%d”,c.Registry.Host,c.Registry.Port))
解析器寄存器(r)
mux:=http.NewServeMux()
//在此处注册端点
gw,err:=路由。注册点(ctx,c,r)
如果错误!=零{
返回错误
}
多路复用器手柄(“/”,gw)
fmt.Println(“侦听本地主机:8080…”)
返回http.listendServe(fmt.Sprintf(“%s:%d”、c.Gateway.Host、c.Gateway.Port)、mux)
}
func main(){
延迟glog.Flush()
如果错误:=run();错误!=nil{
glog.致命(错误)
}
}
但是在我运行了
go-run main.go
之后,我发现只有我注册的最后一个服务可以访问,那就是
sso
服务(the
err=protos.RegisterSsoHandlerFromEndpoint(ctx,mux,r.Scheme()+“://author/sso”,dialOpts)
行)

有人能给我举一个通过
grpc网关注册多个端点的正确方法的例子吗?(使在
grpc网关注册的所有服务都能成功访问)


[2020-01-31]需要更多帮助,现在我的代码如下:

其他代码与以前相同

另外,这是名称解析程序显示的结果:


无需将
ServeMux
(gw)作为处理程序传递给mux var,您只需将其侦听并服务于返回的
gw
变量即可

//在此处注册端点
gw,err:=路由。注册点(ctx,c,r)
如果出错!=零{
返回错误
}
fmt.Println(“侦听本地主机:8080…”)
返回http.listendServe(fmt.Sprintf(“%s:%d”,c.Gateway.Host,c.Gateway.Port),gw)
RegisterEndpoints
函数中,端点参数应该是您的
host:port
,api端点应该在proto文件的google api注释中提供

err=protos.RegisterUserCenterHandlerFromEndpoint(ctx、mux、fmt.Sprintf(“%s:%d”、c.Gateway.Host、c.Gateway.Port)、dialOpts)
如果出错!=零{
返回零,错误
}
err=protos.RegisterSsoHandlerFromEndpoint(ctx、mux、fmt.Sprintf(“%s:%d”、c.Gateway.Host、c.Gateway.Port)、dialOpts)
如果出错!=零{
返回零,错误
}

无需将
ServeMux
(gw)作为处理程序传递给mux var,您只需列出并服务于返回的
gw
变量即可

//在此处注册端点
gw,err:=路由。注册点(ctx,c,r)
如果出错!=零{
返回错误
}
fmt.Println(“侦听本地主机:8080…”)
返回http.listendServe(fmt.Sprintf(“%s:%d”,c.Gateway.Host,c.Gateway.Port),gw)
RegisterEndpoints
函数中,端点参数应该是您的
host:port
,api端点应该在proto文件的google api注释中提供

err=protos.RegisterUserCenterHandlerFromEndpoint(ctx、mux、fmt.Sprintf(“%s:%d”、c.Gateway.Host、c.Gateway.Port)、dialOpts)
如果出错!=零{
返回零,错误
}
err=protos.RegisterSsoHandlerFromEndpoint(ctx、mux、fmt.Sprintf(“%s:%d”、c.Gateway.Host、c.Gateway.Port)、dialOpts)
如果出错!=零{
返回零,错误
}

我将
grpc.WithBlock()
添加到
grpc.DialOption
,然后现在可以通过
grpc网关访问所有服务

如下图所示:

dialOpts:=[]grpc.dialpoption{grpc.WithBalancerName(“循环”),grpc.WithUnsecure(),grpc.WithBlock()}

我将
grpc.WithBlock()
添加到
grpc.DialOption
,然后现在可以通过
grpc网关访问所有服务

如下图所示:

dialOpts:=[]grpc.dialpoption{grpc.WithBalancerName(“循环”),grpc.WithUnsecure(),grpc.WithBlock()}

感谢您的回答,但按照您的建议去做,它仍然不起作用。在我的例子中,我使用
etcd
作为注册表,因此两个服务
user center
sso
具有不同的
host:port
对,因此我使用
r
作为解析程序来告诉gRPC解析地址。在我启动
grpc网关
服务后,发现了它们的两个地址,但仍然只能访问最后注册的地址。希望能得到更多的帮助。我已经更新了这个问题,以显示更多的细节,期待您的答复。感谢您的回答,但按照您的建议,它仍然无法工作。在我的例子中,我使用
etcd
作为注册表,因此两个服务
user center
sso
具有不同的
host:port
对,因此我使用
r
作为解析程序来告诉gRPC解析地址。在我启动
grpc网关
服务后,发现了它们的两个地址,但仍然只能访问最后注册的地址。希望有更多的帮助。我已经更新了这个问题,以显示更多的细节,期待您的答复。