暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

实践中的微服务:从架构到自动化运维(结束篇)

研发生产率生态 2019-12-15
1135

微服务数据管理

在单体架构中,应用程序将数据存储在单个集中式数据库中,以实现应用程序的各种功能/能力。

 在微服务架构中,功能分散在多个微服务中,如果我们使用集中式数据库,则各个服务将不再彼此独立(例如,如果某个服务的数据库架构需求调整,则将中断其他服务)。因此,每个微服务都必须具有自己的数据库是非常重要的。每个微服务都有自己的私有数据库



以下是在微服务体系结构中实现分散数据管理的关键点
  • 每个微服务都可以有一个私有数据库来保存需要实现其提供的业务功能的数据。

  • 给定的微服务只能访问专用的私有数据库,而不能访问其他微服务的数据库。

  • 在某些业务场景中,您可能必须为单个事务更新多个数据库。在这种情况下,其他微服务的数据库应仅通过其服务API进行更新(不允许直接访问该数据库)



分散式数据管理为您提供了完全解耦的微服务,以及选择不同数据管理技术(SQL或NoSQL等)的自由。每个服务的不同数据库管理系统)。然而,对于涉及多个微服务的复杂事务用例,事务行为必须使用每个服务提供的API来实现,并且逻辑驻留在客户端或中介层。

服务治理
通常,“治理”是指建立和加强人员和解决方案如何共同协作以实现组织目标。在SOA的上下文中,SOA治理指导可重用服务的开发,确定如何设计和开发服务以及随着时间的推移这些服务将如何变化。它在服务的提供者和这些服务的消费者之间建立协议,告诉消费者他们可以期望什么以及提供者他们有义务提供什么。在SOA治理中,有两种常用的治理类型:
  • 设计时治理——定义和控制服务创建、设计和实现服务策略

  • 运行时治理——在执行期间执行服务策略的能力

那么,微服务环境中的治理到底意味着什么?在微服务架构中,微服务被构建为具有各种技术和平台的完全独立和解耦的服务。因此,无需为服务设计和开发定义通用标准。因此,我们可以总结出微服务的去中心化治理功能,如下所示
  • 在微服务体系结构中,不需要集中式设计时治理。

  • 微服务可以自行决定其设计和实现。

  • 微服务架构促进了公共/可重用服务的共享

  • 某些运行时管理方面(例如SLA,限制,监视,通用安全要求和服务发现)可以在API-GW级别实现。

服务注册和服务发现

在微服务架构中,您需要处理的微服务数量非常多。而且,由于微服务的快速和敏捷开发/部署性质,它们的位置会动态变化。因此,您需要在运行时找到微服务的位置。解决此问题的方法是使用服务注册表。

服务注册

Service Registry保存微服务实例及其位置。微服务实例在启动时在服务注册中心注册,在关闭时注销。使用者可以通过service registry找到可用的微服务及其位置

服务发现

为了找到可用的微服务及其位置,我们需要一个服务发现机制。有两种类型的服务发现机制,客户端发现和服务器端发现。让我们仔细看看这些服务发现机制。

 客户端发现在这种方法中,客户端或API-GW通过查询服务注册中心获得服务实例的位置,SpringCloud  Eureka 就是典型的客户端发现机制。



服务器端发现-使用这种方法,客户端/ API-GW将请求发送到在已知位置运行的组件(例如负载均衡器)。该组件调用服务注册表并确定微服务的绝对位置。

