人工智能时代前沿技术社区

首页 > 热点

微服务架构组成

作者: | 2019-01-23 19:22:57

微服务架构下,服务调用主要依赖下面几个基本组件:

服务描述

注册中心

服务框架

服务监控

服务追踪

服务治理

一、 服务描述

服务调用首先要解决的问题就是服务如何对外描述。比如,你对外提供了一个服务,那么这个服

务的服务名叫什么?调用这个服务需要提供哪些信息?调用这个服务返回的结果是什么格式的?

该如何解析?这些就是服务描述要解决的问题。

常用的服务描述方式包括 RESTful API、 配置以及 IDL 文件三种。

其中,RESTful API 方式通常用于 HTTP 协议的服务描述,并且常用 Wiki 或者Swagger(https://swagger.io)来进行管理。

二、 注册中心 有了服务的接口描述,下一步要解决的问题就是服务的发布和订阅,就是说你提供了一个服务,

如何让外部想调用你的服务的人知道。这个时候就需要一个类似注册中心的角色,服务提供者将

自己提供的服务以及地址登记到注册中心,服务消费者则从注册中心查询所需要调用的服务的地

址,然后发起请求。

注册中心的工作流程是:

1、服务提供者在启动时,根据服务发布文件中配置的发布信息向注册中心注册自己的服务。

2、 服务消费者在启动时,根据消费者配置文件中配置的服务信息向注册中心订阅自己所需要的

服务。

3、注册中心返回服务提供者地址列表给服务消费者。

4、当服务提供者发生变化,比如有节点新增或者销毁,注册中心将变更通知给服务消费者。

三、 服务框架

通过注册中心,服务消费者就可以获取到服务提供者的地址,有了地址后就可以发起调用。但在发起调用之前你还需要解决以下几个问题。

服务通信采用什么协议?就是说服务提供者和服务消费者之间以什么样的协议进行网络通 信,是采用四层 TCP、UDP 协议,还是采用七层 HTTP 协议,还是采用其他协议?

数据传输采用什么方式?就是说服务提供者和服务消费者之间的数据传输采用哪种方式,是同步还是异步,是在单连接上传输,还是多路复用。

数据压缩采用什么格式?通常数据传输都会对数据进行压缩,来减少网络传输的数据量,从 而减少宽消耗和网络传输时间,比如常见的 JSON 序列化、Java 对象序列化以及 Protobuf 序列化等。

四、 服务监控

一旦服务消费者与服务提供者之间能够正常发起服务调用,你就需要对调用情况进行监控,以了

解服务是否正常。通常来讲,服务监控主要包括三个流程。

1、指标收集。就是要把每一次服务调用的请求耗时以及成功与否收集起来,并上传到集中的数

据处理中心。

2、数据处理。有了每次调用的请求耗时以及成功与否等信息,就可以计算每秒服务请求量、平

均耗时以及成功率等指标。

3、数据展示。数据收集起来,经过处理之后,还需要以友好的方式对外展示,才能发挥价值。 通常都是将数据展示在 Dashboard 面板上,并且每隔 10s 等间隔自动刷新,用作业务监控 和报警等。

五、服务追踪

除了需要对服务调用情况进行监控之外,你还需要记录服务调用经过的每一层链路,以便进行问题追踪和故障定位。

服务追踪的工作原理大致如下:

服务消费者发起调用前,会在本地按照一定的规则生成一个 requestid,发起调用时,将 requesti当作请求参数的一部分,传递给服务提供者。

服务提供者接收到请求后,记录下这次请求的 requestid,然后处理请求。如果服务提供者 继续请求其他服务,会在本地再生成一个自己的 requestid,然后把这两个 requestid 都当 作请求参数继续往下传递。

以此类推,通过这种层层往下传递的方式,一次请求,无论最后依赖多少次服务调用、经过多少服务节点,都可以通过最开始生成的 requestid 串联所有节点,从而达到服务追踪的目的。

六、 服务治理

服务监控能够发现问题,服务追踪能够定位问题所在,而解决问题就得靠服务治理了。服务治理就是通过一系列的手段来保证在各种意外情况下,服务调用仍然能够正常进行。

在生产环境中,经常会遇到下面几种状况。

1、单机故障。通常遇到单机故障,都是靠运维发现并重启服务或者从线上摘除故障节点。然而集群的规模越大,越是容易遇到单机故障,在机器规模超过一百台以上时,靠传统的人肉运维显然难以应对。而服务治理可以通过一定的策略,自动摘除故障节点,不需要人为干预,就能保证单机故障不会影响业务。

2、单 IDC 故障。你应该经常听说某某 App,因为施工挖断光缆导致大批量用户无法使用的严重 故障。而服务治理可以通过自动切换故障 IDC 的流量到其他正常 IDC,可以避免因为单 IDC 故障引起的大批量业务受影响。依赖服务不可用。比如你的服务依赖依赖了另一个服务,当另一个服务出现问题时,会拖慢甚至拖垮你的服务。而服务治理可以通过限流,在依赖服务异常的情况下,一段时期内停止发起调用而直接返回。这样一方面保证了服务消费者能够不被拖垮,另一方面也给服务提者减少压力,使其能够尽快恢复。