hyperf3.0 docker中Nacos服务消费者

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

创建服务消费者:
1.先搞个容器

docker run --name hyperf_xiaofei -v /e/php_code/hyperf-skeleton/xiaofei:/hyperf-skeleton -p 9512:95012 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:8.0-alpine-v3.15-swoole

主要是为了区分端口。

2.新建项目:

composer create-project hyperf/hyperf-skeleton rpc_consume

rpc_consume是项目名称

3.安装jsonRpc组件&客户端:

composer require hyperf/json-rpc        //jsonRpc组件
composer require hyperf/rpc-client      //客户端

报错(Config of registry or nodes missing),检查文件services.php无误发现还需组件:

composer require hyperf/service-governance-nacos

4.报错(cURL error 7: Failed to connect to 127.0.0.1 port 8848 after 0 ms: Connection refused),直接按照文档配置开始就感觉有点不对劲,服务提供时新开的namespace_id不用配置?最后发现在服务提供者那和consumers同级有个drivers,直接带过来就可以了。直接看第七条也行。

image.png

5.server.php中需要修改port9512

image.png

6.新建UserServiceInterface接口类

<?php


namespace App\JsonRpc;


interface UserServiceInterface
{
    public function sum(int $a,int $b);
}
image.png

7.增加services.php配置,用于自动创建代理消费者类。

<?php

return [
    // 此处省略了其它同层级的配置
    '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://447.888.77.13:8848/nacos/#/login',
            ],
        ]
    ],
    //Nacos服务驱动相关配置  官方文档是只有上面的配置
    'drivers' => [
        'nacos' => [
            // nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
            // 'url' => '',
            // The nacos host info
            'host' => '110.11.00.55',//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 //是否注册临时实例
        ],
    ],
];

8.在Index中编写方法

<?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
 */
namespace App\Controller;
use App\JsonRpc\UserServiceInterface;
use Hyperf\Di\Annotation\Inject;
class IndexController extends AbstractController
{
    /**
     * @var UserServiceInterface
     */
    #[Inject]
    private $userService;

    public function index()
    {
        $result = $this->userService->sum(1,2);
        var_dump($result);
        return $result;
    }

}

这样就可以执行到服务提供者的 sum函数。

启动服务提供者;
再访问接口 http://localhost:9512/
就会输出 3

拓展

官方文档

配置复用

通过循环生成配置

1.配置服务消费者绑定关系

<?php

//定义服务消费者配置文件,用来快速注册服务消费者
return [
    //用户服务  服务名=>接口文件
    'UserService' => \App\JsonRpc\UserServiceInterface::class,
    'HyperfTest' => \App\JsonRpc\TestServiceInterface::class,

];

2.通过在 config/autoload/services.php配置文件内进行一些简单的配置,即可通过[动态代理]自动创建消费者类。

<?php

return [
    // 此处省略了其它同层级的配置
    //通过闭包函数完成多个服务消费者的定义
    'consumers' => value(function () {
        $consumers = [];
        // 这里示例自动创建代理消费者类的配置形式,顾存在 name 和 service 两个配置项,这里的做法不是唯一的,仅说明可以通过 PHP 代码来生成配置
        // 下面的 FooServiceInterface 和 BarServiceInterface 仅示例多服务,并不是在文档示例中真实存在的
        $services = include __DIR__ . '/service_consumers.php';
        foreach ($services as $name => $interface) {
            $consumers[] = [
                'name' => $name,
                'service' => $interface,
                'registry' => [
                    'protocol' => 'nacos',
                    'address' => 'http://11.11.11.33:8848/nacos/#/login',
                ]
            ];
        }
        return $consumers;
    }),
//    '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://11.11.11.33:8848/nacos/#/login',
//            ],
//        ]
//    ],
    //Nacos服务驱动相关配置
    'drivers' => [
        'nacos' => [
            // nacos server url like https://nacos.hyperf.io, Priority is higher than host:port
            // 'url' => '',
            // The nacos host info
            'host' => '11.11.11.33',//ip地址
            'port' =>'8848/nacos/#/login',//端口号,之前只写8848不行 还是要加上后边儿的才可以,相当于到登录页面
            // The nacos account info
            'username' => 'nacos',//账号
            'password' => 'nacos',//密码
            'group_name' => 'DEFAULT_GROUP',//分组名称 一般大家都写这个
            'namespace_id' => 'test',//命名空间 可选 (public/dev/test/pro)
            'heartbeat' => 5,//心跳 五秒一次
            'ephemeral'=>true //是否注册临时实例
        ],
    ],
];

3.封装rpc调用方法
可以通过封装简易调用方法,以方便业务开发者使用,不需要关注调用逻辑。

<?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
 */
namespace App\Controller;
use Hyperf\Context\ApplicationContext;

class IndexController extends AbstractController
{
    public function index()
    {
        //调用demo  (  接口类,方法名,数组参数)
        $result = $this->rpc('\App\JsonRpc\UserServiceInterface','sum', [110,100]);
        $result2 = $this->rpc('\App\JsonRpc\TestServiceInterface','sum', [110,100]);
        var_dump($result);
        var_dump($result2);
    }


    //封装简易rpc调用,
    public function rpc($interface, $function, $args)
    {
        $interface = (new \ReflectionClass($interface))->getName();
        $data = ApplicationContext::getContainer()->get($interface)->$function($args);
        return $data;
    }
}

执行后拿到输出


image.png

4.消费者项目中用到的两个接口。

TestServiceInterface

<?php


namespace App\JsonRpc;


interface TestServiceInterface
{
    public function sum(array $args): int;

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


UserServiceInterface

<?php


namespace App\JsonRpc;


interface UserServiceInterface
{
    public function sum(array $args): int;

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

5.UserService服务提供者两个类:

<?php


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

#[RpcService(name: "UserService",protocol: "jsonrpc-http",server: "jsonrpc-http",publishTo: "nacos")]
class UserService implements UserServiceInterface
{
    public function sum(array $args): int
    {
        return array_sum($args);
    }

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




<?php


namespace App\JsonRpc;


interface UserServiceInterface
{
    public function sum(array $args): int;

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

6.HyperfTest服务提供者两个类:

<?php


namespace App\JsonRpc;

use Hyperf\RpcServer\Annotation\RpcService;

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

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






<?php


namespace App\JsonRpc;


interface TestServiceInterface
{
    public function sum(array $args): int;

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

转载:https://blog.csdn.net/LuckyStar_D/article/details/125404054

上一篇下一篇

猜你喜欢

热点阅读