searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

从单体应用到微服务

2023-10-11 01:11:25
3
0

在计算机发展的很多年里,从最开始的插件版到个人计算机出现后,人们都习惯把所有的功能放到一个程序里,比如:一块插件版、一个穿孔卡片、一个可执行文件等

随着用户需求越来越复杂,单体应用开始暴露一些问题:

  • 灵活性差。因为包含的功能很多,单体应用体量很大,不同功能的边界模糊,设计、开发和测试工作量成倍增加,很难灵活响应用户需求
  • 维护困难。一个小功能出问题可能导致整个应用崩溃,“千里之堤,溃于蚁穴”;一个小功能出问题,定位困难,修复困难,验证困难,上线困难
  • 扩展性差。单体应用想要尝试新技术比较困难
  • 弹性伸缩困难。超强的弹性能力可以应对复杂的网络负载,例如:春运高峰订票流量徒增,旅游淡季订单量骤降等,弹性伸缩有两个维度:
    • 垂直伸缩。当负载增大时,增加服务器的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,简介 | 官方文档
0条评论
0 / 1000
安****顺
8文章数
0粉丝数
安****顺
8 文章 | 0 粉丝
安****顺
8文章数
0粉丝数
安****顺
8 文章 | 0 粉丝
原创

从单体应用到微服务

2023-10-11 01:11:25
3
0

在计算机发展的很多年里,从最开始的插件版到个人计算机出现后,人们都习惯把所有的功能放到一个程序里,比如:一块插件版、一个穿孔卡片、一个可执行文件等

随着用户需求越来越复杂,单体应用开始暴露一些问题:

  • 灵活性差。因为包含的功能很多,单体应用体量很大,不同功能的边界模糊,设计、开发和测试工作量成倍增加,很难灵活响应用户需求
  • 维护困难。一个小功能出问题可能导致整个应用崩溃,“千里之堤,溃于蚁穴”;一个小功能出问题,定位困难,修复困难,验证困难,上线困难
  • 扩展性差。单体应用想要尝试新技术比较困难
  • 弹性伸缩困难。超强的弹性能力可以应对复杂的网络负载,例如:春运高峰订票流量徒增,旅游淡季订单量骤降等,弹性伸缩有两个维度:
    • 垂直伸缩。当负载增大时,增加服务器的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,简介 | 官方文档
文章来自个人专栏
智能边缘云弹性计算专栏
8 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0