不是后端也应该知道的「 web 服务、子服务、服务的部署」

时间:2019-08-03 来源:www.cmlm.net

专注于Java领域的高质量技术,欢迎关注

酷屋音乐

1.定义

让我们首先看一下wiki中非常流行的定义。

Web服务是指通过Web向其他平台提供服务的平台。

更专业的定义是什么?让我们来看看W3C对Web服务的定义。

Web服务是一种软件系统,允许不同的机器通过网络相互交互。

2.元素

要实现在网络之间调用其他平台服务的平台,至少需要明确三点:

如何在平台上公开代码作为其他平台调用的服务;什么样的网络协议用于通信;什么格式用作通信内容。

从WSDL了解Web服务的元素

为了回答上述问题,我们可以简要了解WSDL,Web服务描述语言和Web服务描述语言。我们知道服务的提供者基本上是用代码编写的,服务的调用者通过发起网络请求来调用服务。如此普遍地说,WSDL所做的是描述如何根据调用者发送的网络请求找到服务提供者,然后找出要运行的代码片段,并将结果返回给调用者。

WSDL是一种基于XML格式的文档,由两部分组成,抽象定义和特定定义。

WSDL的抽象定义

WSDL的抽象定义独立于提供服务的平台和实现服务的语言,定义了服务使用的网络协议以及用于与调用者通信的消息格式。网络协议不受限制,可以是其他网络传输协议,如http,ftp,smtp等,但在大多数情况下,我们使用http协议。消息格式也是多种多样的。唯一广泛使用的消息格式是基于XML格式的SOAP,简单的对象访问协议。后来,REST开始流行,出现了基于REST + XML的消息格式。后来它发展成为REST + JSON的消息格式是使用最广泛的一种。

WSDL的具体定义

与平台和语言相关的WSDL的特定定义定义了特定的服务调用,请求参数和返回参数是什么,以及运行以获取结果的代码部分。

咖啡馆比喻

我们使用咖啡店来比较WSDL的工作原理。咖啡馆是一家服务提供商,提供订购,餐饮和付款等服务。咖啡馆的员工手册等同于服务代码,客户是服务呼叫者。 WSDL的抽象定义定义了客户如何找到咖啡馆的位置,以及客户和咖啡馆员工使用哪种语言进行交流; WSDL的具体定义定义了每个特定服务,例如单个服务,客户需要提供什么,工作人员可以找到订购流程的页面,以及员工将返回给客户的内容,等等。

WSDL文档可以由服务的实现代码自动生成,或者代码框架可以从定义的WSDL文档生成。

3.申请方法

两种最常见的Web服务形式是:RPC远程过程调用,REST表示状态转换。本质上,两者都定义规范,一个是面向过程的远程调用规范,另一个是面向资源的远程调用规范。

RPC远程过程调用

RPC,远程过程调用,一种远程过程调用,用于定义平台和平台之间面向过程的服务调用的规范。其基本思想是在一个平台上提供多个功能程序,作为另一个平台调用的一个服务。所以基于RPC的服务需要关注“我该怎么办?” RPC规范是独立于协议的,可以使用各种网络协议来实现。

REST代表性状态交付

什么是REST?我不知道REST是否合适。如果您已经接触过诸如GET,POST,PUT和DELETE之类的请求,请不要怀疑我们通常所引用的大多数http请求都是基于REST规范的。基于REST规范的api也称为RESTful api。这种api的主题必须是资源。它关心“我想用资源做什么样的操作”。为什么REST很受欢迎?这就是我们应该使用面向对象思维来编程的原因。一切都是对象,异物是资源。这是一篇关于REST规范的非常受欢迎的文章。如何向你的妻子解释RESTful是什么。

RPC和REST的比较

一般而言,PRC与网络协议无关,并且与流程有关; REST基于http协议,并且与资源有关。下图说明了RESTful服务(左)和RPC样式服务(右)之间的相同用户相关操作的设计差异。

2e53d173d5f94137b2aa60802686bb99

那么在具体的使用场景中,我们应该如何选择两种设计规范呢?我认为两者之间的权衡可以类比于函数式编程和面向对象的编程。每个都有自己合适的场景,即使在某些情况下,两者都可以有利有弊。重要的是要了解这两个设计规范的性质和初衷,并根据实际场景和个人使用习惯做出初步选择。

在讨论该服务之前,让我们继续前一个咖啡馆的假设,以了解哪些子服务以及我们为什么需要子服务。

为什么我们需要子服务

想象一下咖啡馆的正常运作,需要以下职能人员的参与。

前台:负责创建,修改和删除客户的订单收银员:收取相应的订单成本,更改零,管理咖啡厅的日常开支。服务员:将咖啡送到相应的座位供客户使用,回收餐具清洁剂:维护商店内的清洁硬件设施经理,桌椅摆放,空调照明等:确保商店正常运转,解决问题和异常情况

对于这些职能人员,有三个核心要素:

他们所做的工作有明确的界限;他们可能需要彼此沟通;他们共同努力维持咖啡馆的运作。

为什么咖啡馆不是由一个非常强大和多才多艺的人完成所有工作?这很容易理解:

首先,一个有权势的人比普通人更难找到;而同时处理这么多工作更容易出错;最重要的是,如果他病了,整个商店都无法运作。

因此,将咖啡馆的示例映射到Web服务并提供单个Web服务来支持整个咖啡馆的操作自然是不合理的:

