使用 provider 呼叫 DevOps 服務
description: "自帶工具,快速驗證"
date: 2020.10.25 10:34
categories:
- Cloud
- DevOps
- Java
tags: [Microservices, RPC]
keywords: ZooKeeper, Dubbo, Telnet, Fastjson
當使用 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 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 651bded02416 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×tamp=1603525931278&version=1.0.0
可以看到 dubbo 的服務執行在註冊中心相同主機的 20880
埠。
呼叫服務
因本例中所有服務均在本地啟動,可以 telnet 進 dubbo 服務中:
$ telnet localhost 20880
Trying ::1...
Connected to localhost.
Escape character is '^]'.
dubbo> help
Please input "help [command]" show detail.
status [-l] - Show status.
shutdown [-t <milliseconds>] - 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>ls
PROVIDER:
org.apache.dubbo.samples.api.GreetingService:1.0.0
檢視服務中方法資訊:
dubbo>ls org.apache.dubbo.samples.api.GreetingService -l
org.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.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</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.