现如今,随着互联网的发展,对于系统性能,架构均有了更高的要求。以前传统的ssh时代的单体应用的机构模式已显力不从心,所以微服务架构应运而生,并且形成了越来越成熟的方案。写本系列文章的目标是从单体架构模式到微服务完整架构模式做一个系统性的介绍,并且着重从实际操作层面上一步步地演示,将零散的知识点串联起来。
(比如ssh时代的惯用架构:SpringMvc、Spring、Hibernate)
单体应用模式的优点是开发和部署都非常方便,只需要考虑到单体应用如何实现业务逻辑,对于性能的扩展只需要复制部署到多个tomcat形成集群,用Nginx进行负载均衡,即可完成一个简单的分布式方案。缺点就是比较简单粗暴,不管三七二十一,直接把整个应用复制部署,没有细化到单个功能的性能管控,并且在性能上瓶颈也很明显,负载服务器,数据库,都是各个瓶颈点。
首先讲一下什么是springboot,它实际上和springmvc框架解决的是同一件事,就是如何对外提供服务(api),并且在使用层面,代码注解也是是很相似的。
技术区别:
springmvc可以看成是servlet的封装,首先需要建立一个java web项目,通过web.xml的配置接入springmvc入口,并且最终要将java web项目部署到容器中(比如tomcat); 而springboot则可以直接看成是一个tomcat和java web应用的集装箱,你只需要按照约定配置好 核心配置文件(比如application.yml),写好你的控制器(controller),然后再加上一个main方法,就可以直接启动 tomcat+你的应用,部署后,也是直接用jar命令来启动一个Jar包这样的形式。
适用场景:
springboot非常适合 部署大量独立服务,细品一下。 一个springboot的jar包就是一个完整的tomcat+应用,指定不同的端口号,一个jar命令,就启动了应用。
微服务架构思想:
其实呢,在这儿有个架构上的思想转变,之所以要说微服务,就是因为整个应用从架构上就拆分成了各个小应用,比如说 电商系统,拆分成了订单微服务,用户微服务等等,每个微服务都使用各自独立的数据库,微服务之间使用RPC等方式进行交互,每个微服务都是可以独立运行,并且只解决某一类业务。这样整体架构就由大单体应用的模式转变为 微单体应用群+独立数据独立运行+服务间调用 这样的模式,整个架构的容错率,可扩展性,高可用性 就变得更强了。
当开始使用SpringBoot将单体系统拆分成若干个微服务后,面临一大问题就是:如何管理好这些微服务呢?答案:SpringCloud
SpringCloud是一套微服务治理解决方案,首先放一个整体概念图。
上图已经初步表达清楚了SpringCloud的核心理念,而它的理念具体由很多组件来分别实现,早期大部分组件是封装了来自 Netflix 贡献的开源框架,后续SpringCloud又自研了类似 gateway 等组件,包括近来兴起的 SpringCloud Alibaba,这些都遵循SpringCloud的接口规范,可插拔可切换的程度非常高,很灵活,下面就来简单看下都有些什么组件。
SpringCloud的核心组件包含:
1、注册发现中心:汇总管理所有微服务的信息,包括IP,端口,API列表,并提供给其他组件。
相关技术框架:Eureka、Consul、Nacos
2、服务网关:负责对外统一提供API接口,网关可自行配置接口的转发规则,也可直接从注册中心获取接口信息。
相关技术框架:Springcloud gateway、Zuul
3、配置中心:统一管理所有配置信息,供所有微服务读取,具有更新通知、版本管理等功能
相关技术框架:Springcloud config、Nacos
4、限流:根据实际情况,对接口(QPS、并发数)做限制,保证系统的可用性
相关技术框架:Springcloud gateway自带限流过滤器、Sentinel
5、熔断降级:根据接口的当前状态,评估出不能正常提供服务的接口,让其熔断,防止整个系统因相互调用而雪崩
相关技术框架:Hystrix、Sentinel
6、调用链路追踪:监控整个服务的调用生命周期,协助定位错误
相关技术框架:Zipkin、Pinpoint,SkyWalking,CAT
7、远程服务调用:服务之间的相互调用技术
相关技术框架:Feign、Dubbo
……以上为最核心的功能组件(更多组件列表可参考:https://spring.io/projects/spring-cloud/)
下面收集一些比较好的Springcloud概念讲解的文章:
最适合入门者的 SpringCloud 架构、概念、组件介绍
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。