软件 -》 开源 -》云
1.1 互联网架构变迁
1.1.1 互联网架构的核心问题
海量用户:
产品迅速迭代:敏捷的探知市场需求,快速的推陈出新。
7 * 24小时不间断服务:尽量缩短宕机时间。
流量突增:比如双11,促销,热点事件等。
业务组合复杂:
1.1.2 从集中式架构到分布式架构
传统的三层架构:
集中式架构分为标准的三层:数据访问层、服务层和web层。
服务层是核心,提供公开的API,也可以通过Web层提供API。
分布式架构、SOA和服务化:
垂直伸缩:集中式架构为了提升吞吐量,只能通过增加服务器的配置来提升处理能力。
水平伸缩:仅通过增加服务器的数量提升系统的吞吐量。
分布式系统的引入,解决了吞吐量的问题,但是也带来了额外的负担。
CAP定理: 分布式系统的一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance),三者不能兼有。
分区容忍性是必需的,所以要在一致性和可用性之间做选择。
SOA(面向服务架构)可以理解为:模块化开发 + 分布式计算。
分布式系统十分复杂,产生了大量的简化分布式开发的中间件和分布式数据库,服务化的架构设计理念被认同。
2011年,阿里开源的Dubbo框架是一个影响深远的分布式服务框架。
自动化运维:
分布式系统的手工运维产生瓶颈。催生了自动化运维工具(两种):
监控自动化工具:对服务的CPU、内存、磁盘I/O、网络I/O进行主动探测,并预警。
流程自动化工具:应用上线、部署等操作。
解放交付的DevOps:
DevOps的出现,开发和运维之间的鸿沟才渐渐消失。
1.1.3 从分布式架构到云原生架构
随着虚拟化技术的成熟和分布式架构的普及,用来部署、管理和运行应用的云平台被越来越多的提及。IaaS、PaaS、SaaS是云计算的三种
基本服务类型。容器的出现,使得原来基于虚拟机的云主机应用,彻底转变为更加灵活和轻量的“容器 + 编排调度”的云平台应用。
新纪元的分水岭-容器技术:
容器可以解决运行时环境不同的问题。Docker提供了可以将应用和依赖封装到一个可移植的容器的能力。Docker提供了集装箱式的封 装方式。
新纪元的编排与调度系统:
Kubernetes - docker编排工具。
架构设计的变革-微服务:
微服务的特点:
配置管理:集中式架构使用属性配置文件;微服务倾向于集中化的配置中心配置数据,而且要高可能,并且配置想及时生效,还能推送配置变更。
服务发现:
负载均衡:
弹性扩容:
分布式调用追踪:
日志中心:
自愈能力:
1.2 什么是云原生
Pivotal公司先后开源了云原生的Java开发框架Spring Boot和Spring Cloud。 随后,Google在2015年成立了CNCF(Cloud Native Computing Foundation)。
1.2.1 概述
云:一个提供资源的平台,云计算的本质是按需分配资源和弹性计算。
云原生应用:专门在云平台部署和运行而设计的应用。云原生应用的设计模式可以优化和改进传统应用模式,使得应用更加适合在云上运行
传统的应用可以部署和运行在云平台上,但是无法充分运用云平台的能力的。
让应用能利用云平台实现资源的按需分配和弹性伸缩,是云原生被重点关注的地方。
云原生:是一种设计模式,它要求云原生应用具备可用性和伸缩性,以及自动化部署和管理能力,可随处运行,并且能够通过持续集成、持续交付工具提升研发、测试与发布的效率。
1.2.2 云原生与十二要素
十二要素是云应用设计概念,他为构建流程标准化和高可移植的Saa应用提供了完善的方法论。
1 基准代码:同一应用,多次部署。
2 依赖:显示声明第三方依赖。
3 配置:配置存储到环境变量。
与配置文件相比,环境变量与语言和系统无关。
将配置存储在环境变量中能够方便的与Docker等基于容器的应用配合使用,也易于与K8s的ConfigMap配合使用。
4 后端服务:后端服务松耦合。
后端服务是指:应用所依赖的通过网络调用的远程服务:DB、缓存、消息中间件以及文件系统,不同后端服务之间的区别仅仅是 在于资源的URL不同。
松耦合:不改变任何代码、仅修改资源URL的情况下进行服务切换。
5 构建、发布、运行(Build、Release、Run)
严格分离构建阶段和运行阶段。禁止在运行阶段改动代码。
6 进程(Processes)
应用进程是无状态的。只有无状态的应用才能水平伸缩,从而利用云平台弹性伸缩的能力。
会话粘性:不推荐这种做法,会话数据应该保存至redis这样带有过期时间的缓存中。
7 端口绑定(Port Binding)
通过端口绑定对外发布服务。
8 并发(Concurrency)
能通过水平伸缩应用程序实现并发。
9 已处理(Disposability)
可以快速启动和优雅关闭应用。
10 开发环境与线上环境等价
11 日志
使用事件流处理日志
12 管理进程
1.2.3 十二要素进阶
1 优先考虑API设计(API first)
2 通过遥测感知系统状态(elemetry)
3 认证和授权
OAuth2, RBAC
1.2.4 云原生与CNCF(Cloud Native Computing Foundation)
应用定义与开发层
1 数据库与数据分析
SOL、NoSQL、NewSQL、数据库中间层以及大数据处理(离线或准实时的计算大数据的技术栈中,如Hadoop,Spark,Druid等)。
hadoop:
Spark:
2 流式处理
包括消息中间件(RabbitMQ/kafka/ActiveMQ/RocketMQ)
以及流式实时计算框架(Flink,相对于Hadoop这样的离线计算体系,这类框架更加关注实时性):
3 软件配置管理
git已经成为行业标准了。
4 应用定义
Maven: 声明和管理项目的生命周期和应用依赖。
大量的第三方插件使得Maven的应用场景被无限扩大,比如,代码静态检查、代码风格评审、测试覆盖率计算。
5 持续集成/持续交付
工具是Jenkins
编排与治理层
1 调度与编排
k8s
2 分布式协调与服务发现
Zookeeper, Eureka
3 服务管理
Ribbon负责负载均衡
Istio
运行时层
1 云原生存储
指适合云服务的分布式文件存储系统,可以将云上运行的应用所需或产生的数据放入一个可以不依赖本地磁盘并且可以平滑扩容的高可靠文件系统。
HDFS, Ceph, ClusterFS.
2 容器
K8s采用Pod作为应用的最小单元,一个Pod内可以包含多个容器。
3 云原生网络
供应保障层
1 宿主机管理工具
Ansible: ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
2 基础设施自动化工具
Helm
3 容器仓库
4 镜像安全
云设施层
提供物理服务器的云厂商
观察与分析
对系统指标的监控、对链路调用的跟踪、对分布式日志的追踪、收集。
1 监控
Prometheus
2 日志
ELK
3 追踪
OpenTracing是调用链的一个标准协议。
平台