最近经常收到客户要求我们提供云原生的产品,那么什么是云原生呢?云原生软件有何特点?我们以前理解的将虚拟机在云上run起来,是否就是云原生的一种?我们不妨对照云原生软件三大特性进行对比,答案就不言而喻了。
云原生软件的特性:
特性一、你的软件要保持7*24小时可运行
这就要求你对基础设施故障和需求变更具有更好的弹性。这里有个案例,2015年9月20日亚马逊云计算平台经历了一次宕机事件,核心宕机持续了5个小时,Netflix、Airbnb、Nest、ImDb等大公司都经历了宕机,服务的客户受影响严重。也许你会觉得这是亚马逊的错,但实际上亚马逊不会为你的宕机事件负责。事后采访受影响最小的Netflix知道,他们业务恢复的快,是因为冗余(如下图)。Netflix将业务部署在多个区,而Imdb仅部署在us-east-1区,所以当us-east-1区出现宕机事故,Imdb的业务无法运行,而NETFLIX能够快速切换到其它区把业务重新拉起运行。
特性二:你要频繁发布你的软件版本,来增加用户的满意度和黏性
传统的软件开发还基于瀑布模式,一年一个大版本和一个小版本进行迭代,已经越来越不能适应先进快节奏的生活。要想支持更敏捷的发布模型,咱们的软件就需要更小、更松耦合、可独立部署和发布的组件。
特性三:随时随地,支持移动设备和物联网场景
物联网场景导致请求和数据量大幅波动,因此需要能够动态伸缩以及持续提供服务的软件。
如何构造云原生架构
那么我们该如何构造我们的云原生软件架构呢?在《云原生模式》这本书中,作者给我们提供了一个参考模型(如下图)。
云原生软件包含三个部分:
1)云原生应用程序-它由你编写的代码构成,实现软件的业务逻辑。在云中,通过部署多个应用程序实例来保证你的运维能力。可以水平伸缩和动态升级等。
2)云原生数据-这是云原生软件中存储状态的地方。上图中也明显的能看出与传统架构的区别。过去的架构通常使用一个集中的数据库存储用户配置、订单记录、付款信息等。而上图将数据库拆分成多个且是分布式部署。
3)云原生交互-是云原生应用程序和云原生数据的的组织。
云原生软件实战
这个实战也是来自《云原生模式》一书的案例,可以帮助我们很好理解云原生模型是如何运作的。
案例场景:假设你在某银行有一个账户,你偶尔区当地的分行办理业务,同时你也是该银行网上银行的注册用户。你换了电话号码,需要更新登记的电话号码。网上银行允许编辑自己的用户信息,登陆站点后,你被导航到”用户信息“页面,输入新的电话号码,然后单击”提交“按钮,随后收到修改完成的确认信息。体验戒烟结束。(下图是软件运作流程)
因为还没有登录,所以当你访问“用户信息”(User profile)应用程序时,它会将你重定向到“身份验证”(Auth)应用程序。注意,每个应用程序都部署了多个实例,所以用户请求会通过一个路由器被发送到其中一个实例。
■ 作为登录的一部分,身份验证应用程序会在一个有状态的服务中创建和存储一个新的“身份令牌”(Auth token)。
■ 系统使用新的身份验证令牌将用户重定向回“用户信息”(Userprofile)应用程序。这一次,路由器会将用户请求发送到“用户信息”(User profile)应用程序的另一个实例。[提醒:在云原生软件中不要使用黏性会话(sticky session)!]
■ “用户信息”(User profile)应用程序会通过调用“认证API”(Auth API)服务来验证身份令牌。同样,因为有多个实例,所以请求会被路由发送到其中一个实例。回想一下,有效的身份令牌会被存储在一个有状态的“身份令牌”(Auth token)服务中,不仅“身份验证”(Auth)应用程序可以访问,“认证API”(Auth API)服务的任何实例都可以访问。
■ 这些应用程序(“用户信息”和“身份验证”)的实例可能会由于各种原因而发生改变,因此必须有一个协议能够不断用新的IP地址来更新路由器。
■ “用户信息”(User profile)应用程序向“用户API”(User API)服务发出一个下游请求,来获取当前用户的个人信息数据,包括电话号码。然后,“用户信息”(User profile)应用程序会向用户的有状态服务发出一个请求。
■ 在用户更新了电话号码并单击了“提交”按钮之后,“用户信息”(User profile)应用程序会将新数据发送到一个“事件日志”(Event log)中。
■ 最后,“用户API”(User API)服务的一个实例会接收并处理这个更改事件,并向Users数据库发送一个写请求。
如果你再次来到银行柜台,你希望是你更新后的电话号码。但实际对银行来说,网上银行和柜员软件是两套不同的系统,这就需要分布式数据协调。
写在最后
《云原生模式》一书很好的阐释了云原生的概念,特性以及云原生模式如何生成的过程。后面我会再花一些时间介绍”在生产环境中运行云原生应用程序“,以解决我们每次交付升级带来的痛苦。
本文参考:《云原生模式》 (美) 科妮莉亚.戴维斯