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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
浅析PHP页面局部刷新功能的实现小结
Jun 21 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
php根据日期判断星座的函数分享
Feb 13 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
php 利用array_slice函数获取随机数组或前几条数据
Sep 30 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
PHP的自定义模板引擎
Mar 24 PHP
PHP高并发和大流量解决方案整理
Dec 24 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+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
Vue router传递参数并解决刷新页面参数丢失问题
2020/12/02 Vue.js
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
详解Python高阶函数
2020/08/15 Python
python实现逻辑回归的示例
2020/10/09 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
证婚人搞笑证婚词
2014/01/10 职场文书
七一讲话心得体会
2014/09/05 职场文书
财产分割协议书范本
2014/11/03 职场文书
环境建议书
2015/02/04 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
使用CSS实现音波加载效果
2023/05/07 HTML / CSS