标签归档:架构

RPC服务 —— http

[toc]

1、什么是RPC

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

当我们对网站进行SOA化时,我们就需要通过RPC服务来保持服务与服务之间的通信。RPC的实现包括客户端和服务端。服务端提供服务,客户端进行调用。现在比较常见有2种方式的RPC服务,一个是基于HTTP协议的RPC服务,另外一个是基于TCP协议的RPC服务。本文将介绍一下基于HTTP协议的RPC服务。

2、基于HTTP的RPC服务

HTTP是基于TCP之上的一个协议,所以其相对TCP协议比较稳定,但是相对性能也稍差一些。

2.1、服务端

在php中,使用基于HTTP的PRC服务,那么就需要借助于nginx/apache来作为服务器。

服务端,我们可以使用上面的目录结构。
index.php 作为一个入口,并且做一些初始化的动作。
Api目录下存放所有提供服务的文件。
当然这只是一个比较简单目录结构,我们可以根据自己的项目去改造、去变化。

下面是简单实现代码。

2.2、客户端

客户端我们可以php的curl库来完成。

总结

当然上面是一个最简单的例子。在做架构中,我们需要对其扩充,比如安全验证、序列化等等的功能扩展。

网站架构模式

为了解决高并发访问、海量数据处理、高可靠运行等一系列问题,实现高性易伸缩、可扩展、安全。可以使用以下各种方式进行架构网站。

1、 分层

分层是一种常见的架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成的一个完整系统。
分层结构无处不在,比如网络的7蹭通信协议等。我们可以将网站分为应用层服务层数据层

  • 应用层:负责具体业务和视图展示。如网站首页、商品详情页等。
  • 服务层:为应用层提供服务支持。如用户管理服务、购物车服务、支付服务等。
  • 数据层:提供数据存储访问服务。如数据库、缓存、文件、搜索引擎等。

通过分层,可以将一个网站切分不同的部分,便于分工合作开发维护,职责清晰。每层之间具有一定的独立性,他们之间也需要严格遵循一定官则,如禁止跨层访问、逆向调用。

在具体开发中,大的分层基础上还可以继续分层。如应用层可以在细分为视图层和业务逻辑层;服务层也可以分为数据接口层和逻辑处理层等。

2、 分割

分层是对系统进行横向切分,那么分割就是将系统进行竖向切分。

网站越大,功能越复杂,服务和数据处理的种类也越多,将不同的功能和服务分割开来,包装成高内聚低耦合的模块,便于分布式部署,提高网站并发处理能力和功能扩展能力。

在应用层,将不同的业务进行分割。比如将购物、论坛、搜索、广告分成不同的模块,由独立的团队负责。
同分层一样,在大的分割基础上还可以继续进行分割。比如购物模块可以进一步分割为机票酒店业务、3C业务等更细小的颗粒度。这些模块不管在逻辑上还是物理部署上都是独立的,相应的服务层也可以更具需要将服务分割成适合的模块。

3、 分布式

分层和分割的主要目的就是为了切分后的模块便于分布式部署。分布式之后就意味着拥有更多的cpu、内存、磁盘存储资源,也就是能够更好的处理高并发和大数据。

但是相对的也会带来其他问题。首先,分布式意味着服务之间调用必须使用网络,这就可能会对性能造成一定影响。其次,服务器越多,服务器宕机概率也就越大。另外,数据在分布式环境中保持一致性也越困难,分布式事务也难以保证,对网站业务的正确性和业务流程有可能造成很大的影响。最后,分布式还导致网站依赖错综复杂,开发管理维护困难性提高。

因此分布式设计要根据具体的情况量力而行,切莫为了分布式而分布式,但是对于大型网站来说,分布式是必须走的路。

常用的分布式方案有以下几种:

  • 分布式应用和服务
  • 分布式静态资源
  • 分布式数据和存储
  • 分布式计算
  • 当然还有分布式配置、分布式锁、分布式文件系统等。