维护大型系统比维护小型系统更困难;具有冗余业务逻辑的系统更容易出错;如果系统中的一小部分内容出现问题,很容易导致整个系统崩溃。

那么如何拆分服务系统,答案就是子服务。我们根据功能划分将整个系统分为五个子服务,对应上面的五个功能人员。

订单管理服务帐户管理服务餐具管理服务店内环境管理服务性能监控和异常处理服务

相同子服务的核心元素如下:

五个子服务提供的接口边界清晰;子服务可以互相呼叫;在一起,整个咖啡馆的运作得到保证。

在了解了子服务的概念以及为什么Web服务需要子服务之后,出现了新的问题:子服务如何执行合理的拆分?如何管理多个子服务?你如何在子服务之间进行通信?

我必须在这里提到SOA。

通过SOA架构组织子服务

SOA,面向服务的体系结构,是一种面向服务的体系结构设计。从广义上讲,它也是一个规范,定义了如何管理服务集合以及它们如何通信。它基本上没有对Web服务和子服务的绝对依赖,它甚至比Web服务更早。但是,人们已经发现它在Web服务中的使用,这意味着SOA只能反映其在Web服务管理中的价值。因此,几乎所有与Web服务相关的SOA应用程序场景的现状都导致这两个概念在某种程度上被混淆。

由于SOA框架是一组服务的管理,它比简单的服务拆分更有用吗?

我们来看看下面的简单示例。假设我们想要将整个系统分成4个子服务:ACCOUNT,C2D,ASK,DESIGN。左边是简单的服务拆分,右边是基于SOA框架的服务拆分。

1.服务的实施

Web服务是软件系统,软件系统由代码形成。那么这样的软件系统如何从大量代码转换为稳定,可访问和可更新的服务?

具有一定量流量的服务通常由这样的结构组成。

d443c6cae129464abdd3d77374fdbf29

上层是负载平衡器,下层是多个相同的节点。

负载均衡器:合理地将此服务的请求分配给以下节点之一,以达到以下目的:尽可能完成请求(例如,如果其中一个节点运行不正常,请求将失败),每个节点都处于统一压力下(例如,同时有10,000个请求,因此它不会卡在同一节点上,从而导致节点出现性能问题)。负责均衡器可以通过网络设备,虚拟IP,nginx反向代理,甚至只是一段代码来实现。节点:每个节点都是等效的,每个节点运行相同的服务,等待处理负载均衡器转发的请求。节点可以是物理机,虚拟机或docker容器。

2.部署服务

简单来说,服务的部署是将服务软件系统的最新代码克隆到每个节点,然后在每个节点上运行服务。然后,服务的更新只不过是每个节点的重新部署。

但是不要忘记在节点上重新运行服务会导致节点的服务出现短暂的攻击。如何确保在完成服务更新时不会为客户端挂起服务?这次您需要一定的部署策略。

注意:下图中的绿色节点表示节点未更新,蓝色节点表示节点已更新

1)滚动部署

滚动部署,一次仅更新n个节点,等待部署前n个节点,然后更新下n个节点,以便最多只有n个节点可能同时不可用。

以下四个图像是滚动部署过程的示例,其中n为1.

首先更新第一个节点。

0809025a87124a6fba0c34be2b2f3aeb

更新第一个节点后,更新第二个节点。

243a4f6b0aca4c0f87e7dbb50a625d75

更新第二个节点后,更新第三个节点。

1d67028477c44f5a85b25eb0e0f9bad0

更新第三个节点后,更新第四个节点。所有节点都已更新。

5989116d8b7c497d9cf71ec114b447e2

滚动部署的缺点是在部署过程中,客户端可以访问更新前服务和更新的服务。

2)蓝绿部署

蓝绿色部署,如下面三个图所示,分为三个步骤。

首先添加四个节点并部署新版本的服务。

ec8f995796644220926c84a49202dce6

部署完毕后,将负载均衡器指向新的四个节点。

2ef5ad607dda42c5814b34e6d3376a40

删除原始旧版本服务的四个节点。

8773d7a7b7884ed5a8973f9d8e4a2e80

蓝绿色部署解决了新旧服务共存的滚动部署的缺点,但对资源的要求更高。

3)灰度释放

灰度发布是一种发布平滑过渡的方式。让一些用户继续使用旧版本的服务,一些用户开始体验新版本的服务,如果用户对新版本没有异议,那么逐步扩大范围,更新所有旧版本的服务到新版本的服务。灰度发布可以确保整个系统的稳定性,并且可以在初始灰度级找到并调整问题,以避免不可逆转的影响。灰度发布的实现如下图所示。

首先更新节点。

05b42afd39304dc887d4b194392187dd

然后,通过负载均衡器,根据某些规则(例如用户ID除以5 + 0)过滤20%的用户,并将20%用户发送的所有请求转发到已经过的节点。更新。

3bbe30fef7fa4b668c9087fb6994f01b

更新第二个节点,并将包含先前20%的50%用户的请求转发到两个更新的节点。

3fbe7a45cabf4dbca262264e47876053

通过类比直到所有节点都更新,100%的用户请求将请求新服务。这里应该注意,具有白发的用户的百分比优选地类似于更新节点的比例,这确保每个节点可以承受类似的压力。如果仅更新一个节点并且90%的用户请求被转发到新服务,则该节点可能存在性能问题。