之前介绍了什么时候进行服务化,以及服务化拆分的两种方式即横向拆分和纵向拆分,还提到了引入微服务架构需要解决的问题。

这篇文章将进行介绍微服务架构的各个组成部分。

下图是微服务架构的模块图,在具体介绍之前先来看下一次正常的服务调用的流程。

微服务架构模块图

首先服务提供者(就是提供服务的一方)按照一定格式的服务描述,向注册中心注册服务,声明自己能够提供哪些服务以及服务的地址是什么,完成服务发布。

接下来服务消费者(就是调用服务的一方)请求注册中心,查询所需要调用服务的地址,然后以约定的通信协议向服务提供者发起请求,得到请求结果后再按照约定的协议解析结果。

而且在服务的调用过程中,服务的请求耗时、调用量以及成功率等指标都会被记录下来用作监控,调用经过的链路信息会被记录下来,用于故障定位和问题追踪。在这期间,如果调用失败,可以通过重试等服务治理手段来保证成功率。

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

  • 服务描述:RESTful API (HTTP)、XML 配置(RPC)、IDL 文件(gRPC/Thrift)
  • 注册中心:注册(服务提供者->注册中心)、订阅(服务消费者->注册中心)、返回(注册中心->服务消费者)、通知(注册中心->服务消费者)
  • 服务框架:通信框架、通信协议、序列化和反序列化
  • 服务监控(发现问题):指标收集、数据处理、数据展现
  • 服务***问题):RequestId传递
  • 服务治理(解决问题):单机故障-自动摘除、单IDC故障-自动切换、依赖服务不可用-熔断

接下来进行介绍这些组件。

服务描述

服务调用首先解决的问题就是服务如何对外描述。服务描述主要解决对外服务的服务名是什么,调用需要提供哪些信息,返回格式是什么以及如何进行解析。

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

RESTful API 方式通常用于 HTTP 协议的服务描述。RESTful API 方式的服务描述如下:

GET /sysDictoryDict/mapByUserId/{userId}
POST /enterprise/enterpriseDetail/top
PUT /enterprise/{enterpriseId}
DELETE /enterprise/{enterpriseId}

XML 配置方式多用作 RPC 协议的服务描述,通过 *.xml 配置文件来定义接口名、参数以及返回值类型等。XML 配置方式的服务描述主要分三个步骤:

  1. 服务提供者定义接口,并实现接口
  2. 服务提供者进程启动时,通过加载 server.xml 配置文件将接口暴露出去。
  3. 服务消费者进程启动时,通过加载 client.xml 配置文件引入要调用的接口。

IDL 文件方式通常用作 Thrift 和 gRPC 这类跨语言服务调用框架中,比如 gRPC 就是通过 Protobuf 文件来定义服务的接口名、参数以及返回值的数据结构。

服务描述方式比较

服务描述方式 使用场景 缺点
RESTful API 跨语言平台,组织内外都适用 相比 TCP,HTTP 作为通信协议性能较差
XML 配置 Java 平台,一般用于组织内部 不支持跨语言平台