4、 缓存

缓存是改善系统性能的第一手段,在现代网站架构中缓存无处不在,下面介绍几种常用的缓存手段。

  • CDN
    即内容分发网络,将某些资源(如静态资源)部署在距离终端用户最近的网络服务商,当用户请求到达网络服务商这里时,这些资源就会立刻返回给用户,减去了大量长距离网络传输的性能消耗。

  • 反向代理
    反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达反向代理服务器时,这里缓存的静态资源可以直接返回给用户。当然反向代理不仅仅是这点功能而已。

  • 本地缓存
    不多说了这个,本地访问的数据~~~~

  • 分布式缓存
    大型网站数据量非常庞大,及时是一小部分的缓存,也不是单机能够承受的。

使用缓存有2个条件,一个是数据访问热点不均衡,某些数据会被更频繁的访问,这些数据应该放到缓存中。
第二个是某段时间内不会过期的数据。

5、 异步

大型网站中系统解耦的手段除了分层、分割,还有一个重要的手段 —— 异步。异步架构是典型的生产者消费者模式,两者间不存在直接调用,只要保持数据结构不变化,彼此功能实现可以随意变化而互不影响,这对网站扩展非常便利。
异步消息有几点很重要好的特性:

  • 提高系统可用性
    消费者服务器发生故障,数据仍旧会保存在消息队列服务用,生产者服务器依旧可以处理业务请求,只需要等待消费者服务器正常后继续工作。
  • 加快网站相应速度
    某些业务可以延时处理,减少生产者响应时间
  • 消除并发访问高峰
    消息队列可以消峰填谷这点非常重要,比如网站出小活动,造成网站并发陡增,这可能造成玩网站负载过重,响应延迟,甚至宕机。消息队列可以将数据保存在队列中,等待消费者服务器依次处理,就不会对网站造成太大压力。

需要注意的是,异步方式会对业务处理造成影响,需要网站产品设计方面支持。

6、 冗余

现在互联网公司都是7×24小时连续运行,但是服务器随时可能出现故障,特别是服务器规模较大时,出现某台服务器宕机是必然的事情。如果我们对服务器进行了冗余,那么就可以不受宕机影响,网站依然可以运行,不丢失数据。

冗余可以实现高可用

数据库除了定期备份,存档保存,实现冷备份外、为了业务高可用,还需要对数据库进行主从分离,实时同步热备份。甚至为了抵御地震、海啸等不可抗力,需要在全球范围部署容灾数据中心。

7、 自动化

  • 自动化部署 不对说了
  • 自动化监控 对服务进行心跳检测,并监控其各项性能指标和应用程序的关键数据指标
  • 自动化报警 通过自动话监控发现异常,就需要向相关人员发送警报信息
  • 自动化失效转移 将失效服务器从集群中移除
  • 自动化失效恢复 故障消除后,将服务器自动添加入集群,同步数据保证一致性
  • 自动化降级 当网站遇到访问高峰时,超出网站最大处理能力,为了保证整个网站的可用性,拒绝或关闭部分无关紧要的服务,保证网站主要流程能够运行流畅,将系统负载降至安全水平。
  • 自动化分配资源 当网站遇到访问高峰时,已经自动化降级的同时,必要时,可以通过将空闲资源分配给重要服务,扩大其部署规模

8、 安全

互联网的开放特性,使得其从诞生起就面对巨大的安全挑战,网站在安全架构方面也积累了许多模式:

  • 通过密码和手机校验码进行身份认证
  • 登录、交易等操作需要对网络进行加密,其他敏感信息也需要进行加密
  • 为了防止机器人滥用网络资源攻击,网站使用验证码识别
  • 对于常见的攻击手段xss攻击、sql注入,对表单提交做相应的编码转换处理
  • 对垃圾信息、敏感信息做相应的屏蔽
  • 对交易转账等重要操作,根据交易模式和交易信息进行风险控制