Service服务

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

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

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

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

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

  1. 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类

  1. //返回User模块下UserDao接口实例
  2. public function getUserDao()
  3. {
  4. return $this->createDao("User:User");
  5. }
  6. //返回User模块下UserProfileService接口实例
  7. public function getUserProfileService()
  8. {
  9. return $this->createService("User:UserProfile");
  10. }

异步多task任务

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

  1. //单进程慢速任务 通过异步的多task去做,速度会翻倍
  2. public function getUsersCache($ids)
  3. {
  4. //异步多task模式。耗时8ms
  5. foreach ($ids as $id) {
  6. $this->task('User\User::getUser', ['id' => $id]);
  7. }
  8. return $this->finish();
  9. //正常模式 耗时250ms
  10. // $users = [];
  11. // foreach ($ids as $id) {
  12. // $users[] = $this->getUser($id);
  13. // }
  14. // return $users;
  15. }

通过

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

$this->finish();

两个方法实现

  • 注意使用此方式实现的接口无法再内部调用。以下方式调用是无效的:
  1. public function getUser($id)
  2. {
  3. $user = $this->getUserDao()->getUser($id);
  4. //此时无法返回正常数据。
  5. $user['users'] = $this->getUsersCache([1,2,3]);
  6. return $user;
  7. }
  8. //单进程慢速任务 通过异步的多task去做,速度会翻倍
  9. public function getUsersCache($ids)
  10. {
  11. //异步多task模式。耗时8ms
  12. foreach ($ids as $id) {
  13. $this->task('User\User::getUser', ['id' => $id]);
  14. }
  15. return $this->finish();
  16. }