在计算机发展的很多年里,从最开始的插件版到个人计算机出现后,人们都习惯把所有的功能放到一个程序里,比如:一块插件版、一个穿孔卡片、一个可执行文件等
随着用户需求越来越复杂,单体应用开始暴露一些问题:
- 灵活性差。因为包含的功能很多,单体应用体量很大,不同功能的边界模糊,设计、开发和测试工作量成倍增加,很难灵活响应用户需求
- 维护困难。一个小功能出问题可能导致整个应用崩溃,“千里之堤,溃于蚁穴”;一个小功能出问题,定位困难,修复困难,验证困难,上线困难
- 扩展性差。单体应用想要尝试新技术比较困难
- 弹性伸缩困难。超强的弹性能力可以应对复杂的网络负载,例如:春运高峰订票流量徒增,旅游淡季订单量骤降等,弹性伸缩有两个维度:
- 垂直伸缩。当负载增大时,增加服务器的CPU、内存、存储空间、网络带宽等资源,再厉害的服务器,也不能无限制的增加资源,注定垂直伸缩是有上限的
- 水平伸缩。当负载增大时,增加一台服务器,部署新的副本。负载的增加往往是极个别功能的负载,如果水平伸缩,会造成不必要的资源浪费
于是人们想到了把服务拆成一个一个更小的微服务,这是软件层面(架构、代码实现),除此之外,还需要很多其他方面来支撑,比如:基础设施、CICD、服务治理等等,本文尽最大努力介绍微服务相关的技术,希望让你对微服务及相关技术有一个大概的了解
如何拆分微服务
知乎搜索:微服务拆分规范
可以参考:The Twelve-Factor App
容器技术
容器技术的出现加快了微服务的盛行,提到容器技术一定避不开Open Container Initiative,制订了两个标准:
- Image spec
- Runtime spec
有关两个标准的介绍可以阅读:Open Container Initiative (OCI) Specifications
当今主流的容器生态玩家都遵循该标准,也有不同的实现:docker、containerd、crio等
在The Twelve-Factor App中:
- 原则2:显式声明依赖关系
- 原则5:严格分离构建、发布和运行
- 原则8:通过进程模型进行扩展
- 原则10:开发环境与线上环境等价
等特征都可以通过容器技术很好的支持,包括:
- 容器镜像的构建能够保证明确的依赖关系(例如Dockerfile)和可追溯
- 容器镜像的管理可以保证开发环境和线上环境等价
- 容器能够严格分离构建、运行,发布需要上层容器管理平台协助
- 一般情况下,一个容器中包含一个主进程,运行一个容器镜像的多个实例轻松实现“通过进程模型进行扩展”
可以从Docker — 从入门到实践入门,熟练使用docker,再深入学习容器关键技术《自己动手写Docker》
容器编排
容器技术能够实现将单体应用拆分为微服务,解决了依赖关系、构建、运行、扩展等技术难题,但没有很好的解决微服务的编排、通信的问题,这时候就需要引入容器编排技术,kubernetes已经成为容器编排的事实标准,所以本文只讨论kubernetes
kubernetes官方的定义是:Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统
kubernetes有很多方面值得我们学习:
- 作为运维人员:从招聘网站发布的职位来看,越来越多的公司使用kubernetes作为业务应用部署平台,运维人员应该熟练掌握集群、工作负载、服务负载均衡和联网等的管理
- 作为开发人员:熟练掌握kubernetes的架构和扩展机制能够清晰的了解所开发的软件在整个kubernetes生态中的位置
- 作为设计人员:kubernetes的设计思想值得反复学习:archhitecture-principles.md(原则本身值得学习,先定原则,然后指导设计的方法同样值得学习)、扩展性(kubernetes的扩展性做的非常好,在kube-apiserver、kube-controller-manager、kubelet、kubectl等多个点支持扩展,扩展的内容包括:自定义资源、认证、鉴权、控制器、容器运行时、容器网络、容器存储等,可以说是做到了无所不能扩展,极强的扩展性保证了促使了生态不断丰富,最终成为容器编排领域的事实标准)
可以从《kubernetes权威指南》着手,结合kubernetes官方文档和源码深入了解kubernetes
kubernetes上的百花齐放
如果把kubernetes说成是一个平台,或者是一个花坛,那他极强的扩展性就是很好的肥料,注定会迎来百花齐放的盛世
这里的扩展除了典型的:CRI、CNI、CSI是围绕kubernetes的核心能力:工作负载和服务来进行扩展外,还有CRD、控制器、kubectl的扩展方式,更是引入了各种各样的扩展
ECX就使用了kubernetes的诸多扩展:
- kubevirt:kubernetes上的虚拟化解决方案,官方文档,想要快速了解架构可以参考architecture.md | developer documentation,虚拟化基础知识参考KVM、qume、libvirt
- kube-ovn:integrates the OVN-based Network Virtualization with Kubernetes,github kube-ovn,OVN
- openebs:is the most widely deployed and easy to use open-source storage solution for Kubernetes. 官方文档 | github
- prometheus:is an open-source systems monitoring and alerting toolkit originally built at SoundCloud,简介 | 官方文档