举个例子:当网站有10万个访问,已经没法处理这么多访问要求,常日,我们可以提高做事器的配置,其次我们还可以添加做事器来分流处理,如果一台机器只能处理6万个要求,那么我们在加一台做事器,把要求分配到两台,那么就可以处理10万要求。
加做事器有两种办法实现,一种是用负载均衡的办法,另一种用分布式的办法,负载均衡实在便是把原来的代码复制到另一台做事器,两台做事器的代码是一样的,这也叫水平拆分,分布式是基于业务拆分,把一个项目中的模块分别支配到做事器。是基于做事的拆分,也叫垂直拆分。
RPC先容
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程打算机程序上要求做事,而不须要理解底层网络技能的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC超过了传输层和运用层。RPC使得开拓包括网络分布式多程序在内的运用程序更加随意马虎。
RPC 在利用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)
实现分布式支配 跨措辞 。。。
架构演化
MVC架构:当业务规模很小时,将所有功能都不熟在同一个进程中,通过双机或者负载均衡器实现负债分流;此时,分离前后台逻辑的MVC架构是关键。
PRC架构:当垂直运用越来越多,运用之间交互不可避免,将核心和公共业务抽取出来,作为独立的做事,实现前后台逻辑分离。此时,用于提高业务复用及拆分的RPC框架是关键。
SOA架构:随着业务发展,做事数量越来越多,做事生命周期管控和运行态的管理成为瓶颈,此时用于提升做事质量的SOA做事管理是关键。
微做事架构:通过做事的原子化拆分,以及微做事的独立打包、支配和升级,小团队的交付周期将缩短,运维本钱也将大幅度低落。
RPC与REST差异
REST,即Representational State Transfer的缩写。翻译过来是表现层状态转换
REST 常日采取 http+JSON 实现。
RPC http/socket+JSON xml 二进制…
RESTful 一样平常定义处理 resource 对外供应接口做事
RPC 对内供应做事
REST也是一种RPC
RPC 设计模式 思想 REST
RPC基于的协议 以及数据形式
关于协议:
RPC框架与详细的协议无关,RPC 可基于 HTTP 或 TCP 协议。
TCP 是传输层协议,HTTP 是运用层协议,而传输层较运用层更加底层,在数据传输方面,越底层越快,因此,在一样平常情形下,TCP 一定比 HTTP 快。
关于数据形式:
基于XML的RPC
基于JSON的RPC
基于二进制的RPC
RPC调用流程
1)、做事消费方(Client)调用以本地调用办法调用做事;
2)、Client stub吸收到调用后卖力将方法、参数等组装成能够进行网络传输的体;
3)、Client stub找到做事地址,通过Socket将发送到做事端;
4)、Server stub收到后进行解码;
5)、Server stub根据解码结果调用做事端本地的做事;
6)、本地做事实行并将结果返回给Server stub;
7)、Server stub将返回结果打包成;
8)、Server stub通过Socket将发送至客户端;
9)、Client stub吸收到,并进行解码;
10)、做事消费方(RPC Client)得到终极的做事调用结果。
手写大略的RPC框架
server.php
<?phpclass Server{ public $socket; public $class; public $method; public $param; public $serviceDir='service'; public function __construct($ip,$port){ $this->create($ip,$port); while(true){ $conSock = socket_accept($this->socket); $protocol = socket_read($conSock,2048); $this->doProtocol($protocol); $file = $this->serviceDir.'/'.$this->class.'.php'; if(file_exists($file)){ require_once $file; $obj = new $this->class; $method = $this->method; $res = $obj->$method($this->param); }else{ $res = $file.\"大众 not exists!!\公众; } socket_write($conSock,$res,strlen($res)); socket_close($conSock); } } private function doProtocol($protocol){ preg_match('/RPC-CLASS:(.)/',$protocol,$class); preg_match('/RPC-METHOD:(.)/',$protocol,$method); preg_match('/RPC-PARAM:(.)/',$protocol,$param); $this->class = $class[1]; $this->method = $method[1]; $this->param = $param[1]; } private function create($ip,$port){ $this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_set_option($this->socket,SOL_SOCKET,SO_REUSEADDR,true); socket_bind($this->socket,$ip,$port); socket_listen($this->socket); } } new Server(0,6666);
client.php
<?php class Client{ public $host; public $ip; public $class; public $socket; public $protocol = null; public function __construct($url){ $url = parse_url($url); $this->host = $url['host']; $this->port = $url['port']; $this->class = basename($url['path']); $this->connect(); } private function connect(){ $this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_connect($this->socket,$this->host,$this->port); } public function __call($method,$param){ $param = json_encode($param); $this->protocol .=\"大众RPC-CLASS:$this->class\n\公众; $this->protocol .=\公众RPC-METHOD:$method\n\公众; $this->protocol .=\"大众RPC-PARAM:$param\n\"大众; socket_write($this->socket,$this->protocol,strlen($this->protocol)); $data = socket_read($this->socket,2048); //socket_close($this->socket); return $data; } } $param = ['name'=>'lampol','age'=>22];$client = new Client('http://127.0.0.1:6666/Test');echo $client->test2($param);
先运行做事端 php server.php
在运行客户端 php client.php