在Choerodon猪齿鱼设想之初,咱们但愿基于容器技术,整合DevOps工具链、微服务应用框架,开发一个企业级的PaaS平台,来帮助企业实现敏捷化的应用交付和自动化的运营管理。同时,也肯定了技术堆栈的要求,即充分地使用主流成熟的开源组件,利用开源工具的扩展机制来构建平台,打造一个开放的技术平台和体系,让企业享受到开源社区的成果。前端
固然,罗马不是一天建造起来的。从初期肯定技术栈到如今,除Choerodon猪齿鱼平台具体应用的实践与迭代,平台的技术栈也在不断进行着迭代。在开源社区中解决一个相同问题的开源技术有不少,而如何验证甄别哪些开源技术既可以知足如今的系统需求,在将来又有比较好的适应性,就给广大的架构师和软件设计师提出了挑战。根据Choerodon猪齿鱼实践经验,在使用开源技术时,能够从以下几个方面来进行考虑:git
到目前为止,Choerodon猪齿鱼通过不断地迭代,逐渐造成了以 Spring Cloud + Kubernetes 为主体的微服务技术体系。github
在开始介绍以前,首先须要了解什么是微服务架构? 2014年初(该年能够称之为微服务的元年),微服务之父 Martin Fowler 在其博客上发表了"Microservices" 一文,文中正式提出了微服务架构风格,并指出了微服务架构的一些特色。数据库
简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个本来独立的系统拆分红多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间经过基于HTTP的RESTful API进行通讯协做。被拆分的每个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,而且每一个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。因为有了轻量级的通讯协做基础,因此这些微服务可使用不一样的语言来编写。-- 做者 James Lewis and Martin Fowler, 翻译自《Spring Cloud微服务实战》编程
在传统的单体应用系统架构中,通常分为三个部分,即数据库、服务应用端和前端展示,在业务发展初期,因为全部的业务逻辑在一个应用中,开发、测试、部署都比较容易。可是,随着业务的发展,系统为了应对不一样的业务需求会不断为单体应用增长不一样的业务模块。长此以往,不断扩充的业务需求致使单体应用的系统愈来愈庞大臃肿。此时,单体应用的问题也逐渐显现出来,因为单体应用是一个“总体”,每每修改一个小的功能,为了部署上线就会影响到其余功能的运行。并且,对于业务而言,每每不一样模块对系统资源的要求不也尽相同,而单体应用各个功能模块由于没法分割,也就没法细化对系统资源的需求。因此,单体应用在初期是比较方便快捷,可是随着业务的发展,维护成本会愈来愈大,且难以控制。安全
Martin Fowler 认为微服务架构与单体应用最大的区别在于,微服务架构将一个完整的单体应用拆分红多个有着独立部署能力的业务服务,每一个服务可使用不一样的编程语言,不一样的存储介质,来保持低限度的集中式管理。下面这张图,很好的说明了单体架构和微服务架构的区别。网络
根据 Choerodon 猪齿鱼的开发实践和产品化经验,在互联网+、云计算和大数据、人工智能等的大背景下,构建软件系统产品,首先要把系统的基础框架搭好,方便后续的扩展。而微服务架的独立部署、松耦合等特色,与Choerodon猪齿鱼的想法和设计理念不谋而合, 因此 Choerodon 最终选择了微服务架构做为基础架构。架构
而在微服务基础框架中,有两个不得不提的微服务架构,分别是阿里巴巴的 Dubbo 和 Pivotal 公司开源的 Spring Cloud 。app
Dubbo 是一个高性能、基于JAVA 的开源RPC 框架。阿里巴巴开源的 Dubbo 致力于提供高性能和透明化的RPC 远程服务调用方案,以及SOA 服务治理方案,使得应用可经过高性能RPC 实现服务的输出和输入功能,和 Spring 框架能够无缝集成。本质上而言,是一个服务框架。根据Dubbo 的官方 Roadmap 能够看到,Dubbo 的发展经历了以下几个过程:负载均衡
Dubbo 按照分层来规划咱们的系统,包含远程通信、集群容错和自动发现三个核心部分。提供透明化的远程方法调用,使各个服务之间解耦合,并经过RPC的调用来实现服务的调用。
Dubbo 因为自身的设计使得服务之间的调用更加透明,网络消耗小,同时借助相似zookeeper 等分布式协调服务实现了服务注册。可是Dubbo 的缺点也是显而易见的,好比:
因为这些缺点,Choerodon 并无选择 Dubbo 做为基础开发框架。
在微服务架构的概念提出以后,很快 Netflix 公司将自家通过多年大规模生产验证的微服务架构,抽象落地造成 一整套开源的微服务基础组件 NetflixOSS 。2015年,Pivotal 将 NetflixOSS 开源微服务组件集成到其 Spring 体 系,并推出 Spring Cloud 微服务开发技术栈。自此,微服务技术迅猛普及,甚至 Spring Cloud一度成为了微服务的代名词。
可能更多了解微服务架构的读者都是从 Spring Cloud 入门,凭借以前 Spring Framework 的良好群众基础和Cloud 这个具备时代感的名字,Spring Cloud 的名字能够说是无人不知,无人不晓。结合Pivotal 公司的 Spring Boot,咱们经过封装开源成熟的Spring Cloud 组件和一些基础的分布式基础服务,就能够简单快速的实现一个微服务框架,下降应用微服务化的门槛。
Spring Cloud 提出了一整套有关于微服务框架的解决方案。包括:
下图说明了借助Spring Cloud 搭建的一套简单的微服务体系。
能够看到,Spring Cloud 集成了众多组件,从技术架构上下降了对大型系统构建的要求,使架构师以很是低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台。但同时,在实际开发中也发现 Spring Cloud 存在着的一些问题:
对比Dubbo 和Spring Cloud 能够发现,Dubbo 只是实现了服务治理,而Spring Cloud 的子项目则分别覆盖了微服务架构下的众多组件,而服务治理只是其中的一个方面。
经过谷歌和百度的搜索统计能够看到,自2015年起到如今,国内对于Spring Cloud 检索指数也在逐渐赶超Dubbo。
综合而言,Dubbo专一于服务治理;Spring Cloud关注于微服务架构生态。
虽然 Spring Cloud 下降了微服务化的门槛,可是除了基础的服务发现之外,Choerodon 团队在实际开发中也遇到了诸多的挑战。例如,各个组件并不是天衣无缝,不少组件在实际应用中都存在诸多不足和缺陷。 Spring Cloud 并非银弹,微服务架构解决了单体系统变得庞大臃肿以后产生的难以维护的问题,可是也由于服务的拆分引起了诸多本来在单体应用中没有的问题,好比部署困难,监控困难,运维成本大,是选择 Spring Cloud 首先要面对的问题。
而容器化的普及,尤为是云原生技术生态的不断完善,比较好地解决了微服务架构的采用引起的诸多问题,使得微服务在普通传统企业的落地成为了可能。
当企业逐步接受微服务架构,享受着微服务带来好处的同时,也面临着微服务运维成本的增长, 环境的不一致,服务的编排、部署、迁移等诸多问题。Choerodon 平台通过不断地演进,从初期引入Docker,到Rancher + Jenkins,再到如今采用 Kubernetes 为容器编排和管理工具。
容器技术产生的主要缘由,并非由于资源浪费。主要是开发和运维人员环境不一致,致使开发效率大大下降。经过容器能够在一个彻底隔离的环境中很是高效地运行代码,容器化自然适用于微服务,改善了引入Spring Cloud 微服务后开发效率大大下降的问题。可是单独使用Docker 并无完整的解决微服务管理的痛点,服务的部署和运维仍然急需解决。
Kubernetes 是谷歌推出的容器编排引擎,是基于GoLang 实现的一个开源软件。K8s(Kubernetes)初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统,其目标旨在消除编排物理/虚拟计算、网络和存储基础设施的负担,并使应用程序运营商和开发人员彻底将重点放在以容器为中心的原语上进行自助运营。
早期你们对于K8s 定位是容器编排引擎,同一时期流行的容器编排引擎还有MESOS、Docker Swarm 等。可是通过几年的发展,K8s 已经成为了云供应商的通用基础设施,咱们熟悉的Google Cloud,AWS,Microsoft Azure,阿里云,华为云等等,都提供了对K8s 的支持。如今,K8s 已经不只仅是一种工具,更多的是做为微服务架构的一种行业标准。
下图经过使用微服务架构的设计思想来看待K8s,并对K8s 中的一些功能进行了说明。
经过对比能够看到,在设计上,K8s自己就属于微服务架构的范畴。这里有的人可能就会有疑问,既然 K8s 功能这么强大,那么K8s 和 Spring Cloud 到底哪一个更好?Choerodon 为何不直接使用Kubernetes 做为基础的微服务架构呢?
为了区分Spring Cloud 和Kubernetes 两个项目的范围,下面这张图列出了几乎是端到端的微服务架构需求,从底层的硬件到上层的 DevOps 和自服务经验,而且列出了如何关联到Spring Cloud 和Kubernetes 平台。
能够看到:
综上对比,K8s 遵循了微服务架构的基本核心要素,虽然在一些功能上有所欠缺,但不能否认,K8s 帮助补足了使用Spring Cloud 所缺失的一部分。
Choerodon 经过使用 Spring Cloud + Kubernetes 的模式,帮咱们可以很容易的构建和部署微服务架构。可是在线上管理整个微服务体系的时候,仍然面临着一些难点。
一直以来都存在一个谬误,那就是在分布式系统中网络是可靠的。实际上网络是不可靠的,也是不安全的,微服务中大部分的故障都是出如今服务通讯中。
K8s 帮咱们实现了微服务的部署,但服务的网络调用、限流、熔断和监控这些问题,依旧让开发和运维人员都十分头痛。如何保证应用调用和事务的安全性与可靠性?Service Mesh 由此应运而生。
在过去几个月里,Service Mesh是行业内毋庸置疑的焦点。Service Mesh 译做“服务网格”或“服务栅格”,做为服务间通讯的基础设施层。Service Mesh 是一种模式,而非技术。Buoyant 公司的 CEO Willian Morgan 在他的文章《WHAT’S A SERVICE MESH? AND WHY DO I NEED ONE?》中解释了什么是 Service Mesh。
A service mesh is a dedicated infrastructure layer for handling service-to-service communication It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.*
Service Mesh 本质上是一个轻量级的网络代理,比如应用程序或者说微服务间的 TCP/IP。
对于开发人员而言,在编写应用的时候无需关心网络这一层,使得服务回归到本质,专一于业务功能,服务中的交互则交给Service Mesh。Service Mesh 为服务提供了一个视图,提升了追踪能力,并提供了添加跟踪而不触及全部应用的能力,也就是所谓的Service Mesh 代码无侵入和透明性,可以帮助团队更好地管理服务。
Service Mesh 架构图:
能够看到,Service Mesh 经过一种Sidecar的模式。给每个微服务实例部署一个Sidecar Proxy。该Sidecar Proxy 负责接管对应服务的入流量和出流量,并将微服务架构中的服务订阅、服务发现、熔断、限流、降级、 分布式跟踪等功能从服务中抽离到该Proxy 中。
Sidecar 以一个独立的进程启动,能够每台宿主机共用同一个Sidecar 进程,也能够每一个应用独占一个Sidecar 进程。全部的服务治理功能,都由Sidecar 接管,应用的对外访问仅须要访问Sidecar 便可。当该Sidecar 在微服务中大量部署时,这些Sidecar 节点天然就造成了一个服务网格。
经过控制面组件对这些服务网格进行管理,这样也就提供了一种对于微服务进行高效而统一的管理方式。集中化的控制面板,同时仍然具备为所欲为的敏捷性和基于云的应用开发。这一特性,使得Service Mesh 成为大势所趋。
回顾微服务结构发展的这几年,微服务架构的逐渐普及,容器技术的兴起,云原生的趋势,微服务技术生态在不断地变化中,容器、Cloud Native、Serverless、Service Mesh,Knative 等新技术新理念你方唱罢我登场,使得整个以微服务为核心的生态愈来愈完善成熟。
像在前文中提到的Kubernetes、Service Mesh等都是解决微服务架构自己系统范围的问题,扎实可靠的基础框架,有利于后续的开发,这也是产品研发、系统实施的关键第一步。
除了系统自己的技术栈,工程落地实施是另外一个要解决的问题。不少产品开始开发的时候,都不太注意规范化,待产品需求愈来愈复杂,人员愈来愈多时,整个项目会变得很难维护,甚至会影响产品的持续迭代。特别是微服务技术体系的引入,这个问题会更加明显。因此若是项目一开始,就以工程化的思想去组织代码,以规范化的流程去作构建发布,会给后续的发展打下坚实的基础。微服务的工程落地实施是Choerodon猪齿鱼一直关注和实践的方向,经过整合DevOps工具链和引入落地敏捷实施的方法论,让微服务架构的工程落地变得容易,这也成了Choerodon的PaaS平台能力,在这就不作赘述,感兴趣的读者能够到Choerodon的官网了解。
Choerodon 猪齿鱼做为开源多云应用敏捷全链路技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境的一致性。平台经过提供精益敏捷、持续交付、容器环境、微服务、DevOps等能力来帮助组织团队来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
更加详细的内容,请参阅Release Notes和官网。
你们也能够经过如下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献:
欢迎加入Choerodon猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。
本篇文章出自 Choerodon猪齿鱼社区董凡。