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 相关文章推荐
php写的简易聊天室代码
Jun 04 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
php流量统计功能的实现代码
Sep 29 PHP
ThinkPHP3.1新特性之内容解析输出详解
Jun 19 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
PHP模板解析类实例
Jul 09 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
php提交post数组参数实例分析
Dec 17 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 stream_context_create()作用和用法分析
2011/03/29 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP实现简易计算器功能
2020/08/28 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
js实现tab切换效果
2017/02/16 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
Saltstack快速入门简单汇总
2016/03/01 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
python Shapely使用指南详解
2020/02/18 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
详解python如何引用包package
2020/06/07 Python
用CSS3将你的设计带入下个高度
2009/08/08 HTML / CSS
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
2013年保送生自荐信格式
2013/11/20 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python