1. 程式人生 > >Swoft 踩坑筆記十五 - RPC 建立服務端與客戶端

Swoft 踩坑筆記十五 - RPC 建立服務端與客戶端

RPC的作用就是遠端呼叫,也就是介面。

需要準備的

  1. 倆臺虛擬機器,主要用來測試不同ip的。也不是必須,只是便於理解。
  2. 倆臺虛擬機器都要有一份swoft。

我們先使用swoft裡的domo做講解,然後再自己做一遍。

此時
虛擬機器A的IP:192.168.247.140
虛擬機器B的IP:192.168.247.141

虛擬機器A (客戶端)

首先,我們開啟這三個檔案
在這裡插入圖片描述
圖中88行那改成你虛擬機器B的ip和埠。

DemoInterface.php:定義介面
DemoService.php:實現定義的介面
這倆個讓你開啟是讓你看的,無需做修改,你只需修改 .env

裡的,改好重啟服務。
DemoService.php裡的類註釋有一個@Service(),這個是配置服務端版本號的,@Service()不填預設為0。用法看下面的客戶端。

至此,服務端建立。
啥是服務端?
就是提供服務的。呼叫這個服務的叫做客戶端。

虛擬機器B(服務端)

虛擬機器只需啟動就可以了

# cd swoft/bin/
# php swoft rpc:start

瀏覽器訪問(這個頁面是一個普通的控制器)
修改客戶端 .env HTTP_PORT=8081

http://192.168.247.140:8081/rpc/call

在這裡插入圖片描述
至此,客戶端也成功呼叫到了。
你想知道是不是真的成功了?那很簡單,你把服務端的swoft停掉再訪問就知道啦。
下面開啟的是上面訪問的控制器
在這裡插入圖片描述


@Reference(name=“user”, version=“1.0.1”)
name:服務名稱
version:服務版本號

好了,我們來做服務端和客戶端吧!

服務端說明

需要定義一個介面,然後實現這個介面。

定義介面

建立swoft/app/Lib/TestInterface.php

<?php

namespace App\Lib;

use Swoft\Core\ResultInterface;

interface TestInterface
{
    public function getStr(string $str);

}

實現介面
建立 swoft/app/Services/TestService.php

<?php

namespace App\Services;

use App\Lib\TestInterface;
use Swoft\Rpc\Server\Bean\Annotation\Service;

/**
 * @Service()
 */
class TestService implements TestInterface
{
    public function getStr(string $str)
    {
        return ['我是服務端的' . $str];
    }

}

客戶端說明

1、從服務端拷貝一份TestInterface.php 到客戶端swoft/app/Lib/TestInterface.php,也就是把檔案拉進去
2、將三個User的拷貝一份,把User的都改成Test
和服務端不同的是客戶端需要有連線池和熔斷器。
連線池和熔斷器的名稱要一樣。
連線池由兩部分組成,“連線池”和“連線池配置”。
在這裡插入圖片描述
TestBreaker.php改@Breaker(“user”)為@Breaker(“test”),改類名
TestServicePool.php改@Pool(name=“user”)為@Pool(name=“test”),改類名
TestPoolConfig.php 改類名

3、建立測試控制器 swoft/app/Controllers/TestController.php

<?php

namespace App\Controllers;

use Swoft\Http\Message\Server\Request;
use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;
use Swoft\Rpc\Client\Bean\Annotation\Reference;
use App\Lib\TestInterface;
/**
 * Class TestController
 * @Controller("/test")
 */
class TestController
{
    /**
     * @Reference(name="test")
     *
     * @var TestInterface
     */
    private $testService;

    /**
     * @RequestMapping(route="test")
     */
    public function test()
    {
        $result  = $this->testService->getStr('-這兒是客戶端');
        return [
            'result'  => $result,
        ];
    }

}

服務端啟動

# cd swoft/bin/
# php swoft rpc:start

客戶端啟動
修改客戶端 .env HTTP_PORT=8081

# cd swoft/bin/
# php swoft start

訪問

192.168.247.140:8081/test/test

在這裡插入圖片描述

下一篇:服務降級與熔斷器