作为一种架构模式,微服务将复杂系统切分为数十乃至上百个小服务,每个服务负责实现一个独立的业务逻辑。这些小服务易于被小型的软件工程师团队所理解和修改,并带来了语言和框架选择灵活性,缩短应用开发上线时间,可根据不同的工作负载和资源要求对服务进行独立缩扩容等优势。
  另一方面,当应用被拆分为多个微服务进程后,进程内的方法调用变成了了进程间的远程调用。引入了对大量服务的连接、管理和监控的复杂性。

  
  该变化带来了分布式系统的一系列问题,例如:

  • 如何找到服务的提供方?
  • 如何保证远程方法调用的可靠性?
  • 如何保证服务调用的安全性?
  • 如何降低服务调用的延迟?
  • 如何进行端到端的调试?

  另外生产部署中的微服务实例也增加了运维的难度,例如:

  • 如何收集大量微服务的性能指标已进行分析?
  • 如何在不影响上线业务的情况下对微服务进行升级?
  • 如何测试一个微服务集群部署的容错和稳定性?

  这些问题涉及到成百上千个服务的通信、管理、部署、版本、安全、故障转移、策略执行、遥测和监控等,要解决这些微服务架构引入的问题并非易事。
  在出现服务网格之前,最开始是在微服务应用程序内理服务之间的通讯逻辑,包括服务发现、熔断、重试、超时、加密、限流等逻辑。


  
  在一个分布式系统中,这部分逻辑比较复杂,为了让微服务应用提供一个稳定、可靠的基础设施层,避免重复造轮子,并减少犯错的可能,一般会通过对这部分负责服务通讯的逻辑进行抽象和归纳,形成一个代码库供各个微服务应用程序使用。公共的代码库减少了应用程序的开发和维护工作量,降低了由应用开发人员单独实现微服务通讯逻辑出现错误的机率,但还是存在下述问题:

  • 微服务通讯逻辑对应用开发人员并不透明,应用开发人员需要理解并正确使用代码库,不能将其全部精力聚焦于业务逻辑。
  • 需要针对不同的语言/框架开发不同的代码库,反过来会影响微服务应用开发语言和框架的选择,影响技术选择的灵活性。
  • 随着时间的变化,代码库会存在不同的版本,不同版本代码库的兼容性和大量运行环境中微服务的升级将成为一个难题。

  
  可以将微服务之间的通讯基础设施层和TCP/IP协议栈进行类比。TCP/IP协议栈为操作系统中的所有应用提供基础通信服务,但TCP/IP协议栈和应用程序之间并没有紧密的耦合关系,应用只需要使用TCP/IP协议提供的底层通讯功能,并不关心TCP/IP协议的实现,如IP如何进行路由,TCP如何创建链接等。
  同样地,微服务应用也不应该需要关注服务发现,Load balancing、Retries、Circuit Breaker等微服务之间通信的底层细节。如果将为微服务提供通信服务的这部分逻辑从应用程序进程中抽取出来,作为一个单独的进程进行部署,并将其作为服务间的通信代理。

  因为通讯代理进程伴随应用进程一起部署,因此形象地把这种部署方式称为“Sidecar”/边车(即三轮摩托的挎斗)。应用间的所有流量都需要经过代理,由于代理以Sidecar方式和应用部署在同一台主机上,应用和代理之间的通讯可以被认为是可靠的。由代理来负责找到目的服务并负责通讯的可靠性和安全等问题。

  当服务大量部署时,随着服务部署的Sidecar代理之间的连接形成了一个如下图所示的网格,该网格成为了微服务的通讯基础设施层,承载了微服务之间的所有流量,被称之为Service Mesh(服务网格)。

lstio 微服务框架_基础设施

  服务网格是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求可以在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不需要知道它们的存在。
  服务网格中有数量众多的Sidecar代理,如果对每个代理分别进行设置,工作量将非常巨大。为了更方便地对服务网格中的代理进行统一集中控制,在服务网格上增加了控制面组件。这里可以类比SDN的概念,控制面就类似于SDN网管中的控制器,负责路由策略的指定和路由规则下发;数据面类似于SDN网络中交换机,负责数据包的转发。
  由于微服务的所有通讯都由服务网格基础设施层提供,通过控制面板和数据面板的配合,可以对这些通讯进行监控、托管和控制,以实现微服务灰度发布,调用分布式追踪,故障注入模拟测试,动态路由规则,微服务闭环控制等管控功能。

  
Istio服务网格
  Istio是一个Service Mesh开源项目,是Google继Kubernetes之后的又一力作,主要参与的公司包括Google,IBM和Lyft。
  凭借Kubernetes良好的架构设计及其强大的扩展性,Google围绕Kubernetes打造一个生态系统。其向下用CNI(容器网络接口),CRI(容器运行时接口)标准接口可以对接不同的网络和容器运行时实现,提供微服务运行的基础设施。向上则用Istio提供了微服务治理功能。
  Google借Istio的力量推动微服务治理的事实标准,对Google自身的产品Google Cloud有极其重大的意义。可以预见不久的将来,对于云原生应用而言,采用Kubernetes进行服务部署和集群管理,采用Istio处理服务通讯和治理,将成为微服务应用的标准配置。

  
  Istio服务包括网格由数据面和控制面两部分。

  • 数据面由一组智能代理(Envoy)组成,代理部署为边车,调解和控制微服务之间所有的网络通信。
  • 控制面负责管理和配置代理来路由流量,以及在运行时执行策略。

  
  服务网格为微服务提供了一个对应用程序透明的安全、可靠的通信基础设施层。采用服务网格后,微服务应用开发人员可以专注于解决业务领域问题,将一些通用问题交给服务网格处理。采用服务网格后,避免了代码库带来的依赖,可以充分发挥微服务的异构优势,开发团队可以根据业务需求和开发人员能力自由选择技术栈。
  Istio具有良好的架构设计,提供了强大的二次开发扩展性和用户定制能力。虽然Istio目前还处于beta阶段,但已经获得众多知名公司和产品的支持,是一个非常具有前景的开源服务网格开源项目。