诸如Kubernetes(http://kubernetes.io/v1.1/docs/user-guide/services.html)之类的微服务部署解决方案提供了服务端发现机制
部署

在微服务架构方面,微服务的部署起着至关重要的作用,并且具有以下关键要求

  • 能够独立于其他微服务部署/取消部署。

  • 能够在每个微服务级别进行扩展(例如,某个服务可能比其他服务获得更多的流量)

  • 快速构建和部署微服务。

  • 一个微服务中的故障不得影响其他任何服务

Docker 部署,提供了一种很好的方式来部署微服务以满足上述要求。涉及的关键步骤如下

  • 将微服务打包为(Docker)容器映像。
  • 将每个服务实例部署为一个容器。
  • 扩展是基于改变容器实例的数量来完成的。
  • 构建、部署和启动微服务的速度要快得多,因为我们使用的是Docker容器(比普通VM快得多)
  • jenkins +docker进行更快速的自动化构建部署

Kubernetes扩展了Docker的功能,它允许将一组Linux容器作为一个单独的系统来管理,跨多个主机管理和运行Docker容器,提供容器的共存、服务发现和复制控制。正如您所看到的,这些特性中的大多数在我们的微服务上下文中也是必不可少的。因此,将Kubernetes用于微服务部署已经成为一种非常强大的方法,特别是对于大型微服务部署。


在上图中,部署部分它显示了零售应用程序的微服务部署的概述。每个微服务实例被部署为一个容器,每个主机有两个容器。您可以任意更改在给定主机上运行的容器数量。

安全

利用API安全标准(例如OAuth2和OpenID Connect)为我们的微服务安全问题找到更好的解决方案。在深入探讨这一点之前,让我概述一下每个标准的目的以及如何使用它们。

OAuth2-是访问委派协议。客户端通过授权服务器进行身份验证,并获得一个不透明的令牌,称为“访问令牌”。访问令牌的用户/客户端信息为零。它仅具有对只能由授权服务器检索的用户信息的引用。因此,这被称为“参考令牌”,即使在公共网络/互联网中也可以安全地使用此令牌。

OpenID Connect的行为类似于OAuth,但除了访问令牌外,授权服务器还会发布一个ID令牌,其中包含有关用户的信息。这通常由JWT(JSON Web令牌)实现,并由授权服务器签名。因此,这确保了授权服务器和客户端之间的信任。因此,JWT令牌被称为“按值令牌”,因为它包含用户信息,并且在内部网络外部使用它显然是不安全的。

 如上图所示,这些是实现微服务安全性所涉及的关键步骤
  • 保留对OAuth和OpenID Connect服务器(授权服务器)的身份验证,以便在客户端有权使用数据的情况下,微服务成功提供访问权限。

  • 使用API-GW,所有客户端请求都有一个入口点。

  • 客户机连接到授权服务器并获得访问令牌(通过引用令牌)。然后将访问令牌连同请求一起发送到API-GW。
  • 网关上的令牌转换——API-GW提取访问令牌并将其发送到授权服务器以检索JWT(通过值令牌)。
  • 然后GW将JWT连同请求一起传递给微服务层
  • JWT包含有助于存储用户会话等的必要信息。如果每个服务都可以理解JSON Web令牌,则您已经分发了身份识别机制,该机制允许您在整个系统中传输身份
  • 在每个微服务层,我们都可以有一个处理JWT的组件,这是一个非常简单的实现。

    事务

微服务中的交易支持如何?实际上,支持跨多个微服务的分布式事务是非常复杂的任务。微服务架构本身鼓励服务之间的无事务协调。

微服务服务是完全独立的,并且基于单一责任原则。跨多个微服务进行分布式事务的需求通常是微服务体系结构中设计缺陷的征兆,通常可以通过重构微服务的范围来解决。但是,如果必须在多个服务之间分配事务,则可以通过在每个微服务级别引入“补偿操作”来实现这种情况。关键思想是,给定的微服务基于单一职责原则,如果给定的微服务无法执行给定的操作,我们可以认为这是整个微服务的失败。然后,必须通过调用这些微服务的相应补偿操作来撤消所有其他(上游)操作。
微服务容错设计
微服务体系结构引入了一组分散的服务,与单体设计相比,这增加了每个服务级别出现故障的可能性。给定的微服务可能由于网络问题、底层资源不可用等原因而失败。不可用或无响应的微服务不应该导致整个基于微服务的应用程序宕机。因此,微服务应该是容错的,能够在可能的情况下恢复,并且客户端必须优雅地处理它。
此外,由于服务可能在任何时候出现故障,因此能够快速检测(实时监视)故障并在可能的情况下自动恢复服务非常重要

在处理微服务上下文中的错误时,有几种常用的模式


断路器

在对微服务进行外部调用时,每次调用都配置一个故障监视器组件,当故障达到某个阈值时,该组件将停止对服务的任何进一步调用(触发电路)。在一定数量的请求处于打开状态(您可以配置)之后,将电路更改回关闭状态

这种模式非常有用,可以避免不必要的资源消耗、由于超时而导致的请求延迟,还可以让我们有机会监视系统(基于主动开路状态)。

舱壁(Bulkhead)
由于微服务应用程序包含微服务的数量,因此基于微服务的应用程序一部分的故障不应影响其余的应用程序。 舱壁模式是关于隔离应用程序的不同部分的,因此应用程序中服务的故障不会影响任何其他服务。
超时
超时模式是一种机制,它允许您在认为微服务不会响应时停止等待。在这里,您可以配置希望等待的时间间隔。
那么,我们在哪里以及如何在微服务中使用这些模式呢?在大多数情况下,大多数模式都适用于网关级别。这意味着当微服务不可用或没有响应时,在网关级别,我们可以决定是否使用断路器或超时模式将请求发送到微服务。另外,在网关级别实现bulkhead等模式也非常重要,因为它是所有客户端请求的单一入口点,所以服务中的失败不应影响其他微服务的调用。
此外,网关可以用作中心点,在通过网关调用每个微服务时,我们可以获取每个微服务的状态和监视。

微服务、企业集成、API管理等等。
我们已经讨论了微服务架构的各种特征,以及如何在现代企业IT环境中实现它们。但是,我们应该记住,微服务不是万能药。流行语概念的盲目适应将无法解决您的“实际”企业IT问题。微服务具有很多优势,我们应该加以利用。但是,我们还必须记住,用微服务解决所有企业IT问题是不现实的。例如,微服务架构促进了消除ESB作为中央总线的发展,但是在现实世界中,有很多不基于微服务的现有应用程序/服务。因此,要与它们集成,我们需要某种集成总线。因此,理想情况下,微服务和其他企业体系结构概念(例如集成)的混合方法将更为现实。 
            --------------------已创建钉钉群-------------------------------




文章转载自研发生产率生态,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论