dubbo本地调用和远程调用_使用 Telnet 调用 Dubbo 服务

本文介绍了如何使用 Dubbo 自带的 Telnet 工具验证服务。通过启动 ZooKeeper 注册中心和 Dubbo Provider,然后通过注册中心查找服务信息,使用 Telnet 调用服务进行本地和远程调用的验证。在过程中遇到了因缺少 fastjson 依赖导致的异常,添加依赖并重启服务后,成功完成调用。
摘要由CSDN通过智能技术生成

230949d07058782e8f84d42bb1a518d2.png


当使用 Dubbo 作为 RPC 框架时,有时会希望验证 provider 提供的服务是否好用,比起开发一个 consumer,可以使用自带工具来进行更快速的验证。

本文以使用 ZooKeeper v3.6.1 为注册中心,dubbo-samples-zookeeper 示例代码为例,介绍一下自 dubbo v2.0.5 版本开始支持的 telnet 命令用法。

环境准备

启动注册中心

先在本地 2181 端口启动一个 ZooKeeper 服务,可使用示例中提供的 docker-compose.yml 或如下内容:

version: '3.3'
services:
zookeeper:
image: "zookeeper:3.6.1"
ports:
- "2181:2181"

在 docker-compose.yml 文件所在路径执行 docker-compose up -d 完成服务启动,并可通过 docker ps 查看服务状态:

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                  NAMES651bded02416        zookeeper:3.6.1     "/docker-entrypoint.…"   36 minutes ago      Up 36 minutes       2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp   compose-docker_zookeeper_1

启动 Dubbo Provider 服务

dubbo-samples-zookeeper 路径下内容导入 IDE,并运行 ProviderBootstrap.java,在 Console 中看到 dubbo service started 意味着服务完成启动。

通过注册中心找到 provider 信息

假定我们并不清楚服务发布在了哪,可以先通过注册中心,查找到所要调用的服务相关信息。

在 ZooKeeper 的运行路径中,包含了一个客户端可以查询 ZK 中信息。以前面环境为例,先进入到注册中心的容器中:

$ docker exec -ti compose-docker_zookeeper_1 bash

在容器内 /apache-zookeeper-3.6.1-bin/bin 路径下运行客户端脚本:

$ ./zkCli.sh

进入客户端后通过 ls 命令查询服务信息:

[zk: localhost:2181(CONNECTED) 0] ls /dubbo/org.apache.dubbo.samples.api.GreetingService/providers[dubbo%3A%2F%2F127.0.0.1%3A20880%2Forg.apache.dubbo.samples.api.GreetingService%3Fanyhost%3Dtrue%26application%3Dzookeeper-demo-provider%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26generic%3Dfalse%26group%3Dabc%26interface%3Dorg.apache.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D10929%26release%3D2.7.7%26revision%3D1.0.0%26side%3Dprovider%26timestamp%3D1603525931278%26version%3D1.0.0]

查询结果进行 URI decode 之后得到如下内容:

dubbo://127.0.0.1:20880/org.apache.dubbo.samples.api.GreetingService?anyhost=true&application=zookeeper-demo-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=abc&interface=org.apache.dubbo.samples.api.GreetingService&methods=sayHello&pid=10929&release=2.7.7&revision=1.0.0&side=provider&timestamp=1603525931278&version=1.0.0

可以看到 dubbo 的服务运行在注册中心相同主机的 20880 端口。

调用服务

因本例中所有服务均在本地启动,可以 telnet 进 dubbo 服务中:

$ telnet localhost 20880Trying ::1...Connected to localhost.Escape character is '^]'.dubbo> helpPlease input "help [command]" show detail. status [-l]                      - Show status. shutdown [-t ]     - Shutdown Dubbo Application. pwd                              - Print working default service. trace [service] [method] [times] - Trace the service. exit                             - Exit the telnet. help [command]                   - Show help. invoke [service.]method(args)    - Invoke the service method. count [service] [method] [times] - Count the service. clear [lines]                    - Clear screen. ls [-l] [service]                - List services and methods. log level                        - Change log level or show log select [index]                   - Select the index of the method you want to invoke. ps [-l] [port]                   - Print server ports and connections. cd [service]                     - Change default service.

查看提供的服务:

dubbo>lsPROVIDER:org.apache.dubbo.samples.api.GreetingService:1.0.0

查看服务中方法信息:

dubbo>ls org.apache.dubbo.samples.api.GreetingService -lorg.apache.dubbo.samples.api.GreetingService:1.0.0 (as provider):    java.lang.String sayHello(java.lang.String)

调用方法:

dubbo>invoke org.apache.dubbo.samples.api.GreetingService.sayHello('hinex')

此时可能会遇到一个异常信息:

Invalid json argument, cause: com/alibaba/fastjson/JSON

如果执行示例代码中的 ConsumerBootstrap 会发现 consumer 能正常的消费提供者的服务,并没有上述异常。此问题仅在通过 telnet 调用服务的时候出现。

可在 pom.xml 中添加 fastjson 的依赖来解决此问题:

<dependency>    <groupId>com.alibabagroupId>    <artifactId>fastjsonartifactId>    <version>1.2.73version>dependency>

重启 ProviderBootstrap 服务,并再次通过 telnet 进行调用,可得到正常的调用结果:

dubbo>invoke org.apache.dubbo.samples.api.GreetingService.sayHello('hinex')Use default service org.apache.dubbo.samples.api.GreetingService.result: "hello, hinex"elapsed: 1 ms.

参考资料

  • Telnet 命令参考手册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值