Skip to content

Latest commit

 

History

History
123 lines (81 loc) · 2.79 KB

service.md

File metadata and controls

123 lines (81 loc) · 2.79 KB

Service服务

  • Service服务是配合服务中心来实现服务化的。每个服务可以单独启动一个server,处理请求。

    在开发Service模块时候,同样要注意内存释放问题。并且不可以使用异步服务,此模块是以同步方式执行的。

    所以说,你可以用传统的方式来编写服务接口,当然你也可以使用内置的一些异步task方法来实现map-reduce,提升接口吞吐。

1.开启服务如执行 app/service user,会开放服务下面指定开放模块所有公有函数调用

2.使用Console控制台,自动初始化服务

app/console generate:service demo

3.简单介绍一下生成的服务目录结构

  • User (示例)

    • Dao

      • Impl (数据层实现的接口)

        • UserDaoImpl.php(接口实现)
      • UserDao.php(接口)

    • Service

      • Impl (服务层实现的接口)

        • UserServiceImpl.php(接口的实现)
      • Rely (定义服务之间的依赖关系)

      • UserService.php(接口)

Service类

$this->createDao($serviceName)

实例化一个dao类

$this->createService($serviceName)

实例化一个service类

//返回User模块下UserDao接口实例
public function getUserDao()
{
    return $this->createDao("User:User");
}

//返回User模块下UserProfileService接口实例
public function getUserProfileService()
{
    return $this->createService("User:UserProfile");
}

异步多task任务

在Service内部封装了一套异步多task模拟map-reduce的处理慢速任务的方法,可以极大提升单个接口吞吐

    //单进程慢速任务 通过异步的多task去做,速度会翻倍
    public function getUsersCache($ids)
    {   
        //异步多task模式。耗时8ms
        foreach ($ids as $id) {
            $this->task('User\User::getUser', ['id' => $id]);
        }

        return $this->finish();

        //正常模式 耗时250ms
        // $users = [];
        // foreach ($ids as $id) {
        //     $users[] = $this->getUser($id);
        // }

        // return $users;
    }

通过

$this->task($cmd, $data),

$this->finish();

两个方法实现

  • 注意使用此方式实现的接口无法再内部调用。以下方式调用是无效的:
public function getUser($id)
{
     $user = $this->getUserDao()->getUser($id);
     
     //此时无法返回正常数据。
     $user['users'] = $this->getUsersCache([1,2,3]);
     
     return $user;
}

//单进程慢速任务 通过异步的多task去做,速度会翻倍
public function getUsersCache($ids)
{
     //异步多task模式。耗时8ms
     foreach ($ids as $id) {
     $this->task('User\User::getUser', ['id' => $id]);
     }
     
     return $this->finish();

}