精华内容
下载资源
问答
  • 本文是《网易容器云平台微服务化实践》系列文章的第一篇。Docker容器技术已经过了最早的喧嚣期,逐渐在各大公司和技术团队中应用。尽管以今天来看,大家从观念上已经逐渐认可 “将镜像定义为应用交付标准,将容器...
  • 自动化工程BIM GIS云平台微服务架构研究.pdf
  • 原生平台与微服务-杨乐.pdf
  • 本文是在云平台构建过程中的一些经验总结,主要说明了PaaS层的微服务架构设计和落地。 目标 降低系统的复杂度,减少系统的不确定性。 方法 量化,标准化,自动化。 规范 流程规范 工程创建流程 开发流程 源码管理...

    本文是在云平台构建过程中的一些经验总结,主要说明了PaaS层的微服务架构设计和落地。

    目标

    降低系统的复杂度,减少系统的不确定性。

    方法

    量化,标准化,自动化。

    规范

    流程规范

    • 工程创建流程
    • 开发流程
    • 源码管理流程
    • 测试流程
    • 发布流程

    设计规范

    • 微服务设计
    • 接口设计
    • 监控设计

    代码规范

    • 代码组织
    • 代码开发

    工具规范

    • 自动化开发工具
    • CI/CD工具
    • 单元测试工具
    • 代码质量管理工具
    • 自动化测试工具

    架构实践

    标准化业务层次

    梳理业务体系和服务能力,将PaaS平台分层。

    • 聚合领域服务能力的应用服务层
    • 提供基本数据访问能力的领域服务层

    1428428-20180716234212184-1828669833.png

    标准化治理方式

    统一使用标准化的微服务治理组件,规范微服务工程模板和领域模型。

    a, 治理组件
    • Registry: Eureka(服务发现)和Spring Cloud Config(统一配置);
    • UAA: User Accout and Authentication(统一身份验证);
    • Monitor:ELK(日志监控)。
    b, 工程模板
    • JHipster标准的工程模板
    • JHipster标准的领域模型

    1428428-20180717081401568-61059427.png

    标准化集成单元

    一个标准化集成单元包括应用网关,应用微服务,领域网关,领域微服务,数据库等。

    • 领域微服务(Domain Service)
    • 领域网关(Domain Gateway)
    • 应用微服务(Application Service)
    • 应用网关(Application Gateway)
    • 数据库(DB)

    1428428-20180717081414189-2131692351.png

    自动化标准工作

    • 通过自动化工具,自动生成标准化代码,提高开发效率和代码质量。具体实践可参考这里
    • 通过DevOps工具,代码提交后自动构建部署,实现开发和测试环境的自动化运维。具体实践可参考这里

    转载于:https://www.cnblogs.com/yorkwu/p/9290598.html

    展开全文
  • 为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构,这是一次很有趣的尝试。 一旦决定做微服务架构,有很多现实问题摆在面前,比如...

    此文已由作者冯常健授权网易云社区发布。

    欢迎访问网易云社区,了解更多网易技术产品运营经验。


     
    摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构,这是一次很有趣的尝试。
     
    一旦决定做微服务架构,有很多现实问题摆在面前,比如技术选型、业务拆分问题、高可用、服务通信、服务发现和治理、集群容错、配置管理、数据一致性问题、康威定律、分布式调用跟踪、CI/CD、微服务测试,以及调度和部署等等,这并非一些简单招数能够化解。实践微服务架构的方式有千万种,我们探索并实践了其中的一种可能性,希望可以给大家一个参考。本文是《网易容器云平台的微服务化实践》系列文章的第一篇。
     
    Docker 容器技术已经过了最早的喧嚣期,逐渐在各大公司和技术团队中应用。尽管以今天来看,大家从观念上已经逐渐认可 “将镜像定义为应用交付标准,将容器作为应用运行的标准环境” 的观点,但还是有相当一部分人在迷惑容器技术作为一个标准,应该怎么落地,怎样才能大规模线上应用,怎么玩才能真正解放生产力,促进软件交付效率和质量?答案其实在应用的架构当中。
     
    微服务架构不是因 Docker 容器技术而生,但确实是因容器技术而火。容器技术提供了一致性的分发手段和运行环境,使得只有微服务化后的应用架构,才能配合容器发挥其最大价值。而微服务化架构引入了很大的复杂性,只有应用容器化以及规模化的容器编排与调度才能避免运维效率下降。容器技术和微服务化架构之间本是一种相辅相成的互补关系。
     
    网易容器云平台的前身是网易应用自动部署平台 (OMAD),它能够利用 IaaS 云提供的基础设施,实现包括构建和部署一体化在内的整个应用生命周期管理。2014 年,以 Docker 为代表的容器技术进入大众视野,我们惊喜地发现,容器技术是自动部署平台从工具型应用进化为平台型应用过程中最重要的一块拼图。原本用户需要初始化主机,然后借助自动部署平台完成应用的构建和部署。引入容器技术之后,用户从功能开发到测试到一键部署上线,整个应用交付过程中不用关心主机初始化、主机间通信、实例调度等一系列应用之外的问题。这简直是信仰 DevOps 的人的福音。
     
    我们从 2015 年开始探索容器技术的最佳实践方式,从当初 “胖容器” 与容器集群的产品形态,到后来关于有状态和无状态服务的定义,以及如今的新计算与高性能计算,我们一直在思考并丰富着容器技术的应用场景。无论产品形态如何调整,容器云平台的核心概念一直是 “微服务”,通过微服务这一抽象提供高性能的容器集群管理方案,支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复、性能监测等功能,满足用户提升应用交付效率和快速响应业务变化的需求。网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,一方面检验容器云平台能不能支撑得起容器服务本身的微服务架构,另一方面通过微服务化实践经验反哺容器云平台产品设计,这是一次很有趣的尝试,也是我们分享容器云平台微服务化架构实践的初衷。
     
    在谈容器服务的微服务架构实践之前,有必要先把网易云容器服务大致做个介绍。目前网易云容器服务团队以 DevOps 的方式管理着30+微服务,每周构建部署次数 400+。网易云容器服务架构从逻辑上看由 4 个层次组成,从下到上分别是基础设施层、Docker 容器引擎层、Kubernetes (以下简称 K8S)容器编排层、DevOps 和自动化工具层:
     
    201805181652024b8b2ccf-8841-4876-ab25-0c07ef3a34e9.jpg
     
    容器云平台整体业务架构如下:
     
    20180518165214b4a44019-d57f-4ad9-a1e2-828288ab0966.jpg
     
    抛开容器服务具体业务不谈,仅从业务特征来说,可以分成以下多种类型(括号内为举例的微服务):
     
    ○ 面向终端用户 (OpenAPI 服务网关)、面向服务(裸机服务)
    ○ 同步通信(用户中心)、异步通信(构建服务)
    ○ 数据强一致需求(etcd 同步服务)、最终一致需求(资源回收服务)
    ○ 吞吐量敏感型(日志服务)、延时敏感型(实时服务)
    ○ CPU 计算密集型(签名认证中心)、网络 IO 密集型(镜像仓库)
    ○ 在线业务(Web 服务)、离线业务(镜像检查)
    ○ 批处理任务(计费日志推送)、定时任务(分布式定时任务)
    ○ 长连接(WebSocket 服务网关)、短连接(Hook 服务)
    ○ ……
     
    一旦决定做微服务架构,有很多现实问题摆在面前,比如技术选型、业务拆分问题、高可用、服务通信、服务发现和治理、集群容错、配置管理、数据一致性问题、康威定律、分布式调用跟踪、CI/CD、微服务测试,以及调度和部署等等……这并非一些简单招数能够化解。
     
    作为主要编程语言是 Java 的容器服务来说,选择 Spring Cloud 去搭配 K8S 是一个很自然的事情。Spring Cloud 和 K8S 都是很好的微服务开发和运行框架。从应用的生命周期角度来看,K8S 覆盖了更广的范围,特别像资源管理,应用编排、部署与调度等,Spring Cloud 则对此无能为力。从功能上看,两者存在一定程度的重叠,比如服务发现、负载均衡、配置管理、集群容错等方面,但两者解决问题的思路完全不同,Spring Cloud 面向的纯粹是开发者,开发者需要从代码级别考虑微服务架构的方方面面,而 K8S 面向的是 DevOps 人员,提供的是通用解决方案,它试图将微服务相关的问题都在平台层解决,对开发者屏蔽复杂性。举个简单的例子,关于服务发现,Spring Cloud 给出的是传统的带注册中心 Eureka 的解决方案,需要开发者维护 Eureka 服务器的同时,改造服务调用方与服务提供方代码以接入服务注册中心,开发者需关心基于 Eureka 实现服务发现的所有细节。而 K8S 提供的是一种去中心化方案,抽象了服务 (Service),通过 DNS+ClusterIP+iptables 解决服务暴露和发现问题,对服务提供方和服务调用方而言完全没有侵入。
     
    对于技术选型,我们有自己的考量,优先选择更稳定的方案,毕竟稳定性是云计算的生命线。我们并不是 “K8S 原教旨主义者”,对于前面提到的微服务架构的各要点,我们有选择基于 K8S 实现,比如服务发现、负载均衡、高可用、集群容错、调度与部署等。有选择使用 Spring Cloud 提供的方案,比如同步的服务间通信;也有结合两者的优势共同实现,比如服务的故障隔离和熔断;当然,也有基于一些成熟的第三方方案和自研系统实现,比如配置管理、日志采集、分布式调用跟踪、流控系统等。
     
    我们利用 K8S 管理微服务带来的最大改善体现在调度和部署效率上。以我们当前的情况来看,不同的服务要求部署在不同的机房和集群(联调环境、测试环境、预发布环境、生产环境等),有着不同需求的软硬件配置(内存、SSD、安全、海外访问加速等),这些需求已经较难通过传统的自动化工具实现。K8S 通过对 Node 主机进行 Label 化管理,我们只要指定服务属性 (Pod label),K8S 调度器根据 Pod 和 Node Label 的匹配关系,自动将服务部署到满足需求的 Node 主机上,简单而高效。内置滚动升级策略,配合健康检查 (liveness 和 readiness 探针)和 lifecycle hook 可以完成服务的不停服更新和回滚。此外,通过配置相关参数还可以实现服务的蓝绿部署和金丝雀部署。集群容错方面,K8S 通过副本控制器维持服务副本数 (replica),无论是服务实例故障(进程异常退出、oom-killed 等)还是 Node 主机故障(系统故障、硬件故障、网络故障等),服务副本数能够始终保持在固定数量。
     
    20180518165227157ce76f-2267-42a2-9594-da9e7986ddf0.jpg
     
    Docker 通过分层镜像创造性地解决了应用和运行环境的一致性问题,但是通常来讲,不同环境下的服务的配置是不一样的。配置的不同使得开发环境构建的镜像无法直接在测试环境使用,QA 在测试环境验证过的镜像无法直接部署到线上……导致每个环境的 Docker 镜像都要重新构建。解决这个问题的思路无非是将配置信息提取出来,以环境变量的方式在 Docker 容器启动时注入,K8S 也给出了 ConfigMap 这样的解决方案,但这种方式有一个问题,配置信息变更后无法实时生效。我们采用的是使用 Disconf 统一配置中心解决。配置统一托管后,从开发环境构建的容器镜像,可以直接提交到测试环境测试,QA 验证通过后,上到演练环境、预发布环境和生产环境。一方面避免了重复的应用打包和 Docker 镜像构建,另一方面真正实现了线上线下应用的一致性。
     
    Spring Cloud Hystrix 在我们的微服务治理中扮演了重要角色,我们对它做了二次开发,提供更灵活的故障隔离、降级和熔断策略,满足 API 网关等服务的特殊业务需求。进程内的故障隔离仅是服务治理的一方面,另一方面,在一个应用混部的主机上,应用间应该互相隔离,避免进程间互抢资源,影响业务 SLA。比如绝对要避免一个离线应用失控占用了大量 CPU,使得同主机的在线应用受影响。我们通过 K8S 限制了容器运行时的资源配额(以 CPU 和内存限制为主),实现了进程间的故障和异常隔离。K8S 提供的集群容错、高可用、进程隔离,配合 Spring Cloud Hystrix 提供的故障隔离和熔断,能够很好地实践 “Design for Failure” 设计哲学。
     
    服务拆分的好坏直接影响了实施微服务架构的收益大小。服务拆分的难点往往在于业务边界不清晰、历史遗留系统改造难、数据一致性问题、康威定律等。从我们经验来看,对于前两个问题解决思路是一样的:1)只拆有确定边界能独立的业务。2)服务拆分本质上是数据模型的拆分,上层应用经得起倒腾,底层数据模型经不起倒腾。对于边界模糊的业务,即使要拆,只拆应用不拆数据库。
     
    以下是我们从主工程里平滑拆出用户服务的示例步骤:
     
    20180518165236e84b707e-c033-46ab-813f-060fb2733989.jpg
     
    1.将用户相关的 UserService、UserDAO 分离出主工程,加上 UserController、UserDTO 等,形成用户服务,对外暴露 HTTP RESTful API。
    2.将主工程用户相关的 UserService 类替换成 UserFaçade 类,采用 Spring Cloud Feign 的注解,调用用户服务 API。
    3.主工程所有依赖 UserServce 接口的地方,改为依赖 UserFaçade 接口,平滑过渡。
     
    经过以上三个步骤, 用户服务独立成一个微服务,而整个系统代码的复杂性几乎没有增加。
     
    数据一致性问题在分布式系统中普遍存在,微服务架构下会将问题放大,这也从另一个角度说明合理拆分业务的重要性。我们碰到的大部分数据一致性场景都是可以接受最终一致的。“定时任务重试+幂等” 是解决这类问题的一把瑞士军刀,为此我们开发了一套独立于具体业务的 “分布式定时任务+可靠事件” 处理框架,将任何需保证数据最终一致的操作定义为一种事件,比如用户初始化、实例重建、资源回收、日志索引等业务场景。以用户初始化为例,注册一个用户后,必须对其进行初始化,初始化过程是一个耗时的异步操作,包含租户初始化、网络初始化、配额初始化等等,这需要协调不同的系统来完成。我们将初始化定义为一种 initTenant 事件,将 initTenant 事件及上下文存入可靠事件表,由分布式定时任务触发事件执行,执行成功后,清除该事件记录;如果执行失败,则定时任务系统会再次触发执行。对于某些实时性要求较高的场景,则可以先触发一次事件处理,再将事件存入可靠事件表。对于每个事件处理器来说,要在实现上确保支持幂等执行,实现幂等执行有多种方式,我们有用到布尔型状态位,有用到 UUID 做去重处理,也有用到基于版本号做 CAS。这里不展开说了。
     
    20180518165245ffb84cfa-31d4-44c4-ace9-a9e5fb1f4c62.jpg
     
    当业务边界与组织架构冲突时,从我们的实践经验来看,宁愿选择更加符合组织架构的服务拆分边界。这也是一种符合康威定律的做法。康威定律说,系统架构等同于组织的沟通结构。组织架构会在潜移默化中约束软件系统架构的形态。违背康威定律,非常容易出现系统设计盲区,出现 “两不管” 互相推脱的局面,我们在团队间、团队内都碰到过这种情况。
    nbsp;
    本文是《网易容器云平台的微服务化实践》系列文章的第一篇,介绍了容器技术和微服务架构的关系,我们做容器云平台的目的,以及简单介绍了网易云容器服务基于 Kubernetes 和 Spring Cloud 的微服务化实践经验。限于篇幅,有些微服务架构要点并未展开,比如服务通信、服务发现和治理、配置管理等话题;有些未提及,比如分布式调用跟踪、CI/CD、微服务测试等话题,这些方面的实践经验会在后续的系列文章中再做分享。实践微服务架构的方式有千万种,我们探索并实践了其中的一种可能性,希望可以给大家一个参考。  


    网易云计算基础服务深度整合了 IaaS、PaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台,点击可免费试用

    相关文章:
    【推荐】 Kubernetes Meetup杭州站:核心Maintainer、容器服务老司机带你刷新K8S技能库
    【推荐】 用户研究如何获取更为真实的用户信息

    展开全文
  • 普元技术选型方法论:技术/功能、项目运作模式、技术提供者的背景、生态环境
  • 原生与微服务

    2020-12-30 20:35:30
    面向微服务:明确服务间的依赖,互相解耦。 容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平...

    一、什么是云原生?

    CNCF(Cloud Native Computing Foundation)给出了云原生应用的三大特征:

    • 面向微服务:明确服务间的依赖,互相解耦。
    • 容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
    • 动态管理:通过集中式的编排调度系统来动态的管理和调度。

    所以,到底什么是云原生?云原生从字面意思上来看可以分成原生两个部分。

    云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS、PaaS和SaaS。

    原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。

    云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务软件。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。

    这边引用网上关于云原生所需要的能力和特征总结,如下图:
    在这里插入图片描述

    微服务:

    微服务解决的是我们软件开发中一直追求的低耦合+高内聚,其本质是讲一款应用软件切分成若干个小服务,这些小服务独立也能运行,且互不影响。

    DevOps:

    DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

    持续交付:

    持续交付(Continuous delivery,缩写为 CD),是一种软件工程手法,让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状况。它的目标在于让软件的构建、测试与发布变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。

    容器化

    在了解容器化之前,我们要了解什么是虚拟化技术?

    简单来讲,虚拟化就是一种将一台计算机虚拟成多台逻辑计算机,在同一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可以安装不同的操作系统,并且这些操作系统上的应用程序可以在相互独立的空间内运行且互不影响,从而显著提高计算机资源利用效率和计算机工作效率。

    那么什么是容器化呢?

    容器化是应用程序级别的虚拟化,允许单个内核上有多个独立的用户空间实例,这些实例称为容器。

    容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容器共享一个内核(操作系统),它安装在硬件上。

    容器的好处:

    • 轻便
      容器占用的服务器空间比虚拟机少,通常只需几秒钟即可启动。
    • 弹性
      容器具有高弹性,不需要分配给定数量的资源。这意味着容器能够更有效地动态使用服务器中的资源。当一个容器上的需求减少时,释放额外的资源供其他容器使用。
    • 密度
      密度是指一次可以运行单个物理服务器的对象数。容器化允许创建密集的环境,其中主机服务器的资源被充分利用但不被过度利用。与传统虚拟化相比,容器化允许更密集的环境容器不需要托管自己的操作系统。
    • 性能
      当资源压力很大时,应用程序的性能远远高于使用虚拟机管理程序的容器。因为使用传统的虚拟化,客户操作系统还必须满足其自身的内存需求,从主机上获取宝贵的RAM。
    • 维护效率
      只有一个操作系统内核,操作系统级别的更新或补丁只需要执行一次,以使更改在所有容器中生效。这使得服务器的操作和维护更加高效。

    CNCF Landscape路线图

    CNCF Landscape最重要的产出包括一个路线图和一个全景图。路线图(Trail Map)是CNCF对云原生用户使用开源项目以及云原生技术的推荐过程。在路线图的每个步骤中,用户都可以选择供应商支持的产品或自己动手使用开源项目。

    在这里插入图片描述

    整个路线图分成了十个步骤,每个步骤都是用户或平台开发者将云原生技术在实际环境中落地时,需要循序渐进思考和处理的问题:

    • 1.容器化。目前最流行的容器化技术是Docker,你可以将任意大小的应用程序和依赖项,甚至在模拟器上运行的一些程序,都进行容器化。随着时间的推移,你还可以对应用程序进行分割,并将未来的功能编写为微服务。

    • 2.CI/CD(持续集成和持续发布)。创建CI/CD环境,从而使源代码上的任意修改,都能够自动通过容器进行编译、测试,并被部署到预生产甚至生产环境中。

    • 3.应用编排。Kubernetes是目前市场上应用编排领域被最广泛应用的工具,Helm Charts可以用来帮助应用开发和发布者用于升级Kubernetes上运行的应用。

    • 4.监控和分析。在这一步中,用户需要为平台选择监控、日志以及跟踪的相关工具,例如将Prometheus用于监控、Fluentd用于日志、Jaeger用于整个应用调用链的跟踪。

    • 5.服务代理、发现和治理。CoreDNS、Envoy和LInkerd可以分别用于服务发现和服务治理,提供服务的健康检查、请求路由、和负载均衡等功能。

    • 6.网络。Calico、Flannel以及Weave Net等软件用于提供更灵活的网络功能。

    • 7.分布式数据库和存储。分布式数据库可以提供更好的弹性和伸缩性能,但同时需要专业的容器存储予以支持。

    • 8.流和消息处理。当应用需要比JSON-REST这个模式更高的性能时,可以考虑使用gRPC或者NATS。gRPC是一个通用的RPC(远程调用)框架(类似各种框架中的RPC调用),NATS是一个发布/订阅和负载均衡的消息队列系统。

    • 9.容器镜像库和运行环境。Harbor是目前最受欢迎的容器镜像库,同时,你也可以选择使用不同的容器运行环境用于运行容器程序。

    • 10.软件发布。最后可以借助Notary等软件用于软件的安全发布。

    二、什么是微服务?

    网上关于微服务的定义有许多,这里找出作者认为好理解的定义:

    • 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。
    • 每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。
    • 每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。
    • 另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下 文,选择合适的语言、工具对其进行构建。

    微服务的特点:

    1、多微才够微

    微服务架构通过对特定业务领域的分析与建模,将复杂的应用分解成小而专一、耦合度低并且高度自治的一组服务,每个服务都是很小的应用。

    微服务的「」并不是一个真正可衡量、看得见、摸得着的微。这个「」所表达的,是一种设计思想和指导方针,是需要团队或者组织共同努力找到一个平衡点。所以,微服务到底有多微,是个仁者见仁,智者见智的问题,最重要的是团队觉得合适。但注意,如果达成「团队觉得合适」的结论,至少还应遵循以下两个基本前提:

    • 业务独立性:首先,应保证微服务是具有业务独立性的单元,并不能只是为了微而微;
    • 团队自主性:其次,考虑到团队的沟通及协作成本,一般不建议超过10人。当团队超过10人,在沟通,协作上所耗费的成本会显著增加,这也是大部分敏捷实践里提倡的。

    2、单一职责

    所谓高内聚,是一个模块内各个元素彼此结合的紧密程度高。低耦合,是指对于一个完整的系统,模块与模块之间,尽可能独立存在。

    在面向对象的设计中,更是有放之四海而皆准的「SOLID原则」。SOLID 原则中的 S 表示的是 SRP(Single Responsibility Principle,单一职责原则):即一个对象应该只有一个发生变化的原因,如果一个对象可被多个原因改变,那么就说明这个对象承担了多个职责。

    对于每个服务而言,我们希望它处理的业务逻辑能够单一,在服务架构层面遵循单一职责原则。也就是说,微服务架构中的每个服务,都是具有业务逻辑的,符合高内聚、低耦合原则以及单一职责原则的单元,不同的服务通过「管道」的方式灵活组合,从而构建出庞大的系统。

    3、轻量级通信

    服务之间应通过轻量级的通信机制,实现彼此之间的互通互联,互相协作。所谓轻量级通信机制,通常指语言无关、平台无关的交互方式。

    对于轻量级通信格式而言,我们熟悉的 XML 或者 JSON ,它们的解析和使用基本与语言无关、平台无关。对于轻量级通信协议而言,通常基于HTTP,能让服务间的通信变得标准化并且无状态化。 REST(Representational State Transfer,表现层状态转化),是实现服务之间互相协作的轻量级通信机制之一。

    对于微服务而言通过使用语言无关、平台无关的轻量级通信机制,使服务与服务之间的协作变得更加标准化,也就意味着在保持服务外部通信机制轻量级的情况下,团队可以选择更适合的语言、工具或者平台来开发服务本身。

    4、独立性

    独立性是指在应用的交付过程中,开发、测试以及部署的独立。

    在传统的单体架构应用中,所有功能都存在于同一个代码库中。当修改了代码库中的某个功能,很容易出现功能之间相互影响的情况。尤其是随着代码量、功能的不断增加,风险也会逐渐增加。

    除此之外,当多个特性被不同小组实现完毕,需要经过集成、回归测试,团队才有足够的信心,保证功能相互配合、正常工作并且互不影响。因此,测试过程不是一个独立的过程。

    当所有测试验证完毕,单体架构应用将被构建成一个部署包,并标记相应的版本。在部署过程中,单体架构部署包将被部署到生产环境,如果其中某个特性存在缺陷,则有可能导致整个部署过程的失败或回滚。、

    单体应用开发、测试、构建、部署流程图如下:
    在这里插入图片描述

    在微服务架构中,每个服务都是一个独立的业务单元,当对某个服务进行改变时,对其他的服务不会产生影响。换句话说,服务和服务之间是独立的。对于每个服务,都有独立的代码库。当对当前服务的代码进行修改后,并不会影响其他服务。从代码库的层面而言,服务与服务是隔离的。

    对于每个服务,都有独立的测试机制,并不担心破坏其他功能而需要建立大范围的回归测试。由于构建包是独立的,部署流程也就能够独立,因此服务能够运行在不同的进程中。

    微服务开发、测试、构建、部署流程图如下:
    在这里插入图片描述

    5、进程隔离

    所有功能运行在同一个进程中,也就意味着,当对应用进行部署时,必须停掉当前正在运行的应用,部署完成后,再重新启动进程,无法做到独立部署。如果当前某应用中包含定时任务的功能,则要考虑在什么时间窗口适合部署,是否先停掉消息队列或者切断与数据源的联系,以防止数据被读入应用程序内存,但还未处理完,应用就被停止而导致的数据不一致性。

    为了提高代码的重用以及可维护性,在应用开发中,我们有时也会将重复的代码提取出来,封装成组件(比如 PHP 中的 Composer 扩展包)。在传统的单体架构应用中,当应用程序在运行期时,所有的组件最终也会被加载到同一个进程中运行。

    在微服务架构中,应用程序由多个服务组成,每个服务都是一个具有高度自治的独立业务实体。通常情况下,每个服务都能运行在一个独立的操作系统进程中,这就意味着不同的服务能非常容易的被部署到不同的主机上。作为运行微服务的环境,我们希望它能够保持高度自治性和隔离型。如果多个服务运行在同一个服务器节点上,虽然省去了节点的开销,但是增加了部署和扩展的复杂度。

    总而言之,微服务架构其实是将单一的应用程序划分成一组小的服务,每个服务都是具有业务属性的独立单元,同时能够被独立开发、独立运行、独立测试以及独立部署。

    微服务架构总体设计

    在这里插入图片描述
    首先服务提供者(用户、商品等微服务子模块)按照指定格式的服务接口描述,向注册中心注册服务,声明自己能够提供哪些服务以及服务的地址是什么,完成服务发布。

    接下来服务消费者(API 网关层或者相邻的其它微服务模块)请求注册中心,查询所需要调用服务的地址,然后以约定的通信协议向服务提供者发起请求,得到请求结果后再按照约定的协议解析结果。

    在服务调用过程中,服务的请求耗时、调用量以及成功率等指标都会被记录下来用作监控,调用经过的链路信息会被记录下来,用于故障定位和问题追踪。在这期间,如果调用失败,可以通过重试等服务治理手段来保证成功率。

    所以总结起来,微服务架构下,服务调用主要依赖下面几个基本组件:

    • 注册中心:注册并维护远程服务及服务提供者的地址,供服务消费者发现和调用,为保证可用性,通常基于分布式 kv 存储器来实现,比如 zookeeper、etcd 等;
    • 服务框架:用于实现微服务的 RPC 框架,包含服务接口描述及实现方案、向注册中心发布服务等功能,常见的 RPC 框架包括 Spring Cloud、Dubbo、gRPC、 Thrift、go-micro 等;
    • 服务网关:介于客户端与微服务之间的网关层,可以理解为「门卫」的角色,以确保服务提供者对客户端的透明,这一层可以进行反向路由、安全认证、灰度发布、日志监控等前置动作;
    • 服务监控:对服务消费者与提供者之间的调用情况进行监控和数据展示;
    • 服务追踪:记录对每个请求的微服务调用完整链路,以便进行问题定位和故障分析;
    • 服务治理:服务治理就是通过一系列的手段来保证在各种意外情况下,服务调用仍然能够正常进行,这些手段包括熔断、隔离、限流、降级、负载均衡等。
    • 基础设施:分布式消息队列、日志存储、数据库、缓存、文件服务器、搜索集群等,用以提供服务底层的基础数据服务,可以自建,也可以使用阿里云等公有云提供的服务。

    此外,从微服务部署角度来说,我们通常会基于容器编排技术实现微服务的运维。

    微服务的优缺点:

    对比点微服务架构单体架构结论
    上手难度API接口调用数据库共享或者本地程序调用单体架构胜
    开发效率早期设计和沟通的工作量加大,随着项目规模和时间的推移,效率变化不大早期工作量小,随着项目规模和时间的推移,效率大幅度下降对于简单项目单体架构胜,对于复杂项目微服务架构胜
    系统设计(高内聚低耦合)每个业务单独包装成一个微服务,数据和代码都从物理上隔离开来,实现高内聚低耦合相对容易以包的形式对代码进行模块划分,控制得当即可实现高内聚。但最终都是在数据层面将整个系统耦合在一起微服务架构胜
    系统设计(扩展性)独立开发新模块,通过 API 与现有模块交互在现有系统上修改,与现存业务逻辑高度耦合微服务架构胜
    需求变更响应速度各个微服务组件独立变更,容易实施敏捷开发方法需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败微服务架构胜
    系统升级效率各个微服务组件独立升级,上手和开发效率高,影响面小需要了解整个系统才可以正确修改,容易导致不相关模块的意外失败微服务架构胜
    运维效率大系统被拆分为多个小系统,部署和运维难度加大,但可以利用 DevOps 等方式将运维工作自动化简单直接单体架构胜
    代码复用性微服务组件可以在新项目中直接复用,包括前端页面一般以共享库的形式复用后台代码微服务架构胜
    硬件需求按需为不同业务模块伸缩资源节点,一个系统需部署多个微服务,需要启动多个运行容器整个系统只需要一个运行容器,为整个系统分配资源对于简单项目单体架构胜,对于复杂项目微服务架构胜
    项目成本项目早期和后期,成本变化曲线平缓项目早期成本低,后期成本大对于简单系统单体架构胜,对于复杂系统微服务架构胜
    非功能需求为单独的微服务按需调优,甚至更换实现方式和程序语言为整个系统调优,牵一发而动全身微服务架构胜
    职责、成就感拥有明确的职责划分,主人翁意识和成就感加强,容易形成自组织型团队职责不明确,容易产生扯皮行为微服务架构胜
    风险大系统被拆分为小系统,风险可被控制在小系统内,但也引入了各小系统之间的交互风险系统是一个整体,一荣俱荣,一损俱损微服务架构胜

    对于简单项目来说,单体架构 5 胜 8 败,优势主要体现在开发效率、上手难度、运维效率、硬件需求、项目成本;对于复杂项目来说,微服务架构 11 胜 2败,优势主要体现在硬件需求、项目成本、开发效率、系统设计时的高内聚低耦合和可扩展性、需求变更响应速度、系统升级效率、代码复用性、非功能需求、职责/成就感、风险的可控性。

    所以对于小型简单系统来说,使用单体架构更合适,对于大型复杂系统来说,使用微服务架构更合适,但是尽管如此,微服务也不是银弹,它也为系统引入了新的问题比如提高了系统的复杂度,这也导致了开发人员上手难度增加,需要在理解分布式系统设计的基础上才能更好的开发和维护微服务,再就是分布式服务的调用问题,服务的注册和发现、服务之间的分布式事务问题,数据库拆分之后数据报表的处理,数据库查询的复杂度增加,服务之间分布式一致性的问题,此外也为系统运维和管理增加了复杂度,这都是我们在进行微服务架构时要做好的心里准备和技术储备。

    展开全文
  • 广电网络云平台微服务架构设计.pdf
  • 本人在学习原生与微服务架构中的总结资料,参考书籍《Go语言高并发与微服务实战》 仅以此文记录学习过程。 原生架构之前(即传统飞云原生应用),底层平台负责向上提供运行资源,而应用需要满足业务需求和非...

    在这里插入图片描述

    Hello,我是普通Gopher,00后男孩,极致的共享主义者,想要成为一个终身学习者。专注于做最通俗易懂的计算机基础知识类公众号。每天推送Golang技术干货,内容起于K8S而不止于K8S,涉及Docker、微服务、DevOps、数据库、虚拟化等云计算内容及SRE经验总结
    =======================
    初次见面,我为你准备了100G学习大礼包:
    1、《百余本最新计算机电子图书》
    2、《30G Golang学习视频》
    3、《20G Java学习视频》
    4、《90G Liunx高级学习视频》
    5、《10G 算法(含蓝桥杯真题)学习视频》
    6、《英语四级,周杰伦歌曲免费送!》
    路过麻烦动动小手,点个关注,持续更新技术文章与资料!
    本人在学习云原生与微服务架构中的总结资料,参考书籍《Go语言高并发与微服务实战》
    仅以此文记录学习过程。
    云原生架构之前(即传统飞云原生应用),底层平台负责向上提供运行资源,而应用需要满足业务需求和非业务需求。为了更好地使代码复用,通用性好的非业务需求的实现,往往会以类库和开发框架的方式提供。在SoA、 微服务时代,部分功能会以后端服务的方式存在,在应用中被简化为对其客户端的调用代码,然后应用将这些功能连同自身的业务实现代码一起打包。而云的出现,可以在提供各种资源之外,还提供各种能力(如基础设施,以及基础设施的中间件等),从而帮助应用,使得应用可以专注于业务需求的实现。随着云原生技术理念在行业内进一步实践发展,云原生架构完成了IT架构在云计算时代的进化升级。以CI/CD、DevOps和微服务架构为代表的云原生技术,以其高效稳定、快速响应的特点引领企业的业务发展,帮助企业构建更加适用于云上的应用服务。对企业而言,新旧IT架构的转型与企业数字化的迫切需求也为云原生技术提供了很好的契机,云原生技术在行业的应用持续深化。

    1.1 云计算的历史

    云计算的发展分为三个阶段:虚拟化的出现、虚拟化在云计算中的应用以及容器化的出现。云计算目前在高速发展。

    1.1.1 云计算的基础:虚拟化技术

    云计算的历史事实上需要追溯到60多年前的计算机远古历史:
    在这里插入图片描述

    1955年,John McCarthy(备注:John McCarthy是Artificial Intelligence/人工智能一词的提出者)创造了一种在用户群中共享计算时间的理论。

    1959年6月,在国际信息处理大会上克里斯托弗Christopher Strachey发表了《Time Sharing in Large Fast Computer》论文,提出了虚拟化概念。该文被公认为虚拟化技术的最早论述。

    1965年8月,IBM推出System/360 Model 67 和 TSS 分时共享系统(Time Sharing System),通过虚拟机监视器(Virtual Machine Monitor)虚拟所有的硬件接口,允许多个用户共享同一高性能计算设备的使用时间,也就是最原始的虚拟机技术。

    在20世纪60年代中期,美国计算机科学家 JCR Licklider 提出计算机互联系统(an interconnected system of computers)的想法。

    1969年,在 JCR Licklider 的革命性创意的帮助下,Bob Taylor 和 Larry Roberts 开发了互联网的前身 ARPANET(Advanced Research Projects Agency Network),允许不同物理位置的计算机进行网络连接和资源共享。

    1972年,IBM发布了名为VM(Virtual Machine)的操作系统。在90年代,虚拟机的使用开始流行

    1974年,Popek和Goldberg发表了《Formal Requirements for Virtualizable Third Generation Architectures》提出了虚拟化准备的充分条件,指出满足条件的控制程序可以被称为虚拟机监视器Virtual Machine Monitor (VMM):(1)一致性:一个运行于虚拟机上的程序,其行为应当与直接运行于物理机上的行为基本一致,只允许有细微的差异如系统时间方面;(2)可控性:VMM对系统资源有完全的控制能力和管理权限;(3)高效性:绝大部分的虚拟机指令应当由硬件直接执行而无需VMM的参与。

    1978年,IBM获得了独立磁盘冗余阵列(Redundant Arrays of Independent Disks,RAID)概念的专利。该专利将物理设备组合为池,然后从池中切出一组逻辑单元号(Logical Unit Number,LUN)并将其提供给主机使用。虽然该技术直到1988年IBM才与加利福尼亚州立大学伯克利分校联合开发了第一个实用版本,但该专利第1次将虚拟化技术引入存储之中。

    “Time-Sharing”的背景:自20世纪50年代,人类使用大型计算机系统来处理数据。而在早期,大型计算机体积庞大而且价格高昂。为了提高投资回报率,购买大型机的组织开始实施“分时调度(time-sharing)”,然后从没有处理能力的终端访问大型计算机。“分时”理论可以充分利用可用的计算时间,可以用于为无力购买自己的大型机的小公司提供计算时间。

    这里便陆续出现了云计算的基本前提:共享计算能力和共享网络,并出现了虚拟机,虚拟网络和早期基础设施。

    但是在2000年前后虚拟化技术成熟之前,市场处于物理机时代。当时如果要启用一个新的应用,需要购买一台或者一个机架的新服务器。

    1.1.2 虚拟化技术成熟

    在2000年前后,虚拟化技术逐渐发展成熟:

    在这里插入图片描述

    1998年,VMware成立并首次引入X86的虚拟技术,通过运行在Windows NT上的VMware来启动Windows 95。

    1999年,VMWare推出可在X86平台上流畅运行的第一款VMware Workstation,从此虚拟化技术终于走下了大型机的神话。之后,研发人员和发烧友开始在普通PC和工作站上大量使用该虚拟化解决方案。

    1999年,IEEE颁布了用以标准化VLAN实现方案的802.1Q协议标准草案,从而可以将大型网络划分为多个小网络,使得广播和组播流量不会占据更多带宽的问题;同时,可以利用VLAN标签提供更高的网络段间的安全性。

    2000年,IEEE颁布了虚拟专用网(Virtual Private Network)VPN标准草案,从而使得私有网络可以跨公网进行建立。

    2000年,Citrix桌面虚拟化产品正式发布。

    2001年,VMware发布了第一个针对x86服务器的虚拟化产品ESX和GSX,即ESX-i的前身。

    2003年10月,Xen虚拟化项目首次面世推出了1.0版本,此时仅支持半虚拟化Para-Virtualization。之后,基于Xen虚拟化解决方案陆续被Redhat、Novell和Sun等的Linux发行版集成,作为默认的虚拟化解决方案。

    2003年,Microsoft收购Connectix获得虚拟化技术进入桌面虚拟化领域,之后很快推出了Virtual Server免费版。

    2005年,Xen 3.0发布,该版本可以在32位服务器上运行,同时该版本开始正式支持Intel的VT技术和IA64架构,从而使得Xen虚拟机可以运行完全没有修改的操作系统。该版本是Xen真正意义上可用的版本。

    2006年10月,以色列的创业公司Qumranet在完成了虚拟化Hypervisor基本功能、动态迁移以及主要的性能优化之后,正式对外宣布了KVM的诞生。同年10月,KVM模块的源代码被正式接纳进入Linux Kernel,成为内核源代码的一部分。备注:Qumranet在2008年被RedHat收购。

    2009年4月,VMware推出业界首款云操作系统VMware vSphere。

    云计算的重要里程碑之一是2001年VMWare带来的可用于X86的虚拟化计划。通过虚拟机,可以在同一台物理机器上运行多个虚拟机,这意味着可以降低服务器的数量,而且速度和弹性也远超物理机。

    1.1.3 基于虚拟机的云计算

    在虚拟化技术成熟之后,云计算市场才真正出现,此时基于虚拟机技术诞生了众多的云计算产品,也陆续出现了IaaS、PaaS等平台和公有云、私有云、混合云等形态:

    在这里插入图片描述

    2006年,AWS推出首批云产品Simple Storage Service (S3)和Elastic Compute Cloud(EC2),使企业可以利用AWS的基础设施构建自己的应用程序

    2008年4月,Google App Engine发布,是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。

    2009年,Heroku 推出第一款公有云 PaaS (Platform-as-a-Service)

    2010年1月,微软发布 Microsoft Azure云平台服务。备注:Microsoft Azure 于2008年宣布。

    2010年7月,Rackspace Hosting和NASA联合推出了一项名为OpenStack的开源云软件计划

    2011年,Pivotal推出了开源版PaaS Cloud Foundry,作为Heroku PaaS的开源替代品,并于2014年底推出了Cloud Foundry Foundation。

    2013年底,Google 推出 Google Compute Engine (GCE)正式版。备注:GCE的测试版本于2008年发布,预览版于2012年发布。

    2014年,AWS推出 Lambda,允许在AWS中运行代码而无需配置或管理服务器,即Faas/Serverless。
    在这期间,出现了云计算的多个重要里程碑:

    1. IaaS的出现:通过按时计费的方式租借服务器,将资本支出(Capex)转变为运营支出(Opex),这使得云计算得以大规模兴起和普及。
    2. PaaS的出现
    3. 开源IaaS的出现:云计算已经开始进入开源时代
    4. 开源PaaS的出现
    5. FaaS的出现

    补充术语介绍,Capex Vs. Opex:
    Capex = capital expenditure / 资本支出
    Opex = operational expenditure / 运营支出

    1.1.4 容器的兴起和编排大战

    2013年,在云计算领域发生了一件影响深广的技术变革:容器。

    容器技术可以说是过去十年间对软件开发行业改变最大的技术,而从虚拟机到容器,整个云计算市场发生了一次重大变革,甚至是洗牌。基于容器技术的容器编排市场,则经历了Mesos、Swarm、kubernetes三家的一场史诗大战,最终以kubernetes全面胜利而告终

    在这里插入图片描述

    2008年,LXC(Linux Container)容器发布,这是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。LXC是Docker最初使用的具体内核功能实现

    2013年,Docker发布,组合LXC,Union File System和cgroups等Linux技术创建容器化标准,docker风靡一时,container逐步替代VM,云计算进入容器时代

    2014年底,CoreOS正式发布了CoreOS的开源容器引擎Rocket(简称rkt)

    2014年10月,Google 开源 kubernetes,并在2015年捐赠给 CNCF

    2015年6月,OCI组织成立,旨在制定并维护容器镜像格式和容器运行时的正式规范,以便在不同的操作系统和平台之间移植

    2015年7月,Google联合Linux基金会成立了CNCF组织,kubernetes 成为 CNCF 管理的首个开源项目

    2015年,CNCF组织开始力推 Cloud Nativ ,完全基于开源软件技术栈,Cloud Native 的重要理念是:以微服务的方式部署应用,每个应用都打包为自己的容器并动态编排这些容器以优化资源利用

    2017年9月,Mesos宣布了对Kubernetes的支持

    2017年10月,Docker宣布将在下一版Docker,将同时支持自家调度引擎Swarm和来自Google的调度平台Kubernetes

    2018年3月,Kubernetes 从 CNCF 毕业,成为 CNCF 第一个毕业项目

    这里有两个重要的里程碑:

    1. 2013年,Docker发布,容器逐步替代VM,云计算进入容器时代
    2. 2017年底,Kubernetes 赢得容器编排的胜利,云计算进入 Kubernetes 时代
      在容器编排大战期间,以 kubernetes 为核心的CNCF Cloud Native生态系统也得以迅猛发展,云原生成为云计算市场的技术新热点。

    1.1.5云计算演进总结

    云计算的发展演进历史,有以下规律:

    • 核心构建块的变化:

    从早期的物理服务器,通过虚拟化技术演进为虚拟机,再摆脱机器的限制缩小为构建块,最后通过容器化技术演进为目前的container

    • 隔离单元:无论是启动时间还是单元大小,物理机、虚拟机、容器一路走来,实现了从重量级到轻量级的转变

    • 供应商:从闭源到开源,从单一供应商到跨越多个供应商

    下图形象的概述了这二十年云计算的演进过程:从传统预制IT、托管到云,以及云的不同形态如IaaS、PaaS、SaaS等。

    在这里插入图片描述

    对于XaaS的一路演进,可以简单归纳为:

    • 有了IaaS,客户不用关注物理机器
    • 有了PaaS,客户不用关注操作系统
    • 有了FaaS,客户不用关注应用程序

    在这过去的二十年间,云计算几乎重新定义了整个行业的格局,越来越多的企业开始降低对IT基础设施的直接资本投入,不再倾向于维护自建的数据中心,而是开始通过上云的方式来获取更强大的计算、存储能力,并实现按时按需付费。这不仅仅降低IT支出,同时也降低了整个行业的技术壁垒,使得更多的公司尤其是初创公司可以更快地实践业务想法并迅速推送到市场。

    1.2 云原生是什么

    云原生是云计算的下半场,是否上云已经很少被提及,因为它已经成为一个热门话题,渗透到各行各业。进入到2017年之后,云计算已经不再是“新兴行业”了,换句话说,对于企业用户来说,云云计算技术成为企业发展“战术”的一部分了。

    近几年,云原生火了起来,云元原生词已经被过度消费,很多软件都号称是云原生,云原生本身甚至不能称为是一种架构, 它首先是一种基础设施,运行在其上的应用称作云原生应用,只有符合云原生设计哲学的应用架构才叫云原生应用架构。在了解关于云历生的具体定义之前,我们首先介绍下云原生出现的背景和背后的诉求。

    1.2.1 云原生出现的背景

    移动互联网时代是业务高速发展的时期,不同于传统的应用,移动互联网提供了新的用户体验,即以移动端为中心,通过软件对各行各业的渗透和对世界的改变。移动互联网时代巨大的用户基数下快速变更和不断创新的需求对软件开发方式带来的巨大推动力,传统软件开发方式受到巨大挑战。面对业务的快速迭代,团队规模不断扩大降低沟通协作成本并加快产品的交付速度,为用户呈现更好的体验是各个互联网公司都在努力的方向。

    这样的背景下,微服务和云原生的概念开始流行。康威定律是微服务架构的理论基础组织沟通的方式会在系统设计上有所表达,通过服务的拆分,每个小团队服务一个服务,增加了内聚性,减少了频繁的开会,提高了沟通效率;快速交付意味着更新的频次也高了,更新也容易造成服务的故障问题,更新与高可用之间需要权衡。云原生通过工具和方法减少更新导致的故障问题,保证服务的高可用。

    企业在数字化转型中 普遍面临IT系统架构缺乏弹性,业务交付周期长,运维效率低,高可靠性低等痛点和挑战。将软件迁移到云上是应对这一挑战的 自然演化方式,在过去二十年间,从物理机到虚拟机到容器,从IaaS诞生到PaaS、SaaS、 Faas一路演进,应用的构建和部署变得越来越轻,越来越快,而底层基础设施和平台则越来越强大,以不同形态的云对,上层应用提供强力支撑。所以企业可以通过云原生的一系列技术,例如基于容器的敏捷基础设施、微服务架构等解决企业面临的这些IT痛点。

    1.2.2 云原生的定义

    自从云原生提出以来,云原生的定义就一直在持续地更新。这也说明了云原生的候念随着技术的发展而不断地被深刻认知。

    Pivotal是云原生应用的提出者,并推出了Pivotal Cloud Foundry 云原生应用平合有Spring开源Java开发框架,成为云原生应用架构中的先驱者和探路者。早在2015年,Pivotal公司的Matt Stine写了一本叫做(迁移到云原生应用架构》的小册子,其中探讨云原生应用架构的几个主要特征:符合12因素应用、面向微服务架构、敏捷架构、基于API的协作和抗脆弱性。而在Pivotal 的官方网站上,对云原生(Cloud Native)的介绍包括4个要点,包括: DevOps、 持续集成、微服务架构和容器化。
    在这里插入图片描述

    • DevOps
    • Continuous Delivery
    • Microservices
    • Containers
      2015年CNCF建立,开始围绕云原生的概念打造云原生生态体系,起初CNCF对云原生的定义包含以下三个方面:

    (1)应用容器化(software stack to be Containerized)
    (2)面向微服务架构(Microservices oriented)
    (3)应用支持容器的编排调度(Dynamically Orchestrated)

    云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化地交付业务软件。云原生由微服务架构,DevOps 和以容器为代表的敏捷基础架构组成。援引宋净超同学的一张图片来描述云原生所需要的能力与特征:

    在这里插入图片描述

    在2018年,随着社区对云原生理念的广泛认可和云原生生态的不断扩大,还有CNCF项目和会员的大量增加,起初的定义已经不再适用,因此CNCF对云原生进行了重新定位。

    2018年6月,CNCF正式对外公布了更新之后的云原生的定义(包含中文版本)v1.0版本:
    Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.
    云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
    These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
    这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。
    The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.

    云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

    新的定义中,继续保持原有的核心内容:容器和微服务,但是非常特别的将服务网格单独列出来,而不是将服务网格作为微服务的一个子项或者实现模式,体现了云原生中服务网格这一个新生技术的重要性。而不可变基础设施和声明式API这两个设计指导理念的加入,则强调了这两个概念对云原生架构的影响和对未来发展的指导作用。

    在这里插入图片描述

    可以通过访问 https://github.com/cncf/toc/blob/master/DEFINITION.md 查看。

    1.2.3 云原生定义之外

    从上面可以看到,云原生的内容和具体形式随着时间的推移一直在变化,即便是CNCF最新推出的云原生定义也非常明确的标注为v1.0,相信未来我们很有机会看到v1.1、v2版本。而且云原生这个词汇最近被过度使用,混有各种营销色彩,容易发生偏离。因此,云原生的定义是什么并不重要,关键还是云原生定义后面的理念、文化、技术、工具、组织结构和行为方式。

    Joe Beda,Heptio 的CTO,指出:

    There is no hard and fast definition for what Cloud Native means. In fact there are other overlapping terms and ideologies. At its root, Cloud Native is structuring teams, culture and technology to utilize automation and architectures to manage complexity and unlock velocity.
    Cloud Native并没有硬性和牢靠的定义。实际上,还有其他重叠的术语和意识形态。从根本上说,Cloud Native正在构建团队,文化和技术,以利用自动化和架构来管理复杂性和解锁速度。
    We are still at the beginning of this journey.
    我们还处在这个旅程的开始阶段。
    Christian Posta 指出:
    “Cloud native” is an adjective that describes the applications, architectures, platforms/infrastructure, and processes, that together make it economical to work in a way that allows us to improve our ability to quickly respond to change and reduce unpredictability. This includes things like services architectures, self-service infrastructure, automation, continuous integration/delivery pipelines, observability tools, freedom/responsibility to experiment, teams held to outcomes not output, etc.

    “云原生”是一个形容词,用于描述应用,结构,平台/基础设施和流程,这些共同促使我们以比较经济的工作方式来提高能力,实现快速响应变化和减少不可预测性。包括服务架构,自助服务基础设施,自动化,持续集成/交付管道,可观察性工具,实验的自由/责任,坚持结果而不是产出的团队等。

    1.2.4 云原生和12因素

    介绍

    12-Factors 经常被翻译为12因素,符合12因素的应用则称为12因素应用。

    背景

    Heroku(HeroKu于2009年推出公有云PaaS)于2012年提出12因素,告诉开发者如何利用云平台提供的便利来开发更具可靠性和扩展性、更加易于维护的云原生应用。

    为此还有一个专门的12因素网站: https://12factor.net/ ,以及这个网站内容的中文版本: https://12factor.net/zh_cn/ 。

    援引12因素网站的介绍内容:

    如今,软件通常会作为服务来交付,被称为web app,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论:

    • 使用声明式格式来搭建自动化,从而使新的开发者花费最少的学习成本加入这个项目
    • 和底层操作系统保持简洁的契约,在各个系统中提供最大的可移植性
    • 适合在现代的云平台上部署,避免对服务器和系统管理的额外需求
    • 最小化开发和生产之间的分歧,实现持续部署以实现最大灵活性
    • 可以在工具、架构和开发实践不发生重大变化的前提下实现扩展
    • 12因素理论适用于以任意语言编写,并使用任意后端服务(数据库、消息队列、缓存等)的应用程序。

    援引12因素网站的给出的12因素产生的背景:

    本文的贡献者参与过数以百计的应用程序的开发和部署,并通过 Heroku 平台间接见证了数十万应用程序的开发,运作以及扩展的过程。
    本文综合了我们关于 SaaS 应用几乎所有的经验和智慧,是开发此类应用的理想实践标准,并特别关注于应用程序如何保持良性成长,开发者之间如何进行有效的代码协作,以及如何 避免软件污染 。
    我们的初衷是分享在现代软件开发过程中发现的一些系统性问题,并加深对这些问题的认识。我们提供了讨论这些问题时所需的共享词汇,同时使用相关术语给出一套针对这些问题的广义解决方案。

    12因素的局限性

    12因素创作于2012年左右,SaaS平台非常具有指导意义

    12-factor为Web应用程序或SaaS平台的建立非常有用的指导原则,但它在有些地方并不适合微服务体系。

    在标准的12个要素以外,还存在哪些因素, 正如Kevin Hoffmann 最近在 O’Reilly 出版的书上提到了超越 12 个因素的应用。

    内容

    12因素具体内容为:

    Factor描述
    Codebase 基准代码One codebase tracked in revision control, many deploys 一份基准代码,多份部署
    Dependencies 依赖Explicitly declare and isolate dependencies 显式声明依赖关系
    Config 配置Store config in the environment 在环境中存储配置
    Backing services 后端服务Treat backing services as attached resources 把后端服务当作附加资源
    Build, release, run 构建,发布,运行Strictly separate build and run stages 严格分离构建和运行
    Processes 进程Execute the app as one or more stateless processes 以一个或多个无状态进程运行应用
    Port binding 端口绑定Export services via port binding 通过端口绑定提供服务
    Concurrency 并发Scale out via the process model 通过进程模型进行扩展
    Disposability 易处理Maximize robustness with fast startup and graceful shutdown 快速启动和优雅终止可最大化健壮性
    Dev/prod parity 开发环境与线上环境等价Keep development, staging, and production as similar as possible 尽可能的保持开发,预发布,线上环境相同
    Logs 日志Treat logs as event streams 把日志当作事件流
    Admin processes 管理进程Run admin/management tasks as one-off processes 后台管理任务当作一次性进程运行

    在这里插入图片描述

    12因素在云原生架构中的体现:
    在这里插入图片描述

    1.3 云原生的基础架构

    云原生是一系列云计算技术体系和企业管理方法的集合,既包含了实现应用云原生化的方法论,也包含了落地实践的关键技术。云原生应用利用微服务、服务网格、容器、DevOps和声明式API等代表性技术,来构建容错性好、易于管理和便于观察的松耦合系统。下面具体介绍这几个关键技术。

    1.3.1微服务

    为了解决单体的复杂度问题,我们引入微服务架构。在单体应用(也称为巨石应用)的时代,虽然开发简单,但随着业务复杂度的提升,单体应用的益处逐渐减少。它们变得更难理解,而且失去了敏捷性,因为开发人员很难快速理解和修改代码。

    对付复杂性的最好方法之一是将明确定义的功能分成更小的服务,并让每个服务独立迭代。微服务是指将大型复杂软件应用拆分成多个简单应用,每个简单应用描述着一个小业务,系统中的各个简单应用可被独立部署。各个微微服务之问是松耦合的,这样就可以独立地对每个服务进行升级、部署、扩展和重新启动等,从而实现频繁更新而不会对最终用户产生任何影响。相比传统的单体架构,微服务架构具有降低系统复杂度、独立部署、独立扩展和跨语言编程等优点。

    但是,从另一个角度来看,微服务架构的灵话、开发的敏捷也带来了运维的挑战和分布式系统的复杂性。单体应用可能只需部署至小片应用服务器集群, 而微服务架构则需要构建/测试/部署/运行数十个独立的服务,并可能需要支持多种语言和环境;微服务还引入了分布式系统的复杂性,如网络延迟、容错性、消息序列化、不可靠的网络、异步机制、版本化和差异化的工作负载等,开发人员需要考虑以上这些分布式系统问题。其他的问题,如微服务的可测试性、异步机制、调用链过长等,也需要在架构设计时考虑。

    1.3.2 容器

    为了解决微服务架构下大量应用部署的问题,我们引入容器,容器是一种轻量级的虚报化技术,能够在单一主机上提供多个隔离的操作系统环境, 通过系列的Namespace进行进程隔离,每个容器都有唯一的可写文件系统和资源配额, 容器技术分为运行时和编持两层,运行时负责容器的计算、存储、网络等,编排层负责容器集群的调度、服务发现和资源管理。

    容器服务提供高性能、 可伸缩的容器应用管理能力,容器化应用的生命周期管理可以提供多种应用发布方式。容器服务简化了容器管理集群的搭建工作,整合了调度、配置、存储、网络等,打造云端最佳容器运行环境。

    Docker是一个开源的应用容器引擎,使用容器技术,用户可以将微服务及其所需的所有配置、依赖关系和环境变量打包成容器镜像,轻松移植到全新的服务器节点上,而无得重新配置环境,这使得容器成为部署单个微服务的最理想工具。

    仅仅有容器还是不够的,因为人力运维部署成本太大,为了解决容器的管理和调度问题,又引入了Kubernetes. Kubernetes 是Google 开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容和维护等功能。

    我们用Kubernetes去管理Docker集群,可以将Docker看成Kubernetes内部使用的低级别组件。另外,Kubermetes 不仅仅支持Docker,还支持Rocket等其他容器技术。

    1.3.3 服务网格

    微服务技术架构实践中主要有侵入式架构和非侵入式架构两种实现形式。侵入式架构是指服务框架嵌入程序代码,开发者组合各种组件,如RPC、负载均衡、熔断等,实现微服务架构。非侵入式架构则是以代理的形式,与应用程序部署在一起,接管应用程序的网络且对其透明,开发者只需要关注自身业务即可,以服务网格为代表。为了解决微服务框架的侵入性问题,引入Service Mesh。

    Service Mesh 产品的存在和具体工作模式,对于运行于其上的云原生应用来说是透明无感知的,但是在运行时这些能力都动态赋能给了应用,从而帮助应用在轻量化的同时依然可以继续提供原有的功能。

    Service Mesh 使得系统架构的技术栈下移,降低了整个微服务入门的门槛,对于开发者更加友好。Service Mesh提供了一一个方案,就是将整个服务间通信的解决方式以及整个中间件层的技术栈全部下移。从应用当中下移到底层的基础设施,通过加强基础设施的方式提供一个统一的解决方案。

    Serice Mesh处理服务问请求响应的可靠传递,并可用于服务治理、遗留系统的零侵入接入以及异构框架开发的微服务。Service Mesh作为服务间通信的基础设施层,是应用程序间通信的中间层,实现了轻量级网络代理,对应用程序透明,解隅了应用程序的重试/超时、监控、追踪和服务发现。

    除此之外,Serice Mesh提供了专业化的解决方案,其中所涉及的服务通信、容错、认证等功能,都是专业度极高的领城,这些领城应该出现工业级成熟度的制成品,这对于中小企业来说是一个降低成本的选择。

    Service Mesh的开源软件包括Istio、Linkerd、 Envoy、 Dubbo Mesh等。同时,为了让Service Mesh有更好的底层支撑,我们又将Service Mesh运行在Kubernetes上,

    1.3.4 DevOps

    DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、术运营和质量保障(QA)部门之间的沟通、协作与整合。目前对DevOps 有太多的说法和定义,不过它们都有一个共同的思想:解决开发者与运维者之间曾经不可逾越的鸿沟,增强开发者与运维者之间的沟通和交流。

    DevOps的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。市场瞬息万变,同时机会转瞬即逝。互联网公司要实现生存,必须拥有快速试错和迭代产品的能力。那我们有没有办法快速交付价值、灵活响应变化呢?答案就是DevOps, 它是面向业务目标,助力业务成功的最佳实践。DevOps其实包含了三个部分:开发、测试和运维。

    在这里插入图片描述
    与敏捷一样,DevOps将软件程序分解成更小的部分,以提高软件交付速度和质量。DevOp的一个标志是“持续”实践包括持续集成、持续测试、持续交付和持续部署,所有这些都有助于软件产品和软件相关实践的持续改进.DevOps的目标是缩短开发周期,增加部署频率,更可靠的发布。用户可通过完整的工具链,深度集成代码仓库、制品仓库、项目管理、自动化测试等类别中的主流工具,实现零成本迁移,快速实践DevOps.DevOps帮助开发者和运维人员打造了一个全新空间,构建了一种通过持续交付实践去优化资源和扩展应用程序的新方式微服务使DevOps团队能够并行开发独立的功能片段,跨功能团队协作构建、测试、发布、监控和维护应用程序。DevOps 和云原生架构的结合能够实现精益产品开发流程,适应快速变化的市场,更好地服务企业的商业目的。

    1.4 总结

    本文从云原生的发展史开始介绍云计算、虚报化、容器化等技术,随后结合云原生出现的背景介绍云原生的定义。云原生的定义也在不断变化,总得说来,云原生可以理解为应用原生被设计为在云上以最佳方式运行,充分发挥云的优势。最后介绍了云原生架构中涉及到的几个关键技术。

    云原生应用可充分利用云平台服务优势,并快速构建部署到平台上,平台提供了简单快捷的扩展能力并与硬件解耦,提供了更大的灵活性、弹性和跨云环境的可移植性。云原生将云计算作为竞争优势,原生云意味着将云目标从IT成本节约转向业务增长引擎。

    参考链接:https://skyao.io/learning-cloudnative/microservice/

    展开全文
  • 本文以“为什么选择Kubernetes作为云平台微服务治理框架”为例,介绍普元在做与云平台相关的开源技术选型时的一些方法和经验。 点击此处观看原文- 【详解】为什么选择Kubernetes作为云平台微服务治理框架
  • 油田企业集成服务云平台微服务架构探索.pdf
  • 轨道交通工程BIM GIS云平台微服务架构研究.pdf
  • 基于DevOps的云平台微服务架构可靠性研究.pdf
  • 基于DevOps的云平台微服务架构可靠性分析.pdf
  • 什么是微服务,用MartinFowler的一段话:没有一个明确的定义,但简单来说是,以一组小型服务来构建成应用,每个服务运行在单一独立的进程,不同服务间采用轻量级的交互机制来通信,例如HTTP(REST API)。这些组成应用...
  • 其中核心部分summer-bean对象主要有IFormIService,两者结合可调整地实现微服务架构,同时保障系统功能弹性性能弹性: IForm ,定位于页面控制器,用于接收Web输入,以及输出IPage接口。其中IPage实现有:Jsp...
  • 微服务与K8S容器云平台架构微服务与12要素网络日志收集服务网关服务注册服务治理- java agent监控今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,团队建设 有参考...
  • 安达斯参加融合媒体制播云平台微服务模块边界规范及关键技术研究项目启动会.pdf
  • 声明式 API原生应用的特征:原生“12 因素”1. 方法论和核心思想2. 编码、部署和运维原则3. 具体内容小结参考 原生的基础架构 原生中既有指导原生开发的方法论,也包含实践的具体技术。上一篇文章中...
  • MicroserviceCloudPlatForm_introduction_3.0.pdf IBM微服务云平台从概念到实现
  • 这是一篇翻译自Thoughtwork上面的文章,对IT的未来发展有很好的分析,特别是关于平台与微服务两部分,   文章翻译自: https://www.thoughtworks.com/insights/blog/new-tech-industry-macro-trends   平台...
  • 正好这段时间我们在封闭研发我们的新一代数字化云平台(theplatform),借此机会和大家分享一下我们的总体设计及思路:theplatform是一款基于微服务架构的DevOps容器云平台,设计主体分成了三个步骤: 1.看问题:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,982
精华内容 19,192
关键字:

云平台与微服务