美文网首页
hyperf3.0 docker中Nacos服务消费者

hyperf3.0 docker中Nacos服务消费者

作者: geeooooz | 来源:发表于2023-05-31 10:00 被阅读0次

    创建服务消费者:
    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

    相关文章

      网友评论

          本文标题:hyperf3.0 docker中Nacos服务消费者

          本文链接:https://www.haomeiwen.com/subject/cfcyedtx.html