赞
踩
微服务架构首先要面对分布式架构的内生复杂性,即:服务通信和服务治理的复杂性,例如:服务发现、熔断、限流、全链路追踪等挑战。
一个完整的微服务系统底座的基本功能应该包含:
第一代微服务框架,如 Dubbo 或 Spring Cloud 以代码库的方式来封装这些能力。这些代码库被构建在应用程序本身中,随着应用一起发布和维护。显而易见的,两者都是只适用于特定的应用场景和开发环境,它们的设计目的并不是为了支持通用性和多语言性。并且它们只是 Dev 层的框架,缺少 DevOps 的整体解决方案(这正是微服务架构需要关注的)。
Spring Cloud 为开发者提供了快速构建分布式系统的通用模型的工具,包括:配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等。
主要项目有:
Dubbo 是一个阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
其核心部分包含:
Service Mesh 作为服务间通信的基础设施层,可以简单理解为:Service Mesh 是微服务之间的 TCP 和 IP 协议,负责服务之间的网络调用、限流、熔断和监控。
对于应用程序开发而言,开发者通常不需要关心 L3、L4 层的网络通信协议。同样的,使用 Service Mesh 之后,微服务之间就无须关心服务之间的通信那些,原来使用 Spring Cloud 或 Dubbo 框架来实现的通信代码逻辑了。
在 CaaS 中,Service Mesh 作为 Sidecar 运行,对微服务来说是透明,但所有微服务之间的流量都会通过它,所以对微服务的流量控制都可以在 Service Mesh 中实现。可见 Service Mesh 是云原生理念中 “容器设计模式” 的典范。目前流行的 Service Mesh 开源软件有 Linkerd、Envoy 和 Istio。
Linkerd 和 Envoy 比较相似,都是一种面向服务通信的网络代理,均可实现诸如服务发现、请求路由、负载均衡等功能。它们的设计目标就是为了解决服务之间的通信问题,使得应用对服务通信无感知,这也是 Service Mesh 的核心理念。
Linkerd 和 Envoy 像是分布式的 Sidebar,多个类似 Linkerd 和 Envoy 的 Proxy 互相连接,就组成了 Service Mesh。而 Istio 则是站在了一个更高的角度,它将 Service Mesh 分为了 Data Plane 和 Control Plane。Data Plane 负责微服务间的所有网络通信,而 Control Plane 负责管理 Data Plane Proxy。
Istio 提供了一个完整的解决方案,通过为整个 Service Mesh 提供行为洞察和操作控制来满足微服务应用程序的多样化需求,且不需要改动任何微服务的业务代码。
Istio 提供了许多 Service Mesh 的关键功能:
Istio 提供了一种简单的方式来构建 Service Mesh,只需要在 Pod 中部署一个特殊的 Sidecar Container,然后使用 Istio 的控制面来配置和管理代理,拦截微服务之间的所有网络通信。
Istio 的软件架构从逻辑上分为数据面和控制面:
Envoy 是一个面向微服务架构的 L7 代理以及通信总线,为了实现:对于应用程序而言,网络应该是透明的,当发生网络和应用程序故障时,能够很容易定位出问题的根源。
Envoy 可提供以下特性:
Kubernetes 是容器调度编排的事实标准,并且 Istio 天生的支持 Kubernetes,这就弥合了应用编排框架与 Service Mesh 之间的空隙。Istio 等 Service Mesh 组件的出现补足了 Kubernetes 在微服务间服务通讯上的短板。
虽然 Dubbo、Spring Cloud 等都是成熟的微服务框架,但是它们或多或少都会和具体语言或应用场景绑定,并只解决了微服务 Dev(开发)层面的问题。若想解决 Ops(运维)问题,它们还需和诸如 Cloud Foundry、Mesos、Docker Swarm 或 Kubernetes 这类资源调度框架做结合。但是这种结合又由于初始设计和生态,有很多适用性问题需要解决。
Kubernetes 则不同,它本身就是一个 “不可变基础设施”,与开发语言无关的、通用的容器管理平台,它可以支持运行云原生和传统的容器化应用。并且它覆盖了微服务的 Dev 和 Ops 阶段,结合Service Mesh,它可以为用户提供完整端到端的微服务体验。
在未来,一个趋近于 PaaS 形态的微服务框架技术栈应该是如下形式:
不同微服务之间可能存在一些异构,为了让每一个团队在微服务体系下发挥最大效能,需要允许不同团队采用不同的编程语言,甚至不同的运行环境来去运行这些微服务。因此,在运维和管理微服务时,最初其实并没有一套统一的标准去处理的异构环境,这也是为什么后来容器技术变得流行起来,它的一个重要作用就是通过一层标准的封装以及标准的运行时,来标准化微服务部署。这样从生命周期管理的角度来看,每一个微服务之间的差异就会变少,共同点变多。所以容器也被称为 “不可变基础设施”。
Kubernetes 的作用是帮助把已经标准化的微服务最便捷地运行到底层资源上面。我们讲到的存储、计算、网络都通过 Kubernetes 这层进行了统一抽象和封装,让已经被容器统一的微服务能够直接运行到 Kubernetes 平台。因此,运维人员不用再苦恼如何去把某个微服务分配到具体的某一个资源或计算单元上去。通过容器和容器平台,大大简化了微服务本身的生命周期管理,简化了微服务自身的运维管理问题,也促进了微服务更多地被企业所采用。
Kubernetes 具有一个 Pod 的概念。一个 Pod 实际上是一组容器的集合,在一个 Pod 中可以运行一个或多个容器。一般来讲,当我们采用微服务架构时,会把微服务的主体运行在主容器中,主容器的生命周期跟 Pod 自身的生命周期是一个耦合的状态。除了主容器之外,在同一个 Pod 中还会运行一些边车容器(Sidecar 容器),为主容器提供一些辅助功能,比如:日志采集、网络代理、身份鉴权等,这样微服务除了自身提供的核心业务服务以外,通过 Kubernetes 我们还可以动态添加一些额外的辅助能力,让微服务管理变得更健壮。
这种微服务应用的设计思想被称为 “容器设计模式”。
当我们将大型的单体应用拆解为多个微服务,也一定会增加 IT 系统研发协同、交付、运维的复杂性。云原生就在于帮助微服务解决生命周期管理以及运维管理难题。
因为微服务的数量非常多,部署、管理的工作量很大。
而随着 CI/CD 概念推广以及容器技术普及,微服务将这两种理念和技术结合起来,形成新的:“微服务 + API + 平台” 的开发模式,提出了容器化微服务的持续交付概念。
传统单体架构 DevOps 开发方式,要求产品队伍横跨产品管理、开发、QA、DBA 以及系统运维管理。
微服务架构 DevTestOps 开发方式,将一个大臃肿的整体产品开发队伍切分为根据不同微服务的划分的产品队伍,以及一个大的整体的平台队伍负责运营管理,两者之间通过 API 交互,做到了松耦合隔绝。
在测试方面,微服务架构下的测试分为三个层次:
三种测试从上到下实施的容易程度递增,但是测试效果递减。端到端测试最费时费力,但是通过测试后我们对系统最有信心。单元测试最容易实施,效率也最高,但是测试后不能保证整个系统没有问题。
综上,我们可以感受到微服务架构与容器、Kubernetes、DevOps 等云原生关键技术自然地走到了一起,构成了云原生应用架构的雏形。
云原生应用架构具有下述特点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。