一、目的
有一个使用brpc的C++下游服务和一个使用dubbo3的java上游服务,希望将C++服务通过nacos HTTP接口注册到nacos注册中心,java服务通过nacos注册中心拿到下游服务实例列表,以此实现跨语言服务调用。
二、实现方法
1、在测试机上启动C++服务,监听8000端口;
2、使用nacos HTTP接口注册服务(http://localhost:8848/nacos/v1/ns/instance?ip=10.41.133.13&port=8000&weight=1.0&serviceName=brpc-server-provider-test);
3、测试机上启动脚本每隔5秒发送一次实例心跳,保证该实例健康; 服务状态信息如下图所示:
4、java服务通过dubbo调用该C++服务,使用协议为triple,代码如下:
DubboBootstrap bootstrap = DubboBootstrap.newInstance(); ReferenceConfig ref = new ReferenceConfig<>(); ref.setInterface(EchoService.class); ref.setProtocol(CommonConstants.TRIPLE); ref.setProxy(CommonConstants.NATIVE_STUB); ref.setTimeout(3000); ConsumerConfig consumerConfig = new ConsumerConfig();
bootstrap.application(new ApplicationConfig("dubbo-grpc-client")) .registry(new RegistryConfig("nacos://localhost:8848")) .consumer(consumerConfig) .reference(ref) .start();
EchoService echoService = ref.get(); EchoRequest request = EchoRequest.newBuilder().setMessage("hello echo").build(); EchoResponse reply = echoService.echo(request); System.out.println("received replay: " + reply.getMessage());
5、java客户端调用出错,报错信息如下:
三、问题
1、推测是java客户端调用代码有问题,我理解调用方在调用时需要指定下游的服务名字(brpc-server-provider-test),才能知道调用方要取的是nacos上哪个服务的实例,但是我不清楚应该在哪里设置下游服务名字?
2、c++服务端注册缺失了metadata?
原提问者GitHub用户Silocean
已解决:
1、metadata中需要加上使用的协议
{ "protocol": "tri" }
2、服务注册的名字要按照以下固定格式来
providers:${rpc接口全限定名}:${version}:${group}
原回答者GitHub用户Silocean
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。