开发者社区 > 云原生 > 正文

dubbo3客户端服务通过nacos调用下游C++服务失败

一、目的

有一个使用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秒发送一次实例心跳,保证该实例健康; 服务状态信息如下图所示:

提问10.png

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客户端调用出错,报错信息如下:

提问11.png

三、问题

1、推测是java客户端调用代码有问题,我理解调用方在调用时需要指定下游的服务名字(brpc-server-provider-test),才能知道调用方要取的是nacos上哪个服务的实例,但是我不清楚应该在哪里设置下游服务名字?

2、c++服务端注册缺失了metadata?

原提问者GitHub用户Silocean

展开
收起
大圣东游 2023-05-11 15:45:09 229 0
1 条回答
写回答
取消 提交回答
  • 已解决:

    1、metadata中需要加上使用的协议

    { "protocol": "tri" }

    2、服务注册的名字要按照以下固定格式来

    providers:${rpc接口全限定名}:${version}:${group}

    原回答者GitHub用户Silocean

    2023-05-12 10:16:36
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
使用C++开发PHP7扩展 立即下载
workshop专场-微服务专场-开发者动手实践营-微服务-使用Nacos进行服务的动态发现和流量调度 立即下载
Nacos 启航,发布第一个版本, 云原生时代助力用户微服务平台建设 立即下载