1. 程式人生 > 實用技巧 >使用 provider 呼叫 DevOps 服務

使用 provider 呼叫 DevOps 服務

cover

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&timestamp=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.

參考資料