Hyperf微服务——四、第一个微服务的搭建

一、JSON RPC 服务

是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。

服务有两种角色,一种是 服务提供者(ServiceProvider),即为其它服务提供服务的服务,另一种是 服务消费者(ServiceConsumer),即依赖其它服务的服务,一个服务既可能是 服务提供者(ServiceProvider),同时又是 服务消费者(ServiceConsumer)。 而两者直接可以通过 服务契约 来定义和约束接口的调用,在 Hyperf 里,可直接理解为就是一个 接口类(Interface),通常来说这个接口类会同时出现在提供者和消费者下。

二、定义服务提供者

1.安装rpc相关依赖

#安装json-rpc协议
composer require hyperf/json-rpc

#安装rpc服务端
composer require hyperf/rpc-server

#安装rpc客户端
composer require hyperf/rpc-client

2.修改配置文件config/autoload/server.php ,增加TCP Server

<?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' => [
   //此处提供TCP Server (适配 jsonrpc 协议)
       [
           'name' => 'jsonrpc',
           'type' => Server::SERVER_BASE,
           'host' => '0.0.0.0',
           'port' => 9503,
           'sock_type' => SWOOLE_SOCK_TCP,
           'callbacks' => [
               Event::ON_RECEIVE => [\Hyperf\JsonRpc\TcpServer::class, 'onReceive'],
           ],
           'settings' => [
               'open_eof_split' => true,
               'package_eof' => "\r\n",
               'package_max_length' => 1024 * 1024 * 2,
           ],
       ],
       //此处配置提供http服务,
       [
           'name' => 'http',
           'type' => Server::SERVER_HTTP,
           'host' => '0.0.0.0',
           'port' => 9501,
           'sock_type' => SWOOLE_SOCK_TCP,
           'callbacks' => [
               Event::ON_REQUEST => [Hyperf\HttpServer\Server::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'],
   ],
];

3.安装统一接入层

#安装统一接入层
composer require hyperf/service-governance

#安装适配器
composer require hyperf/service-governance-consul

4.发布服务到consul

#发布配置文件
php bin/hyperf.php vendor:publish hyperf/service-governance

组件由 config/autoload/services.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
 */
return [
    'enable' => [
        'discovery' => true,
        'register' => true,
    ],
    'consumers' => [],
    'providers' => [],
    'drivers' => [
        'consul' => [
            'uri' => env('CONSUL_URI', 'http://127.0.0.1:8500'),	//此处为自己的consul地址
            'token' => '',
            'check' => [
                'deregister_critical_service_after' => '90m',
                'interval' => '1s',
            ],
        ],
    ],
];

5.定义服务提供者

定义服务提供的接口,在app目录下创建JsonRpc目录并创建interface文件

<?php

namespace App\JsonRpc;

interface UserInterface
{
    public function getUserInfoById($id);
}

定义实现接口的服务,在app目录下创建service目录并创建service文件

<?php

namespace App\Service;

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

/**
 * Class UserService
 * @author Justin by 2022/6/17
 * @package App\Service
 * @RpcService(name="UserService", protocol="jsonrpc", server="jsonrpc", publishTo="consul")
 */
class UserService extends AbstructService implements UserInterface
{
    /**
     * @param $id
     * @return array
     */
    public function getUserInfoById($id) :array
    {
    	return [];
    }
}

@RpcService 共有 4 个参数:
name 属性为定义该服务的名称,这里定义一个全局唯一的名字即可,Hyperf 会根据该属性生成对应的 ID 注册到服务中心去;
protocol 属性为定义该服务暴露的协议,目前仅支持 jsonrpc-http, jsonrpc, jsonrpc-tcp-length-check ,分别对应于 HTTP 协议和 TCP 协议下的两种协议,默认值为 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 会提供HTTP服务和TCP服务,并自动地将 @RpcService 定义了 publishTo 属性为 consul 的服务注册到对应的服务中心去。在这里插入图片描述

进入consulweb界面,可以看到UserService服务已经注册到服务中心。

在这里插入图片描述

至此,一个用户服务已经成功创建并注册到consul中心,其他服务可以通过consul发现该服务并调用
getUserInfoById接口。

三、服务调用

这是一个简单的服务内部调用接口实现方法的方式。

<?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\Lib\UserInfoInterface;
use Hyperf\Utils\ApplicationContext;

class IndexController extends AbstractController
{
    public function index()
    {
    	//通过容器依赖注入的方式进行RPC调用
        $user_info = ApplicationContext::getContainer()->get(UserInfoInterface::class);
        return $user_info->getUserInfoById(1);
    }
}

至此,一个简单的微服务调用已经实现了。下面就可以根据实际的业务场景进行深度开发了。

后面会介绍如何进行跨服务间的RPC调用。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Hyperf 是一个基于 PHP 的高性能微服务框架,它是由 Hyperf 开发团队基于 Swoole 扩展开发的。Hyperf 框架具有轻量级、高性能、灵活可扩展等特点,适用于构建各种类型的微服务应用。 以下是 Hyperf 微服务框架的一些特点和功能: 1. 高性能:Hyperf 基于 Swoole 扩展,充分利用了 Swoole 的协程特性和异步非阻塞的 IO 模型,提供了卓越的性能表现。 2. 轻量级:Hyperf 框架本身非常轻量级,核心代码量少,运行时内存占用低,可以快速启动和运行。 3. 灵活可扩展:Hyperf 提供了丰富的组件和扩展机制,可以根据项目需求进行灵活的定制和扩展。 4. 支持多种协议:Hyperf 支持 HTTP、WebSocket、TCP、UDP 等多种协议,可以满足不同类型的微服务应用需求。 5. 强大的依赖注入容器Hyperf 内置了一个强大的依赖注入容器,可以方便地管理和注入各种组件和服务。 6. 高度可测试性:Hyperf 提供了丰富的测试工具和测试支持,可以方便地进行单元测试和集成测试。 7. 支持分布式部署:Hyperf 支持分布式部署,可以通过配置中心、服务注册与发现等机制实现微服务的高可用和负载均衡。 8. 提供丰富的组件:Hyperf 提供了许多常用的组件,如数据库 ORM、缓存、消息队列、验证器等,可以快速开发各种类型的微服务应用。 总之,Hyperf 是一个功能强大、性能优越的 PHP 微服务框架,适用于构建高性能、可扩展的微服务应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Justin-D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值