按服务器的处理器架构(也就是服务器CPU所采用的指令系统)划分把服务器分为CISC架构服务器、RISC架构服务器和VLIW架构服务器三种。 CISC的英文全称为“Complex Instruction Set Computer”,即“复杂指令系统计算机”,从计算机诞生以来,人们一直沿用CISC指令集方式。早期的桌面软件是按CISC设计的,所以,微处理器(CPU)厂商一直在走CISC的发展道路,包括Intel、AMD,还有其他一些已经更名的厂商,如TI(德州仪器)、Cyrix以及VIA(威盛)等。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。CISC架构的服务器主要以IA-32架构(Intel Architecture,英特尔架构)为主,而且多数为中低档服务器所采用。
如果企业的应用都是基于NT平台的应用,那么服务器的选择基本上就定位于IA架构(CISC架构)的服务器。如果企业的应用主要是基于Linux操作系统,那么服务器的选择也是基于IA结构的服务器。如果应用必须是基于Solaris的,那么服务器只能选择SUN服务器。如果应用基于AIX(IBM的Unix操作系统)的,那么只能选择IBM Unix服务器(RISC架构服务器)。 台式服务器也称为“塔式服务器”。有的台式服务器采用大小与普通立式计算机大致相当的机箱,有的采用大容量的机箱,像个硕大的柜子。低档服务器由于功能较弱,整个服务器的内部结构比较简单,所以机箱不大,都采用台式机箱结构。这里所介绍的台式不是平时普通计算机中的台式,立式机箱也属于台式机范围,这类服务器在整个服务器市场中占有相当大的份额。
优点:塔式服务器它的外形以及结构都跟我们平时使用的立式PC差不多,由于服务器的主板扩展性较强、插槽也多出一堆,所以个头比普通主板大一些,因此塔式服务器的主机机箱也比标准的ATX机箱要大,一般都会预留足够的内部空间以便日后进行硬盘和电源的冗余扩展。
由于塔式服务器的机箱比较大,服务器的配置也可以很高,冗余扩展更可以很齐备,所以它的应用范围非常广,应该说目前使用率最高的一种服务器就是塔式服务器。
缺点:目前常见的入门级和工作组级服务器基本上都采用这一服务器结构类型,不过由于只有一台主机,即使进行升级扩张也有个限度,所以在一些应用需求较高的企业中,单机服务器就无法满足要求了,需要多机协同工作,而塔式服务器个头太大,独立性太强,协同工作在空间占用和系统管理上都不方便,这也是塔式服务器的局限性。不过,总的来说,这类服务器的功能、性能基本上能满足大部分企业用户的要求,其成本通常也比较低,因此这类服务器还是拥有非常广泛的应用支持。 机架式服务器的外形看来不像计算机,而像交换机,有1U(1U=1.75英寸)、2U、4U等规格。机架式服务器安装在标准的19英寸机柜里面。这种结构的多为功能型服务器。
优点:作为为互联网设计的服务器模式,机架服务器是一种外观按照统一标准设计的服务器,配合机柜统一使用。可以说机架式是一种优化结构的塔式服务器,它的设计宗旨主要是为了尽可能减少服务器空间的占用,而减少空间的直接好处就是在机房托管的时候价格会便宜很多。
很多专业网络设备都是采用机架式的结构(多为扁平式,就像个抽屉),如交换机、路由器、硬件防火墙这些。机架服务器的宽度为19英寸,高度以U为单位(1U=1.75英寸=44.45毫米),通常有1U,2U,3U,4U,5U,7U)几种标准的服务器。机柜的尺寸也是采用通用的工业标准,通常从22U到42U不等;机柜内按U的高度有可拆卸的滑动拖架,用户可以根据自己服务器的标高灵活调节高度,以存放服务器、集线器、磁盘阵列柜等网络设备。服务器摆放好后,它的所有I/O线全部从机柜的后方引出(机架服务器的所有接口也在后方),统一安置在机柜的线槽中,一般贴有标号,便于管理。
缺点:机架式服务器因为空间比塔式服务器大大缩小,所以这类服务器在扩展性和散热问题上受到一定的限制,配件也要经过一定的筛选,一般都无法实现太完整的设备扩张,所以单机性能就比较有限,应用范围也比较有限,只能专注于某一方面的应用,如远程存储和Web服务的提供等 在一些高档企业服务器中由于内部结构复杂,内部设备较多,有的还具有许多不同的设备单元或几个服务器都放在一个机柜中,这种服务器就是机柜式服务器。
对于证券、银行、邮电等重要企业,则应采用具有完备的故障自修复能力的系统,关键部件应采用冗余措施,对于关键业务使用的服务器也可以采用双机热备份高可用系统或者是高性能计算机,这样的系统可用性就可以得到很好的保证。 刀片式服务器是一种HAHD(High Availability High Density,高可用高密度)的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的,其中每一块“刀片”实际上就是一块系统母板,类似于一个个独立的服务器。在这种模式下,每一个母板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以使用系统软件将这些母板集合成一个服务器集群。在集群模式下,所有的母板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。当前市场上的刀片式服务器有两大类:一类主要为电信行业设计,接口标准和尺寸规格符合PICMG(PCI Industrial Computer Manufacturer's Group)1.x或2.x,未来还将推出符合PICMG 3.x 的产品,采用相同标准的不同厂商的刀片和机柜在理论上可以互相兼容;另一类为通用计算设计,接口上可能采用了上述标准或厂商标准,但 尺寸规格是厂商自定,注重性能价格比,属于这一类的产品居多。刀片式服务器目前最适合群集计算和IxP提供互联网服务。
优点:刀片服务器适用于数码媒体、医学、航天、军事、通讯等多种领域。其中每一块“刀片”实际上就是一块系统主板。它们可以通过本地硬盘启动自己的操作系统,如Windows NT/2000、Linux、Solaris等等,类似于一个个独立的服务器。
在这种模式下,每一个主板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过可以用系统软件将这些主板集合成一个集群服务器。在集群模式下,所有的主板可以连接起来提供高速的网络环境,可以共享资源,为相同的用户群服务。在集群中插入新的“刀片”,就可以提高整体性能。而由于每块“刀片”都是热插拔的,所以,系统可以轻松地进行替换,并且将维护时间减少到最小。值得一提的是,系统配置可以通过一套智能KVM和9个或10个带硬盘的CPU板来实现。CPU可以配置成为不同的子系统。一个机架中的服务器可以通过新型的智能KVM转换板共享一套光驱、软驱、键盘、显示器和鼠标,以访问多台服务器,从而便于进行升级、维护和访问服务器上的文件。
将一个单体应用拆分成一组微小的服务组件,每个微小的服务组件运行在自己的进程上,组件之间通过如RESTful API这样的轻量级机制进行交互,这些服务以业务能力为核心,用自动化部署机制独立部署,另外,这些服务可以用不同的语言进行研发,用不同技术来存储数据 。
通过以上的定义描述,我们可以基本确定给出微服务的节特征:
用微服务来进行实践到生产项目中,首先要考虑一些问题。比如下图的微服务业务架构:
在上图图表展示的架构图中,我们假设将业务商户服务A、订单服务B和产品服务C分别拆分为一个微服务应用,单独进行部署。此时,我们面临很多要可能出现的问题要解决,比如:
1、客户端如何访问这些服务?
2、每个服务之间如何进行通信?
3、多个微服务,应如何实现?
4、如果服务出现异常宕机,该如何解决?
以上这些都是问题,需要一个个解决。
在单体应用开发中,所有的服务都是本地的,前端UI界面,移动端APP程序可以直接访问后端服务器程序。
现在按功能拆分成独立的服务,跑在独立的进程中。如下图所示:
此时,后台有N个服务,前台就需要记住管理N个服务,一个服务 下线 、 更新 、 升级 ,前台和移动端APP就要重新部署或者重新发包,这明显不服务我们拆分的理念。尤其是对当下业务需求的飞速发展,业务的变更是非常频繁的。
除了访问管理出现困难以外,N个小服务的调用也是一个不小的网络开销。另外,一般微服务在系统内部,通常是无状态的,而我们的用户在进行业务操作时,往往是跨业务模块进行操作,且需要是有状态的,在此时的这个系统架构中,也无法解决这个问题。传统的用来解决用户登录信息和权限管理通常有一个统一的地方维护管理(OAuth),我们称之为授权管理。
基于以上列出的问题,我们采用一种叫做网关(英文为API Gateway)的技术方案来解决这些问题,网关的作用主要包括:
网关(API Gateway)可以有很多广义的实现办法,可以是一个软硬一体的盒子,也可以是一个简单的MVC框架,甚至是一个Node.js的服务端。他们最重要的作用是为前台(通常是移动应用)提供后台服务的聚合,提供一个统一的服务出口,解除他们之间的耦合,不过API Gateway也有可能成为 单点故障 点或者性能的瓶颈。
最终,添加了网关(API Gateway)的业务架构图变更为如下所示:
所有的微服务都是独立部署,运行在自己的进程容器中,所以微服务与微服务之间的通信就是IPC(Inter Process Communication),翻译为进程间通信。进程间通信的方案已经比较成熟了,现在最常见的有两大类: 同步调用、异步消息调用 。
同步调用
同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。同步调用的有两种实现方式:分别是 REST 和 RPC
基于REST和RPC的特点,我们通常采用的原则为: 向系统外部暴露采用REST,向系统内部暴露调用采用RPC方式。
异步消息的方式在分布式系统中有特别广泛的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。需要付出的代价是一致性的减弱,需要接受数据 最终一致性 ,所谓的最终一致性就是只可能不会立刻同步完成,会有延时,但是最终会完成数据同步;还有就是后台服务一般要实现 幂等性 ,因为消息发送由于性能的考虑一般会有重复(保证消息的被收到且仅收到一次对性能是很大的考验)。最后就是必须引入一个独立的 Broker,作为中间代理池。
常见的异步消息调用的框架有:Kafaka、Notify、MessageQueue。
最终,大部分的服务间的调用架构实现如下所示:
在微服务架构中,一般每一个服务都是有多个拷贝,来做负载均衡。一个服务随时可能下线,也可能应对临时访问压力增加新的服务节点。这就出现了新的问题:
这就是服务的发现、识别与管理问题。解决多服务之间的识别,发现的问题一般是通过注册的方式来进行。
具体来说:当服务上线时,服务提供者将自己的服务注册信息注册到某个专门的框架中,并通过心跳维持长链接,实时更新链接信息。服务调用者通过服务管理框架进行寻址,根据特定的算法,找到对应的服务,或者将服务的注册信息缓存到本地,这样提高性能。当服务下线时,服务管理框架会发送服务下线的通知给其他服务。
常见的服务管理框架有:Zookeeper等框架。
如上的问题解决方案有两种具体的实现,分别是: 基于客户端的服务注册与发现 、 基于服务端的服务注册与发现 。
优点是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端要维护所有调用服务的地址,有技术难度,一般大公司都有成熟的内部框架支持。
优点是所有服务对于前台调用方透明,一般小公司在云服务上部署的应用采用的比较多。
前面提到,单体应用开发中一个很大的风险是,把所有鸡蛋放在一个篮子里,一荣俱荣,一损俱损。而分布式最大的特性就是网络是不可靠的。通过微服务拆分能降低这个风险,不过如果没有特别的保障,结局肯定是噩梦。
因此,当我们的系统是由一系列的服务调用链组成的时候,我们必须确保任一环节出问题都不至于影响整体链路。相应的手段有很多,比如说:
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)