hyperf3.0 docker中Nacos服务提供者

2023-05-30  本文已影响0人  geeooooz

服务提供者

启动服务提供者容器

docker run --name hyperf_ser -v /e/php_code/hyperf-skeleton/user:/hyperf-skeleton -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.0-alpine-v3.15-swoole

安装hyperf

composer create-project hyperf/hyperf-skeleton hyperf
cd hyperf

将 Composer 镜像设置为阿里云镜像,加速国内下载速度

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

进入hyperf项目后安装以下依赖

composer require hyperf/json-rpc    //只是 JSON RPC 的协议处理的组件
composer require hyperf/rpc-server  //JSON RPC 服务端
composer require hyperf/service-governance
composer require hyperf/service-governance-nacos //发布到服务中心时 需要用到这个组件

publishTo 属性为定义该服务所要发布的服务中心,目前仅支持 consulnacos 或为空,为空时代表不发布该服务到服务中心去,但也就意味着您需要手动处理服务发现的问题,要使用此功能需安装 hyperf/service-governance 组件及对应的驱动依赖。

可以看一下 服务注册篇:https://hyperf.wiki/3.0/#/zh-cn/service-register

配置和代码

定义服务提供者:进入到config/autoload/server.phpservers中添加下面配置:

[
            'name' => 'jsonrpc-http',
            'type' => Server::SERVER_HTTP,
            'host' => '0.0.0.0',
            'port' => 9504,
            'sock_type' => SWOOLE_SOCK_TCP,
            'callbacks' => [
                Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
            ],
        ],

完整代码:

server.php

<?php

declare(strict_types=1);
/**
 * This file is part of Hyperf.
 *
 * @link     https://www.hyperf.io
 * @document https://hyperf.wiki
 * @contact  group@hyperf.io
 * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
 */
use Hyperf\Server\Event;
use Hyperf\Server\Server;
use Swoole\Constant;

return [
    'mode' => SWOOLE_PROCESS,
    'servers' => [
        [
            'name' => 'http',
            'type' => Server::SERVER_HTTP,
            'host' => '0.0.0.0',
            'port' => 9511,
            'sock_type' => SWOOLE_SOCK_TCP,
            'callbacks' => [
                Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
            ],
        ],
        [
            'name' => 'jsonrpc-http',
            'type' => Server::SERVER_HTTP,
            'host' => '0.0.0.0',
            'port' => 9504,
            'sock_type' => SWOOLE_SOCK_TCP,
            'callbacks' => [
                Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
            ],
        ],
    ],
    'settings' => [
        Constant::OPTION_ENABLE_COROUTINE => true,
        Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
        Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid',
        Constant::OPTION_OPEN_TCP_NODELAY => true,
        Constant::OPTION_MAX_COROUTINE => 100000,
        Constant::OPTION_OPEN_HTTP2_PROTOCOL => true,
        Constant::OPTION_MAX_REQUEST => 100000,
        Constant::OPTION_SOCKET_BUFFER_SIZE => 2 * 1024 * 1024,
        Constant::OPTION_BUFFER_OUTPUT_SIZE => 2 * 1024 * 1024,
    ],
    'callbacks' => [
        Event::ON_WORKER_START => [Hyperf\Framework\Bootstrap\WorkerStartCallback::class, 'onWorkerStart'],
        Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'],
        Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'],
    ],
];

定义服务接口类

创建接口类:App\JsonRpc\TestServiceInterface

<?php


namespace App\JsonRpc;


interface TestServiceInterface
{
    public function sum(int $a, int $b): int;

    public function diff(int $a, int $b): int;
}

定义接口实现类

创建实现类: App\JsonRpc\TestService

<?php


namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;

#[RpcService(name: "TestService",protocol: "jsonrpc-http",server: "jsonrpc-http",publishTo: "nacos")]
class TestService implements TestServiceInterface
{
    public function sum(int $a, int $b): int
    {
        return $a + $b;
    }

    public function diff(int $a, int $b): int
    {
        return $a - $b;
    }
}
@RpcService 共有 4 个参数:

name 属性为定义该服务的名称,这里定义一个全局唯一的名字即可,Hyperf 会根据该属性生成对应的 ID 注册到服务中心去;

