作为一个Java程序员,你可能也思考过,为什么我还是普通开发,为什么我还是高级开发,普通开发和高级开发有什么区别?你是不是也想过要成为架构师?想要成为合格的架构师,就必须要了解架构的演进,今天,我们就来聊一聊,Java架构的演变历史。
分布式微服务架构的发展,主要经历了四个阶段:单一应用架构、垂直应用架构、分布式架构和弹性SOA架构。
这张图是从Dubbo官网上下载的描述分布式架构演进过程的示意图,大家可以收藏一下。
1)单体架构(All in One)
从2000年开始,互联⽹在中国开始盛⾏起来,但是那时候⽹⺠数较少,网站流量也很小,只需要一台机器就可以运行所有的服务,只需要All in One单体架构就能满⾜需求。
2)垂直应用架构(Vertical Application)
随着网站访问量的增加,一旦服务器或者数据库出现问题,将会导致整个系统故障,造成所有服务不可用,⽽且功能修改发布也不⽅便,所以,就把⼤系统拆分成了多个⼦系统,
⽐如将“⽤户”、“商品”、“订单“等按业务进行拆分,也就是”垂直拆分“,并且每个⼦系统都部署到不同的服务器上。
3)分布式架构(Distributed Service)
随着⽤户访问越来越⼤,意味着需要更多的服务器才能支撑服务的运行,而应用之间的交互不可能避免地变得越来越复杂。为了保证服务稳定,提高管理效率,需要对这些应⽤做负载均衡。因为用户不可能去了解后台服务器的数量和业务结构,有了负载均衡以后,用户只需要统一访问负载均衡服务器就可以,后端的应⽤就可以根据流量的⼤⼩进⾏动态的扩缩容,也就是“⽔平扩展”。
4)弹性SOA架构(Elastic Computing)
分布式架构运行一段时间之后,发现商品和订单服务中有很多重复的功能,⽐如SSO、OAuth权限和⽀付等。⼀旦项⽬⼤了,集群部署多了,这些重复的功能⽆疑就是浪费资源,就需要把这些重复的功能单独抽离出来单独部署,并且给它们起了个名字叫“Service(服务)“,并且对服务进行分层,比如Base Service基础服务、Business Service业务服务等等。
有了服务的概念之后,我们还可以根据业务需要,将服务进一步细化并拆分。比如把对⽤户服务可以划分为⽤户积分服务、个人优惠券服务等等,这就是我们通常所说的微服务架构。
但是往往对于微服务架构实际上没有⼀个明确的定义,因为微服务的边界很难确定,所以微服务架构一直在不断地重构过程中发展,没有完美的微服务架构,只有适合公司业务场景的微服务架构。
当然,以上是我个人对微服务的理解,为了帮助大家更准确的理解微服务,这⾥引⽤Martin Folwer前辈对于微服务描述的⼀段话,英⽂我就不读了,⼤家可以通过翻译软件来理解⼀下上述这段话。
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.
在Java中微服务架构的主流解决⽅案是Spring Cloud,给程序员带来了非常便捷的开发体验。但是,有了Spring Cloud的微服务架构就完美了吗?现实并非如此,很快我们就发现微服务带来了很多的问题,我大致总结为以下三点:
第1点:非功能代码侵入严重。为了满足业务需要,我们可以使用框架提供给我们的各种组件,比如⽹络通信、消息处理等。于是,我们需要引⼊各种依赖, 加注解,写配置,最后将这些⾮业务功能的代码和业务代码打包⼀起部署,这就是“侵⼊式框架”;
第2点:微服务框架学习成本还是较⼤。Spring Cloud虽然能解决微服务领域的很多问题,但是需要程序员花费比较多的精力来学习它的使用。本来程序员应该把更多的精⼒投⼊到业务开发上,⽽不应该是⾮业务上。
第3点:维护成本变高。互联⽹公司产品的版本升级是⾮常频繁的,因为Spring Cloud是“代码侵⼊式的框架”,为了维护各个版本的兼容性、权限、流量等,这时候版本的升级就注定要让⾮业务代码⼀起, 再加上多语⾔之间的调⽤,⼀旦出现问题,程序员们会⾮常痛苦。
其实,⼤家有没有发现?服务拆分的越细,只是感觉上解耦了,但是维护成本却变⾼了,那怎么办呢?
⽹络的问题当然还是要交给⽹络本身来解决。所以,服务⽹格的技术就应运⽽⽣,也就是Service Mesh。
我们可以为每个服务单独配置⼀个Sidecar,所有服务通信的进出⼝流量都会通过Sidecar来进⾏操作,如图所示:
常⻅的服务⽹格产品有Prana、Local Proxy、Linkerd、Istio等,⽬前⽐较主流的是Istio,我们来看看Istio的架构图:
可以发现,该架构图分为数据平⾯和控制平台,数据平⾯就是前面的ServiceA和ServiceB组成的部分,控制平⾯主要指的是Mixer、Pilot、Galley、Cidatel等组件,这些组件的详细功能这⾥就不详细展开了,⼤家感兴趣的话回复 666 ,我可以单独出⼀期视频。
回到主题,我们可以思考一下这些组件和服务部署起来是否会有难度?答案是肯定的,因为⼤家使⽤的基础设施和操作系统可能会有差异,所以,这时候我们需要使用容器化技术来部署。
架构演进到现在这个阶段,我们可以基于容器化和容器编排的技术来实现公有云、私有云、混合云地⽆缝迁移,也就是可以使⽤云原⽣架构来考虑组件和服务的部署⽅案。通过这张图来理解⼀下:
不管底层的基础设施是什么,都可以⽤Kubernetes作为适配,帮助开发运维⼈员屏蔽底层硬件的细节,同时采⽤Devops来打破传统开发和运维之间的界限。
互联网主流业务架构的演进过程我们就分享到这了。
技术的发展令人敬畏,从单体架构时代到现在的云原生时代,每一次架构的演进都会产生一些新的技术名词:分布式、微服务、云原生等等等等,这些名词,不都是为了让我们的开发变得更加便捷?