一、概述
本文阐述微服务架构演进的过程。
二、单体应用
英文称之为Monolithic Application,此时应用是单进程的,由该进程起EndPoint(即监听端口)对外提供服务。
优点:
- 代码调试简单
- 服务之间调用是简单的方法调用,出错概率低,错误处理简单
- 日志聚合,方便排查问题。
缺点:
- 随着应用规模增长,无法支撑高并发量
- 任意模块代码修改都要重新发布整个应用
- 开发团队规模大,难以管理
传统解决方案:
- 使用nginx等反向代理设备进行负载均衡,通过集群的方式提供服务,解决并发访问的问题
- 后端数据库服务,通过主从复制,分库分表,或者通过数据库中间件mycat等解决数据库访问压力
…
三、微服务架构诞生
为了解决单体架构存在的问题,微服务架构(micro service)诞生了。最初是Martin Fowler第一次系统性的阐述了这一架构:https://www.martinfowler.com/articles/microservices.html
简单来说,微服务架构将单体应用,根据业务拆分为多个独立的微服务。微服务直接通过网络通信的方式,相互调用,组成整个应用程序。
优点:
- 微服务可横向扩展,访问量大的微服务实例多,访问量少的可相对少
- 一个微服务可以由一个小团队管理
- 微服务之间可以使用不同的技术栈,如java, nodejs等
缺点:
- 引入了服务注册发现,负载均衡、服务熔断、服务治理等新的难题
- 增加了业务代码编写的难度,现在要处理服务调用相关的问题
- 排查问题困难,日志分散
- 根据技术栈的不同,微服务之间可能有很强的依赖性,如dubbo框架
在微服务架构刚开始流行的时候,大家主要通过SpringCloud、Dubbo等微服务框架实现微服务,难度较大,上手难度高。
四、容器化
随着docker技术的流行,应用容器化成为主流。
容器化解决的是应用部署的难题:通过把所有的环境打包到镜像,只要当前环境部署了docker,应用就能随时部署扩容。
并且,容器之间相互隔离,互不影响。
五、Kubernetes
Kubernetes是Docker的分布式解决方案,是一个分布式的容器编排平台。
docker虽然简化了应用部署的难题,但是在服务治理方面的能力较弱,并且不是分布式的解决方案。
通过Kubernetes,可以很容易实现应用的扩容缩容,应用监控、应用升级、服务注册发现等功能。
其实在k8s的层面,已经实现了服务发现,负载均衡等功能了;可以发现SpringCloud、Dubbo等框架和k8s平台存在功能重复的问题。
六、istio服务网格
Service Mesh是近两年提出的概念,意为微服务之间相互调用的网络。
k8s虽然解决了服务自动扩容缩容等问题,但无法控制服务之间的网络调用。
于是istio等服务网格平台,通过sidecar模式,实现了在应用无感知的情况下,对服务之间网络调用的控制。
原理如下:
在k8s的pod中,除了service的container之外,会注入istio的sidecar container,这个sidecar会拦截所有进入pod的网络流量(通过改写iptable规则实现),也会拦截所有从pod发出去的流量。由于所有的网络流量都经过sidecar,通过配置相关的规则,istio可以实现对网络流量的控制、加密、观测等功能。
最重要的是,这一些都是应用无感知的,也就是说,应用几乎无需做任何改造,只需要提供相应的配置给到istio,就可以享受这些功能。
感觉上,有了istio,传统微服务框架中,服务注册发现、服务熔断、限流、负载均衡等功能都没有必要存在了。你需要做的只是简单的发起一个http服务调用(或者是grpc等),其他的一切留给istio处理。
但目前服务网格还没有大规模应用,并且由于引入sidecar等间接层,对服务性能也有一定的影响,服务网格的未来还不可知。
七、总结
单体架构转化为微服务架构,微服务架构是主流。
docker、k8s解决的是应用部署、应用状态监控,应用扩容缩容等服务治理的问题。这些工具的出现,使得拥抱微服务架构的难度大大降低了。
istio的出现,进一步解决了微服务网格之间,网络流量的控制、加密、观测等问题。