protocol 属性为定义该服务暴露的协议,目前仅支持 jsonrpc 和 jsonrpc-http,分别对应于 TCP 协议和 HTTP 协议下的两种协议,默认值为 jsonrpc-http,这里的值对应在 Hyperf\Rpc\ProtocolManager 里面注册的协议的 key,这两个本质上都是 JSON RPC 协议,区别在于数据格式化、数据打包、数据传输器等不同。

server 属性为绑定该服务类发布所要承载的 Server,默认值为 jsonrpc-http,该属性对应 config/autoload/server.php 文件内 servers 下所对应的 name,这里也就意味着我们需要定义一个对应的 Server;

publishTo 属性为定义该服务所要发布的服务中心,目前仅支持 consul、nacos 或为空,为空时代表不发布该服务到服务中心去,但也就意味着您需要手动处理服务发现的问题,要使用此功能需安装 hyperf/service-governance 组件及对应的驱动依赖;

最后配置服务驱动

此地址为服务中心的地址,在启动服务时,Hyperf 会自动地将 @RpcService 定义了 publishTo 属性为 nacos的服务注册到服务中心去。

新建config/autoload/services.php文件,以下是配置:

<?php
return [
    'enable' => [
        'discovery' => true,
        'register' => true,
    ],
    'consumers' => [],
    'providers' => [],
    'drivers' => [
        'nacos' => [
            // nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
            // 'url' => '',
            // The nacos host info
            'host' => '117.108.30.33',//ip地址
            'port' =>'8848/nacos/#/login',//端口号,之前只写8848不行 还是要加上后边儿的才可以,相当于到登录页面
            // The nacos account info
            'username' => 'nacos',//账号
            'password' => 'nacos',//密码
            'group_name' => 'DEFAULT_GROUP',//分组名称 一般大家都写这个
            'namespace_id' => 'public',//命名空间 可选 (public/dev/test/pro)
            'heartbeat' => 5,//心跳 五秒一次
            'ephemeral'=>true //是否注册临时实例
        ],
    ],
];

ip等配置根据自己的来写啊

以上就完成配置和代码了,最后执行:

php bin/hyperf.php start

启动后:
docker中显示:


image.png

代表注册成功,每五秒心跳一次。

在nacos中可以看到:


image.png

最后如果想要在一个项目中同时实现消费者的话:

1.安装客户端,composer require hyperf/rpc-client

  1. 在services.php中增加这段配置
'consumers' => [
        [
            // name 需与服务提供者的 name 属性相同
            'name' => 'UserService',
            // 服务接口名,可选,默认值等于 name 配置的值,如果 name 直接定义为接口类则可忽略此行配置,如 name 为字符串则需要配置 service 对应到接口类
            'service' => \App\JsonRpc\UserServiceInterface::class,
            // 对应容器对象 ID,可选,默认值等于 service 配置的值,用来定义依赖注入的 key
            'id' => \App\JsonRpc\UserServiceInterface::class,
            // 服务提供者的服务协议,可选,默认值为 jsonrpc-http
            // 可选 jsonrpc-http jsonrpc jsonrpc-tcp-length-check
            'protocol' => 'jsonrpc-http',
            // 负载均衡算法,可选,默认值为 random
            'load_balancer' => 'random',
            // 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息
            'registry' => [
                'protocol' => 'nacos',
                'address' => 'http://96.125.168.77:8848/nacos/#/login',
            ],
        ]
    ],

3.在Index中编写方法

use App\JsonRpc\UserServiceInterface;
use Hyperf\Di\Annotation\Inject;

/**
     * @var UserServiceInterface
     */
    #[Inject]
    private $userService;

    public function index()
    {
        $result = $this->userService->sum(1,2);
        var_dump($result);
        return $result;
    }
//这样写也行
//#[Inject]
    //private UserServiceInterface $userService;
    //public function index()
    //{
     //   $result = $this->userService->sum(1,2);
     //   var_dump($result);
    //    return $result;
    //}

最后访问接口即可

上一篇 下一篇

猜你喜欢

热点阅读