单个gRPC服务器能否运行多个同服务类的不同实例
Server server = ServerBuilder.forPort(8080) .addService(new AServiceImpl(argA)) .addService(new AServiceImpl(argB)) .build();
可行性与路由逻辑结论
- 该操作不能达到同时运行两个携带不同参数
AService实例的预期,属于无效操作 - 所有
AStub发起的服务调用,只会被路由到你第二次添加的、携带argB的AServiceImpl实例处理
具体原因
gRPC 服务端注册服务时,以.proto文件中定义的服务全限定名(包名+服务名)作为唯一key,同一个key仅能绑定一个服务实现实例。你两次调用addService传入的都是AService对应的实现类,服务名完全相同,因此后注册的实例会直接覆盖先注册的实例,只有最后一个实例会生效。
同端口部署多实例的可选方案
如果确实需要在同一个端口上运行两个不同配置的AService实例,可以参考以下两种方案:
- 修改
.proto定义,声明两个名称不同的服务,分别对应两个AServiceImpl实例注册,客户端根据需求选择对应的Stub发起调用 - 自定义服务路由拦截器,在请求头中添加参数标识,由拦截器将请求分发到对应配置的实例处理
内容的提问来源于stack exchange,提问作者Litchy
相关产品推荐
相关产品推荐

