PHP程序员简单的开展服务治理架构操作详解(一)


Posted in PHP onMay 14, 2020

本文实例讲述了PHP程序员简单的开展服务治理架构操作。分享给大家供大家参考,具体如下:

不涉及其他的语言及工具,我们从PHP本身来谈如何实现服务治理

本猿人已经写好的服务治理 https://github.com/CrazyCodes/Service-Govern.git

治理什么?

这个专业名词很容易发现治理的是服务,而服务则是我们的项目。管理这些服务方案则叫服务治理。

现在在Server上有四项服务,分别为

  • UserService
  • ShopService
  • GoodsService
  • LiveService

这些服务我们叫它服务提供者(既提供对内服务的应用)

调用服务的应用我们称它为服务消费者,例如

  • User-Api
  • Shop-Api
  • Goods-Api
  • Live-Api

Service 是对内服务的而Api是对外服务的

PHP程序员简单的开展服务治理架构操作详解(一)

服务治理考虑的问题就是如何管理这四项服务,让它们如何对外服务,如何监控服务进程

依托实现

在实现服务治理之前,需要了解以下几块知识点

  • thrift
  • rpc
  • swoole

thrift

暂时大可理解为可以通过它去调用其他开发语言的方法

rpc

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

服务与服务之间通信可以通过RPC通信,当然也可以选择UDP等

swoole

PHP圈内跨世纪的产物,使用他的原因是因为Swoole本身支持RPC通信,所以我们本章通过Swoole Rpc的方法去实现消费者与服务提供者之间的通信

实现RPC通信

服务治理非常重要的一个环节,要在无感知的情况让消费者A调用服务提供者A,B,C,当然实际情况下,这是永远不可能的,根本不在一个内存空间中,我们需要自己模拟出来这种使用方式

$userSerivce = $client->client ('UserService');
$result = $userSerivce->getUserInfo (['user_id' => 100]);
var_dump($result);

在消费者内没有UserService,更没有getUserInfo 方法,这些都在服务提供者的应用中,如何去调用它们?

首先通过php的__call 方法去截取一个不存在的方法

public function __call($name, $arguments)
{
  $client = new ClientRpc($this->serviceName);
      
  $response = $client->send ($this->serviceName, $name, $arguments);
      
  return (json_decode ($response, true));
      
}

获取后调用自己写的send 方法,swoole出场

class ClientRpc
{
  protected $client;
    
  public function __construct($service_name, $centerConfig)
  {
    $this->client = new \swoole_client(SWOOLE_SOCK_TCP);
      
    $center = Dispatcher::loadBalance ($service_name, $centerConfig);
    $this->client->connect ($center['ip'], $center['port'], 0.5);
  }
    
  public function send($service, $action, $arguments)
  {
    $request = new Request();
    
    $request->setService ($service);
    $request->setAction ($action);
    $request->setParameters ($arguments[0]);
    // 重组参数,组合成你希望的格式,最后转成json发送到服务提供者
    $this->client->send (json_encode ((array)$request));
      
    return $this->client->recv ();
  }
    
  public function __destruct()
  {
    $this->client->close ();
    unset($this->client);
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
php实现图片添加水印功能
Feb 13 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
PHP常用的小程序代码段
Nov 14 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 PHP
PHP程序员必须知道的两种日志实例分析
May 14 #PHP
Laravel框架集合用法实例浅析
May 14 #PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 #PHP
Laravel框架源码解析之入口文件原理分析
May 14 #PHP
Laravel框架源码解析之反射的使用详解
May 14 #PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 #PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 #PHP
You might like
PHP通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python的re正则表达式实例代码
2018/01/24 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python dumps和loads区别详解
2020/02/04 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
教育学专业毕业生的自我评价
2013/11/21 职场文书
网络技术专业求职信
2014/02/18 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
库房管理员岗位职责
2015/02/12 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA