微服务入门

微服务简介

“微服务”最初是由 MartinFowler 在 2014年写的一篇文章 《MicroServices》中提出来的。 关于 Martin Fowler 的介绍,维基百科上是这样描述的:

Martin Fowler,软件工程师,也是一个软件开发方面的著作者和国际知名演说家,专注于丽向对象分析与设 计、统一建模语言、领域建模,以及敏捷软件开发方法,包括极限编程。 主要著作有《可重用对象模型》《重构一一改 善既有代码的设计》《企业应用架构模式》《规划极限编程》 等。 ——Wikipedia

微服务定义

对于微服务,业界没有一个严格统一的定义,但是作为“微服务”这一名词的发明人,Martin Fowler 对微服务的定义似乎更具有权威性和指导意义 。 他的理解如下:

简而言之,微服务架构的风格,就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻 量级机制通信,通常是 HTTP RESTFUL API。这些服务围绕业务能力来划分构建,并通过完全自动化部署机制来 独立部署。 这些服务可以使用不同的编程语言,以及不同数据存储技术,以保证最低限度的集中式管理。

微服务特点

结合以上的定义,微服务具有以下的特点:

  • 按照业务来划分服务,单个服务代码量小,业务单 一 ,易 于维护。
  • 每个微服务都有自 己独立 的基础组件 ,例如数据库、 缓存等 ,且运行在独立的进程中。
  • 微服务之间的通信是通过 HTTP 协议或者消息组件,且具有容错能力。
  • 微服务有一套服务治理的解决方案,服务之间不相合,可以随时加入和剔除服务。
  • 单个微服务能够集群化部署,并且有负载均衡的能力。
  • 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护 等。
  • 整个微服务系统有链路追踪的能力。
  • 有一套完整的实时日志系统 。

微服务的不足

  • 微服务的复杂度
  • 分布式事务(CAP理论,AP系统)
  • 服务的划分
  • 服务的部署

微服务的功能

服务的注册与发现

服务注册士在指向服务注册中心注册一个服务实例,服务提供者将自己的服务信息(如服务
名、 IP 地址等〉告知服务注册中心。服务发现是指当服务消费者需要消费另外一个服务时,
服务注册中心能够 告知 服务消费者它所要消费服务的实例信息(如服务名、 IP 地址等〉。通常
情况下, 一个服务既是服务提供者,也是服务消费者。服务消费者一般使用 HTTP 协议或者消
息组件这种轻盘级 的通信机制来进行服务消
费。

服务的负载均衡

在微服务架构中,服务之间的相互调用一般是通过HTTP通信协议来实现的。网络往往具有不可靠性,为了保证服务额高可用(High Availability),服务单元通常集群化部署。

一般都会讲服务提供者和服务注册中心进行集群化部署,来实现负载均衡。

服务的负载

服务的容错

为了解决分布式系统的雪崩效应,分布式系统引进了熔断器机制。

当一个服务的处理用户请求 的失败次数在一定时间内 小
于设定的阀值时,熔断器处于关闭状态,服务正常 : 当服务 处理用 户请求的失败次数大于设定
的阀值时,说明服务出现了故障,打开熔断器,这时所有的请求会执行快速失败,不执行业务
逻辑。当处于打开状态的熔断器时 , 一段时间后会处于半打开状态,并执行一定数量的请求 ,
剩余的请求会执行快速失败,若执行的请求失败了,则继续打开熔断器;若成功了,则将熔断器关闭 。

熔断器机制

服务网关

微服务系统通过将资源以 API 接口的形式暴露给外界来提供服务。在微服务系统中, API 接口资源通常是由服务网关(也称 API 网关〉统一暴露,内部服务不直接对外提供 API 资源 的暴露 。 这样做的好处是将 内部服务隐藏起来 ,外界还以为是一个服务在提供服务,在一定程 度上保护了微服务系统的安全。 API 网关通常有请求转发的作用 , 另外它可能需要负责一定的 安全验证,例如判断某个请求是否合法,该请求对某 一个资源是否具有操作权限 等。通常情况下,网关层以集群 的形式存在 。在服务网关层之前,有可能需要加上负载均衡层,通常为 Nginx 双机热备,通过一定的路由策略, 将请求转发到网关层。到达网关层后,经过一系列的用户身 份验证、权限判断, 最终转发到具体的服务。具体的服务经过一系列的逻辑运算和数据操作, 最终将结果返回给用户 。

服务网关架构图

服务配置的统一管理

服务配置统一管理的架构图如下:

服务配置统一管理

服务链路追踪

微服务系统是一个分布式架构的系统,微服务系统按业务划分服务单元, 一个微服务系统往往有很多个服务单元。由于服务单元数量很多且业务复杂, 服务与服务之间的调用有可能非常复杂, 一旦出现了异常和错误,就会很难去定位。所以在微服务架构中,必须实现分布式链路追踪,去跟进 一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而使每个请求链路清晰可见,出了问题很快就能定位。

参考资料:《深入理解Spring Cloud与微服务构建》——方志明