架构是逻辑上的设计模式,而框架则是具体的实现。一个架构模式上,可能会使用到多个框架。
架构的演变是根据业务量的急速扩张对技术要求不断的加深而产生的。如果细粒度的划分可以有很多路线,我一般将演变过程大体上分为这几类:
单体架构 -----> 分布式架构 -----> SOA(面向服务架构) ------> 微服务
在传统的架构中,SSH,SSM,主要分为web 控制层,业务逻辑层,数据库访问层,单点项目,项目没有拆分,所有的开发任务全部写在一个项目中,耦合度比价高,如果程序中的一个功能出现了问题,所导致的就是整个服务挂掉。
因为传统项目的耦合度比较高,所以架构的发展逐步面向服务化,将共同的业务逻辑抽取出来,形成一个服务,可以供其他服务所调用,服务和服务之间的调用通过RPC远程调用(底层就是httpclient技术)。
SOA 架构中通常使用xml 实现通讯,xml 比较重,占宽带,相对冗余,在高并发情况下,很受影响。底层是使用webservice 技术,ESB 消息总站。
Springcloud 就是微服务架构,是由SOA 架构发展而来,没有ESB 总站的传输方式,采用http + json 轻量级的传输方式。
微服务的架构比SOA更加的轻量级。
微服务架构中,服务的独立性更加的强,可以有独立数据库,独立的缓存、数据库、消息队列等资源,保障服务与服务之间更加的不受影响。
微服务架构中,服务化的粒度更加的精细,所以,更加适合敏捷开发。
根据框架在体系的不同作用,主要可以分为:
服务治理(注册中心):Dubbo (阿里巴巴)、Dubbox(当当网在Dubbo继续开发的)、Eureka(已经闭源了)、consul
分布式配置中心:disconf(百度)、Netfix的Archaius、360的QConf、SpringCloud Config、携程的阿波罗等
分布式任务调度平台:xxl-job
服务跟踪:hyra(京东)、springcloud的sleuth等
从市面上目前的使用情况来看,dubbo以及springcloud活跃度是很高的,所以针对性的介绍一下以及它们之间的异同。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
主要核心部件:
工作原理:
dubbo官网的架构设计提供了一张整体的框架图,10个层级看起来挺吓人的。但是其核心总结起来就是:Microkernel + Plugin(微内核+插件)。
(1) 连通性:
1.注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小;
2.监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示;
3.服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销;
4.服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销;
5.注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外;
6.注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者;
7.注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表;
8.注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。
(2) 健壮性:
1.监控中心宕掉不影响使用,只是丢失部分采样数据;
2.数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务;
3.注册中心对等集群,任意一台宕掉后,将自动切换到另一台;
4.注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯;
5.服务提供者无状态,任意一台宕掉后,不影响使用;
6.服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复。
(3) 伸缩性:
1.注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心;
2.服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
SpringCloud的组成
Spring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。
下面对其核心五大部件做一个简单介绍:
(1)服务发现——Netflix Eureka
一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
(2)客服端负载均衡——Netflix Ribbon
Ribbon,主要提供客户侧的软件负载均衡算法。
Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:
Ribbon中还包括以下功能:
(3)断路器——Netflix Hystrix
断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障的对性能的影响。它可以帮助快速地拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态。
(4)服务网关——Netflix Zuul
类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
(5)分布式配置——Spring Cloud Config
这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。
最大区别:SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。总体来说,两者各有优势。虽说后者服务调用的功能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的依赖,这在强调快速演化的微服务环境下,显得更加合适。
这也相当于品牌机与组装机的区别。很明显SpringCloud比dubbo的功能更强大,覆盖面更广,而且能够与SpringFramework、SpringBoot、SpringData、SpringBatch等其他Spring项目完美融合,这些对于微服务至关重要。使用Dubbo构建的微服务架构就像组装电脑、各环节我们选择自由度高,但是最总可能会因为内存质量而影响整体,但对于高手这也就不是问题。而SpringCloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性。