分布式解决什么问题?

举个例子:当网站有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"; $this->protocol .="RPC-METHOD:$method"; $this->protocol .="RPC-PARAM:$param";  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

app前后台交互php_PHP分布式架构RPC介绍以及手写RPC框架相关推荐

  1. app前后台交互php_PHP丨前端网页是怎么跟后台进行数据交互的(实战)

    本期需要用到的前面几期所讲过的内容: 这里是 PHP 网站开发的第三个阶段,也就是前端 HTML 及 CSS 所制作的网页是如何跟 PHP 后台代码进行交互的. 向后台提交数据 前端网页代码: 留言本 ...

  2. 手写RPC(一) 絮絮叨叨

    目录 前言 我的知识库 学会了? 学不动了? 前言 提到RPC(Remote Procedure Call)大家应该都不陌生,特别是像我一样做web开发的,可以说天天和rpc打交道.常见的rpc框架主 ...

  3. c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...

    一.前言 RPC,远程过程调用,调用远程方法像调用本地方法一样.RPC交互分为客户端和服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端. RPC和HTTP的联 ...

  4. ZooKeeper(三) 什么是分布式锁以及使用Redis手写实现

    一.什么是分布式锁? 分布式锁是相对于单体单机应用而言的一种锁机制.在单机应用时由于共享一个jvm,可以使用同一个java Lock对象进行获取锁,解锁操作.当为分布式集群时存在跨机器请求执行,无法共 ...

  5. MyRPCDemo netty+jdk动态代理+反射+序列化,反序列化手写rpc框架

    RPC RPC(remote procedure call)远程过程调用 RPC是为了在分布式应用中,两台主机的Java进程进行通信,当A主机调用B主机的方法时,过程简洁,就像是调用自己进程里的方法一 ...

  6. 三分钟手写RPC调用 (三)

    三分钟springboot整合dubbo3(三)(手写RPC调用) 1.设计思路 2.代码编写 3.总结 1.设计思路 1.启动一个springboot项目,定义一个简单的HelloWord程序,能通 ...

  7. 手写篇:如何手写RPC框架?

    手写篇:如何手写RPC框架? 首先我们讲下什么是RPC? RPC(Remote Procedure Call)远程过程调用协议,他是一种通过网络从远程计算机程序请求服务.简单的来说,就是通过网络进行远 ...

  8. 第四篇 - 手写RPC框架

    Github源码下载地址:https://github.com/chenxingxing6/myrpc 一.前言 RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从 ...

  9. 分布式架构相关概念介绍

    集群 不同的人做同一件事情的同一部分为了同一个目的,如同一个公司的两个java程序员就是集群,如相同的代码部署到不同服务器就是集群. 负载均衡 负载均衡对应的就是集群,协调集群中单个服务器的处理量,例 ...

  10. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起

    上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...

最新文章

  1. matlab如何进对图像进行透视变换,在Matlab中实现透视变换的方法 | 学步园
  2. vue-typescript-toast (一款适用于pc平台的简单toast)
  3. oracle用户权限的基本查询
  4. 常见问题--项目管理的整体过程是什么?核心的是什么?
  5. <马哲>科学技术在社会发展中的作用2017-12-27
  6. ElasticSearch添加映射
  7. CodeDom Assistant CodeDom的强大工具, 有些BUG修正了下,发到CodePlex,大家有需要的可以看看...
  8. BundleFusion代码框架讲解
  9. CSS常用的选择器和优先级的权重问题
  10. 奇妙的安全旅行之国密算法
  11. mac系统自带python开发环境吗_Mac OS搭建Python开发环境的几个误区
  12. 欧盟《一般数据保护法案》(GDPR)核心要点 本文更多的是站在企业角度来思考法案对物联网行业的影响以及应对措施,一来希望与同行企业可以就GDPR进行更多的互动讨论;二来也是希望传播国际法案对于安全和
  13. 西门子 S7-200CN CPU 224CN EEPROM芯片
  14. 一个疫情期间的实习生经历
  15. 2020年android系统版本多少,2020年的Android系统会是什么样?
  16. 【AIOT】3-1 物联网项目必备功能模块
  17. CAD如何绘制多边形的外切圆?
  18. 通俗易懂的讲解信号与系统
  19. Windows个性化之稀奇古怪三两式(转)
  20. 2021-03-14 JavaWeb实验课

热门文章

  1. 判断一个数是否为质数
  2. 树的最长路径详解(C++)
  3. js怎么实现数组里的数据相加_C++如何实现大整数相加
  4. linux中什么是进程名,Linux进程是什么
  5. java trim 换行符_JAVA去掉字符串左右两边的回车、空格、制表符、换行符
  6. 项目背景怎么描述_项目工作总结报告怎么写?搞定通用规范模型先
  7. python中对象的定义_全面了解python中的类,对象,方法,属性
  8. excel 科学计数批量转换成文本
  9. tp3.2 配置相关说明
  10. php 获取域名,域名端口,路径 $_SERVER变量