Hyperf JsonRPC 服務的搭建 -- 簡單實例

JSON-RPC,是一個無狀態且輕量級的遠程過程調用(RPC)傳送協議,其傳遞內容透過 JSON 爲主。
我們需要佈置兩臺服務,一臺Provider提供服務,另外一臺Consumer消費服務
 

準備工作

1、所需類庫

composer require hyperf/json-rpc
composer require hyperf/rpc-server
composer require hyperf/rpc-client
composer require hyperf/consul
composer require hyperf/service-governance

2、工具

下載consul for linux,解壓後就是一個可執行文件,直接mv到/usr/bin/consul

新建一個consul文件夾,在裏面新建一個data文件夾和etc文件夾,data文件夾用於存放consul的數據文件,etc用於存放配置文件

切換到etc文件夾,新建一個web.json文件,內容如下:

{
    "service": {
        //這裏寫服務的ID,必須唯一
        "id": "CalculatorService",
        //這裏寫服務名稱,一般也是ID名,非唯一
        "name": "CalculatorService",
        //註冊服務,服務在哪臺服務器上,就填寫那臺服務器IP,這裏我填寫server2的ip,因爲是server2提供服務給server1調用
        "address": "server2.ip.server2.ip",
        //隨便寫
        "tags": [
            "webapi"
        ],
        //同上,服務也有端口,就填寫那臺服務器提供的端口,這裏填寫server2的端口
        "port": 9502
    }
}

回到consul目錄,啓動consul,其中-config-dir指定剛剛的配置目錄,-data-dir指定存放數據的目錄

consul agent -dev -ui -config-dir=./etc -data-dir=./data -client=0.0.0.0
或者
consul agent -dev -ui -data-dir=./data -client=0.0.0.0

client=0.0.0.0這裏需要注意下,網上一般的都是127.0.0.1,如果寫成127.0.0.1同樣可以運行,但是沒辦法在外網訪問consul的UI界面,所以這裏改成0.0.0.0

在瀏覽器輸入IP:8500,就可以看到consul安裝成功

 

3、Provider的配置 

1、服務提供類
<?php
namespace App\Rpc;
use Hyperf\RpcServer\Annotation\RpcService;
/**
* @RpcService(name="CalculatorService",protocol="jsonrpc-http",server="jsonrpc-http")
*/
class CalculatorService implements CalculatorServiceInterface
{
    public function add(int $a, int $b): int
    {
        return $a + $b;
    }
public function minus(int $a, int $b): int { return $a - $b; } } 
2、接口類
namespace App\Rpc;
interface CalculatorServiceInterface
{
    public function add(int $a, int $b): int;
    public function minus(int $a, int $b): int;
} 
 
 
3、配置文件 service.php
    ...
    [
        'name' => 'jsonrpc-http',
        'type' => Server::SERVER_HTTP,
        'host' => '0.0.0.0',
        'port' => 9802,
        'sock_type' => SWOOLE_SOCK_TCP,
        'callbacks' => [
            SwooleEvent::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
        ],
    ],
],

 

 

3、Consumer 的配置 

1、接口類
namespace App\Rpc;
interface CalculatorServiceInterface
{
    public function add(int $a, int $b): int;
    public function minus(int $a, int $b): int;
} 
 
2、配置文件 services.php
    'consumers' => [
        [
            'name'    => 'CalculatorService',
            'service' => \App\Rpc\CalculatorServiceInterface::class,
            'nodes'   => [
                [
                   'host' => '0.0.0.0',
                    'port' => 9802
                ],
            ],
        ],
    ],
]; 
3、調用

 

namespace App\Controller;
use App\Rpc\CalculatorServiceInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
/**
 * @AutoController()
 */
class IndexController extends AbstractController
{
    /**
     * @Inject()
     * @var CalculatorServiceInterface
     */
    private $calculatorService;

    public function rpc()
    {
        return $this->calculatorService->minus(10,2);
    }
}

 

4、使用consul 

如果需要使用 consul來管理服務,則需要做如下操作

1).修改Provider具體的服務類,註解添加屬性 publishTo
1
2
/**
* @RpcService(name="CalculatorService",protocol="jsonrpc-http",server="jsonrpc-http",publishTo="consul") */
2).Provider服務發佈
php bin/hyperf.php vendor:publish hyperf/consul

執行完畢後會形成一個配置文件 consul.php

3).Conusmer修改配置

    'consumers' => [
        [
            'name'    => 'CalculatorService',
            'service' => \App\Rpc\CalculatorServiceInterface::class,
       registry' => [

'protocol' => 'consul',
                'address' => 'http://127.0.0.1:8500',//對應Provider 中  consul.php配置項
            ]
     ], 
  ],
];

 

4).重新啓動Provider和Consumer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章