微服务操作模型

这里并不是介绍微服务概念,如需要了解微服务,可以阅读Fowler-Microservices文章。本博客假定我们已开始使用微服务解耦单体应用,用来提升可部署性和可扩展性。

当我们在系统范围内部署大量的微服务时,一个新的挑战产生了,单体应用部署时不会发生。这篇文章将针对这些新的挑战,在系统范围内部署大量微服务时定义一套操作模型(operations model)。

这篇文章分为如下几个部分:

  1. 前提条件;
  2. 扩展;
  3. 问题;
  4. 需要的组件;
  5. 参考模型;
  6. 下一步;

1. 前提条件

当在系统范围内需要部署大量微服务时,需要什么条件呢?

根据Flower的文章,如下是我们想要得到的:

(Source:http://martinfowler.com/articles/microservices.html)

然而,在开始发布大量微服务替换单体应用之前,我们需要实现如下这些前置条件:

  • 目标架构;
  • 持续交付工具;
  • 合适的组件结构;

下面简要描述每一个前置条件。

1.1   目标架构

首先,我们需要分区微服务。例如,我们可以垂直分解微服务。

  • 核心服务(Core services)-处理业务数据的持久化和实施业务逻辑和其他规则;
  • 组合服务(Composite services)-组合服务指编排一组核心服务实现一个特定任务,或者从一组核心服务中聚合信息;
  • API services – 向外暴露功能,例如允许第三方使用底层功能创建新的应用;

也可以水平上应用领域驱动分解。如下是一个目标架构:

备注:这仅仅是一个范例目标架构,你可以使用完全不同的架构。核心时在开始部署微服务之前,需要有简历一个目标架构。否则,你最终的架构有可能像一团面条一样,甚至比现有的单体应用更加糟糕。

1.2 持续交付

我们假定已经有了一套可持续交付的发布工具,以便我们可以高效地反复发布微服务。

(Source: http://www.infoq.com/minibooks/emag-devops-toolchain)

1.3合适的组织

最后,我们需要采用合适的组织结构,避免和Conway法则相冲突。Conway法则如下:

Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.

(Source: http://martinfowler.com/articles/microservices.html)

2. 扩展

接下来是本文关注的要点:

当我们分解单体应用,并使用大量的微服务替换时,在系统范围内会发生什么呢?

(1)   大量的部署单元

将产生需要的小的微服务,而不是之前的一个大的单体应用,这将需要管理和跟踪大量的部署单元。

(2)   微服务将同时暴露和调用服务

在系统范围内,大部分的微服务彼此是互相连接的。

(3)   一些微服务暴露外部API

这些微服务将负责包含其他的微服务不允许外部访问。

(4)   系统根据动态

新的微服务部署,替换老的服务。现有的微服务新增实例,满足增长的负荷。这意味着微服务将比以前更高的频率增加和下线。

(5)   平均故障时间(MTBF)将下降

在系统范围内,故障发生频率将更频繁。软件组件将不时发生问题。大量部署的微服务将比之前部署的单体应用出现问题的可能更高。

3. 问题

微服务模型将导致一些重要的运行时相关的问题:

(1)   微服务如何配置以及是否正确?

针对少量的应用程序,处理配置不是主要的问题,如使用配置文件或者在数据库中的配置表。在大量的微服务部署到大量的服务器上时,这一配置访问将变得非常复杂。这将导致大量的小的配置文件或者数据配置表遍布整个系统,使得难以高效可靠地维护。

(2)   什么微服务部署了,部署在哪里了?

在只有少量服务部署时,管理部署的主机和端口还是比较简单的。但是当有大量的微服务部署时,这些服务或多或少需要持续变更,如手工维护将变得非常麻烦。

(3)   如何维护路由信息?

在动态系统范围中,服务消费方也是一个挑战。尤其是路由表或者消费配置文件,需要手工更新。在微服务不断新增新的主机/端口时,将没有时间手工维护。交付时间将会延长,并且手工维护出错的风险也会增加。

(4)   如何防止失败链?

由于微服务之间是相互连接的,需要关注系统范围内的失败链。例如,一个被其他众多微服务依赖的微服务失败了,其他依赖的微服务也可能开始失败。如果没有合适处理,大量微服务将受到这个单一失败的微服务所影响,导致一个脆弱的系统。

(5)   如何验证所有的微服务已上线且在运行中?

跟踪少量应用的运行状态是比较简单的,但是如何验证所有的微服务是健康的,且准备好接收请求?

(6)   如何跟踪服务之间的消息?

如何应对组织开始接到关于一些流程执行失败?什么微服务到导致这一问题的根本原因?例如,订单12345卡住了,我们如何知道是因为微服务A无法访问,还是因为微服务B在发送一个订单确认消息之前,需要手工批准。

(7)   如何确保仅仅API服务暴露给外部?

例如我们如何避免外部未授权的请求,对内部微服务的访问?

(8)   如何保证API服务的安全?

这不是针对微服务的特定问题,但是保护对外暴露的微服务仍然是非常重要的。

4. 需要的组件

为了解决上述的一些问题,新的操作和管理功能是必须的。针对上述问题,建议的解决方案包括如下组件:

(1)   中心配置服务Central Configuration Server

我们需要一个中心配置管理,而不是针对每一个部署单元(微服务)有一个本地配置。此外,我们还需一个配置API,微服务用来获取配置信息。

(2)   服务发现服务 Service Discovery Server

我们需要服务发现功能,微服务在启动时,通过API自己注册,而不是手工跟踪微服务部署的主机和端口。

(3)   动态路由和负载均衡 Dynamic Routing and Load Balancer

基于服务发现功能,路由组件使用discovery API 查询请求的微服务部署在哪里;在被请求的服务部署了多个实例的情况下,负载均衡组件可以决定路由请求到特定的实例。

(4)   电路断路器 Circuit Breaker

为了避免失败链问题,我们需要营养Circuit Breaker模式,详细信息可以参考 Fowler-Circuit Breaker的文章。

(5)   监控 Monitoring

基于电路断路器,我们可以监控微服务的状态,同时收集运行时统计数据,获知服务的健康状态和当前使用率。这些信息可以收集并显示在dashboard上,并针对配置阈值设置自动报警。

(6)   中心日志分析 Centralized Log Analysis

为了跟踪消息,并检测微服务何时故障,我们需要一个中心日志分析功能,可以访问服务器并收集每一个微服务的log文件。日志分析功能保存log信息在中心数据库中,并提供了查询和dashboard功能。备注:为了查找相关的消息,所有微服务需要在log消息中使用相关的id,这点很重要。

(7)   边缘服务 Edge Server

为了对外部暴露API 服务,并阻止对内部微服务的未授权访问,我们需要一个边缘服务(Edge Server),所有外部的访问都经过边缘服务器。基于前面的服务发现组件,边缘服务器可以重用动态路由和负载均衡功能。边缘服务器作为一个动态和有效的反向代理,在内部系统更新时,不必手动更新。

(8)   OAuth 2.0保护的API

建议OAuth 2.0 标准保护暴露的API服务。应用OAuth 2.0 有如下效果:

1/一个新组建作为OAuth Authorization Server;

2/API服务作为OAuth Resource Server;

3/外部API消费方作为OAuth Clients;

4/边缘服务器(Edge Server)作为OAuth Token Relay;

(4.1)作为OAuth Resource Server;

(4.2)将外部请求中的OAuth Access Tokens传递给API 服务;

备注:OAuth 2.0 标准可能通过OpenID Connect标准来补充完善,提供更好的授权功能。

5. 参考模型

总而言之,微服务需要一套包含上述支持服务的基础设施,微服务使用它们的API来交互。下图描绘了这一基础设施:

备注:为了减少上图中交互的复杂度,微服务和支持服务的交互并没有画出来。

6. 下一步

在接下来的文章中,我们将描述和演示如何实现上述建议的参考模型。

英文原文链接:

An operations model for Microservices

时间: 2024-11-10 08:11:57

微服务操作模型的相关文章

企业级工作流解决方案(三)--微服务消息处理模型之服务端处理

1. Json-Rpc 2.0 参考地址:https://www.jsonrpc.org/specification JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议,它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中.其使用JSON(RFC 4627)作为数据格式,它为简单而生. 请求对象 发送一个请求对象至服务端代表一个rpc调用, 一个请求对象包含下列成员: jsonrpc指定JSON-RPC协议版本的字符串,必须准确写为“2.0” method包含所

企业级工作流解决方案(四)--微服务消息处理模型之消息传输通道

消息传输通道我这里只定义了3种,即:localInvoker,HttpInvoker,TcpInvoker,根据实际的情况,还可以进行扩展,比如消息队列,不过这都是后话了,先重点描述一下这3种方式. LocalInvoker 本地调用直接构造请求参数,直接调用服务端的JsonRpcProcessor服务处理执行服务处理过程,这个不多说. HttpInvoker 即执行http请求处理过程,由于.net framework和.net core的运行机制有所不同,处理方式也有所不同,但最终都落到服务

企业级工作流解决方案(六)--微服务消息处理模型之与Abp集成

身份认证传递 对于Abp比较熟悉的朋友应该对他里面的用户身份认证比较熟悉,他是通过实现微软提供的权限认证方式实现的,用户登录身份信息存储在System.Security.Claims.ClaimsPrincipal里面,但是用户的身份信息如何在不同的服务之间传递呢,不可能每一个服务都必须实现这套身份认证吧?比如我们请求调用过程如下: Portal站点获取用户信息没有问题,但如何传递到调用的其他微服务呢? 这在之前文章中提到的传输Header就起到了作用,有两种方式可以处理,第一种我们可以直接把a

企业级工作流解决方案(五)--微服务消息处理模型之客户端端处理

微服务的服务端已经启动起来了,服务消费者怎么知道服务在哪个地方,通过什么方式调用呢,分布式如何选择正确的服务器调用服务? 这个就涉及到服务发现.服务健康检查的问题了,很多微服务架构的做法都是通过消息队列来实现的,消息队列天生就支持发布订阅功能,服务有变化之后,发布通知,每个消费者更新状态,还涉及到更新服务的metadata信息,同时还涉及到服务健康检查等等一系列功能,其实这些地方是非常容易出问题的地方,但是对于规模流量不是特别巨大的企业,这部分职责可以进行转移,服务的发现就直接通过配置文件实现,

构建微服务-使用OAuth 2.0保护API接口

微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAuth 2.0,创建一个的安全API,可供外部访问Part 1和Part 2完成的微服务. 关于OAuth 2.0的更多信息,可以访问介绍文档:Parecki - OAuth 2 Simplified 和 Jenkov - OAuth 2.0 Tutorial ,或者规范文档 IETF RFC 674

谈谈微服务中的 API 网关(API Gateway)

转载至:http://www.cnblogs.com/savorboard/p/api-gateway.html 背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用. 但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中,举

.NET 微服务和Docker容器

.NET 微服务:适用于容器化 .NET 应用的体系结构 容器和 Docker 简介 什么是 Docker? Docker 术语 Docker 容器.映像和注册表 为 Docker 容器选择 .NET Core 还是 .NET Framework 通用指南 何时为 Docker 容器选择 .NET Core 何时为 Docker 容器选择 .NET Framework 决策表:用于 Docker 的 .NET Framework 使用 .NET 容器时定位的操作系统 官方 .NET Docker

微服务系列(一):微服务架构的优势与不足

微服务在当下引起广泛关注,成为文章.博客.社交媒体讨论和大会演讲的热点:在 Gartner 的 “Hype Cycle” 上排名也非常靠前.与此同时,在软件社区也有人质疑微服务并非新事物.反对者认为微服务只是 SOA (Service Oriented Architecture)的二度包装.然而,无论是追捧还是质疑,微服务架构拥有巨大优势,尤其是它让敏捷开发和复杂的企业应用交付成为可能. 本系列包含 7 篇文章,介绍了微服务的设计.构建和部署,并与传统的单体架构进行了比较.本系列将分析微服务架构

微服务分布式电商

近些年分布式框架很是火热,目前国内使用最多的框架是阿里的Dubbo体系架构,最近也有很多公司转型到Spring Cloud的怀抱,还有一部分选择自建分布式微服务架构.  本片博文主要讲述开发者使用自建的方式搭建微服务框架,主要目的是为了让开发者在底层实现上面更加详细的了解微服务原理. 本文以一个电商平台用自建分布式微服务架构为线索来讲解,代码中包含了自建微服务框架中众多核心模块代码:服务注册--服务发现--服务调用--服务隔离--服务熔断.详细代码已经上传gitHub了,地址:https://g