DevOps这个词已经出现很久了,并且在很多公司已经很好落地,真的实现快速并且可靠的交付。DevOps不仅是一种文化,解决从设计、开发、测试、上线、维护等各个环节的沟通问题,同样也需要一套工具支撑。对于DevOps的相关概念作用等内容在网上已经有很多,这里不在累述,这里主要讲的是DevOps与云上开发的关系或者说云上开发为什么需要DevOps。归纳为以下几点:
我不知道一开始2者是谁推动了谁,那是我现在我觉得2者是相互相成的。因此我们在云上开发,优先会考虑使用DevOps的开发机制,这样既能利用到云的特点,也能享受其带来的效率。
你一定听过RESTful,但你不要觉得它是一个很深很复杂的东西,简单理解就是提供规范化的API。提供规范化API其实就是屏蔽你内部系统的所有细节,对外提供统一的语言,这样做的好处显而易见,就是能让不同技术栈实现的东西相互之间调用和访问,说的简单一点就是服务化。服务化对于云上开发的重要性有以下2个原因:
那么服务化选择SOAP、RESTful或者GraphQL?这个仁者见仁智者见智,没有说一定的统一规范,但是我个人觉得RESTful是一个比较好的方案,理由如下:
无论你选择哪一种解决方案,但是是你开发的产品、系统、功能变成服务化,是一个云上开发的基本准则之一。
无状态其实在多线程、多进程、微服务或者分布式系统中都会提及到,并非什么新的内容。简单来说,无状态就是只关注输入内容,不存在程序状态,也就是无论什么时候一样的输入内容会得出一样的输出结果。那么这个与云上开发有什么关系:
因此总的来说,无状态的代码设计对于云上开发尤为重要,开发设计无状态程序,可以重复利用云的弹性,也保持迁移Serverless的可能性。
日志在第二章中已经详细说明了为什么要做一个统一集中的日志管理,这里要强调的是开发过程中,不能像我们以前那样在本地写日志那么简单,有更多的方案选择,因为如果写入本地,在云上有可能部署的是一个伸缩容器,一旦容器回收,日志则会被删除掉,因此需要参照第二章2.7.1中的方式,同时日志格式也是需要参照架构统一规范。
从部署上考虑,无论开发环境和生产环境都要尽量保持一致,那么配置化(如数据库、第三方api等配置)都会影响部署代码不一致,所以最好通过环境变量来读取配置中心的配置。从安全性考虑,将一些资源地址密钥放在部署包中是非常不安全的。在云上开发,都会提供安全性的配置管理中心。因此使用一个云上配置中心是非常有必要的。
是的,开头说了云上的开发设计模式跟我们平时的设计模式没有什么不一样,那么这里要讲的是利用平常的设计模式,在云上开发中某些关键点的使用。
我们知道适配器设计模式就是将某个类的接口转换成客户端期望的另一个接口表示,那么在云开发中,我们经常使用到云的SDK或者API,但是不同云厂商之间的SDK/API的规范有些不一致,对于我们的开发来说,如果程序需要运行于不同的云厂商,那么就需要每每适配一个SDK/API,因此在调用云厂商的SDK/API时,可以使用适配器模式,这样对于原先代码不需要做任何修改,只需要增加不同适配器以达到适配不同云厂商的效果
在云上的服务都是有一定的不可用性,或者说服务不可用是经常发生的事情,这个也是微服务的特点。那么为了保证我们服务不受其不可用影响或者降低其不可用对我们程序的影响,使用断路器模式在下游服务不可用时,可以做备用方案减少或者屏蔽其服务不可用带来的损失,同时还具备重试功能。
最终一致性是以一种比较低的代价实现一致性的方式,而云上开发使用BASE理论使用最终一致性是一种常见方式。最终一致性需要一个兜底的方案,那就是补偿机制,因此在开发中设计补偿机制是云上开发的一种必须考虑的设计模式。
事件源模式指的是系统中发生的事件会触发相应的事件处理器或监听器,从而实现特定的业务逻辑或功能。该设计模式最大好处就是解耦,并且能够化繁为简。在云上开发中经常会被使用,特别是Serverless开发基本上这是基本实现模式。
管道模式是将执行复杂处理的任务分解为一系列可重用的离散元素。通过允许独立地部署和扩展执行处理的任务元素,该模式可以提高性能、可伸缩性和可重用性。这样的模式在云上设计特别是复杂任务需要利用云的弹性以提高性能最适合不过,我们可以考虑比如数据计算、机器学习等方面使用。
Sidecar模式在ServiceMesh中被用得淋漓尽致,原因就是它能够将与业务无关却是业务需要的通用功能剥离出来,以边车的模式同业务一起运行。这样能解决与业务解耦,同时它本身的升级与业务模块升级也能分开,因此在云上开发也可以考虑使用这样的模式。
这里只是简单列举一些常见的模式,当然还存在很多其它云上设计模式,这些需要大家在上云过程中慢慢积累。
开发是一门细腻活,云上开发可以理解是一种基于不同环境不同机制下的新的开发方式,但是又不脱离原先的开发,只不过是在原先的开发基础上增加了其适配云上特点的特殊性,因此这方面还需要多加积累,这里只是阐述本人在云上开发的一些常见问题的经验。