在2014年底,Spring团队推出Spring Cloud,目标使其成为Java领域微服务架构落地的标准,发展至今,Spring Cloud已经成为Java领域落地微服务架构的完整解决方案。
应用是可独立运行的程序代码,提供相对完善的业务功能。目前软件架构有三种架构类型,分别是业务架构、应用架构、技术架构。它们之间的关系是业务架构决定应用架构,技术架构支撑应用架构。
架构的发展历程是从单体架构、分布式架构、SOA架构再到微服务架构。
一个应用程序将所有的代码集中在一起,例如一个完整的Java Web应用。
单体架构的优点:
单体架构的缺点:
简单来说,按照业务垂直切分,每个应用都是单体架构,通过API互相调用。
面向服务的架构(SOA:Service-Oriented Architecture)是一种软件体系结构,其应用程序的不同组件通过网络上的通信协议向其他组件提供服务或消费服务,所以也是一种分布式架构。
简单来说,SOA是不同业务建立不同的服务,服务之间的数据交互粗粒度可以通过服务接口分级,这样松散耦合提高服务的可重用性,也让业务逻辑变得可组合,并且每个服务可以根据使用情况做出合理的分布式部署,从而让服务变得规范,高性能,高可用。
SOA架构中有两个主要角色:服务提供者(Provider)和服务消费者(Consumer)。
阿里开源的Dubbo是SOA的典型实现。
SOA架构的优点:
SOA架构的缺点:
微服务架构在某种程度上是SOA架构继续发展的下一步。微服务的概念最早源于Martin Fowler的一篇文章《Microservices》。总体来说,微服务是一种架构风格,对于一个大型复杂的业务系统,它的业务功能可以拆分为多个相互独立的微服务,各个微服务之间是松耦合的,通过各种远程协议进行同步/异步通信,各微服务均可以被独立部署、扩/缩容以及升/降级。
下表对微服务技术选型做了对比:
– | Spring Cloud | Dubbo | Motan | MSEC | 其他 |
---|---|---|---|---|---|
功能 | 微服务完整方案 | 服务治理框架 | 服务治理框架 | 服务开发运营框架 | 略 |
通信方式 | REST/Http | RPC协议 | RPC/Hessian2 | Protocol buffer | grpc、thrift |
服务发现/注册 | Eureka(AP) | ZK,Nacos | ZK/Conusl | 只有服务发现 | Etcd |
负载均衡 | Ribbon | 客户端负载 | 客户端负载 | 客户端负载 | Nginx+Lua |
容错机制 | 6种容错策略 | 6种容错策略 | 2种容错策略 | 自动容错 | Keepalived、HeartBeat |
熔断机制 | Hystrix | 无 | 无 | 提供过载保护 | 无 |
配置中心 | Spring Cloud Config | Nacos | 无 | 无 | Apollo,Nacos |
网关 | Zuul,Gateway | 无 | 无 | 无 | Kong、自研 |
服务监控 | Hystrix+Turbine | Dubbo+Monitor | 无 | Monitor | ELK |
链路监控 | Sleuth+Zipkin | 无 | 无 | 无 | Pinpoint |
多语言 | Rest支持多语言 | Java | Java | Java, C++, PHP | Java, PHP, Node.js |
社区活跃 | 高(背靠Spring) | 高(背靠阿里) | 一般 | 未知 | 略 |
采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时支持微服务的技术栈也是多种多样的。
Spring Cloud的技术选型是中立的,因此可以随需更换搭配使用,基于SpringCloud的微服务落地解决方案可以分为三种:
组件 | 方案1 | 方案2 | 方案3 |
服务发现 | Eureka | Consul | etcd、阿里Nacos |
共用组件 | 服务间调用组件Feign、负载均衡组件Ribbon、熔断器Hystrix | ||
网关 | 性能低:Zuul;性能高:Spring Cloud Gateway | 自研网关中间件 | |
配置中心 | Spring Cloud Config、携程阿波罗、阿里Nacos | ||
全链路监控 | zipkin(不推荐)、Pinpoint(不推荐)、Skywalking(推荐) | ||
搭配使用 | 比如分布式事务、容器化、Spring Cloud 与DDD、gRPC |
2012年,阿里巴巴在GitHub上开源了基于Java的分布式服务治理框架Dubbo,但是Dubbo未来的定位并不是要成为一个微服务的全面解决方案,而是专注于RPC领域,成为微服务生态体系中的一个重要组件。
至于微服务化衍生出的服务治理需求,Dubbo正在积极适配开源解决方案,并且已经启动独立的开源项目予以支持,比如最近宣布的开源的Nacos。Nacos的定位是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台。
因此基于Dubbo的微服务解决方案是:Dubbo+Nacos+其他
中间件 百度百科
中间件向下屏蔽异构的硬件、软件、网络等计算资源,向上提供应用开发、运行、维护等全生命周期的统一计算环境与管理,属于承上启下的中间连接层,对企业来说有着极其重要的价值。
Spring Cloud也是一个中间件。它目前由Spring官方开发维护,基于Spring Boot开发,提供一套完整的微服务解决方案。
包括服务注册与发现、配置中心、全链路监控、API网关、熔断器等选型中立的开源组件,可以随需扩展和替换组装。
Spring Cloud是一个开源项目集合,包括很多子项目。具体的项目地址可以参考GitHub组织:
http://github.com/spring-cloud
服务治理中间件包含服务注册与发现、服务路由、负载均衡、自我保护、丰富的治理管理机制等功能。其中服务路由包含服务上下线、在线测试、机房就近选择、A/B测试、灰度发布等。负载均衡支持根据目标状态和目标权重进行负载均衡。自我保护包括服务降级、优雅降级和流量控制。
Spring Cloud作为一个服务治理中间件,它的服务治理体系做了高度的抽象,目前支持使用Eureka、Zookeeper、Consul作为注册中心,并且预留了扩展接口,而且由于选型是中立的,所以支持无缝替换。
关于SpringCloud注册中心的对比选型参考:
Feature | Consul | Zookeeper | etcd | Euerka |
---|---|---|---|---|
服务健康检查 | 服务状态,内存,硬盘等, | (弱)长连接,keepalive | 连接心跳 | 可配支持 |
多数据中心 | 支持 | - | - | - |
kv存储服务 | 支持 | 支持 | 支持 | - |
一致性 | raft | paxos | raft | - |
cap | ca | cp | cp | ap |
使用接口(多语言能力) | 支持http和dns | 客户端 | http/grpc | http(sidecar) |
watch支持 | 全量/支持polling | 支持 | 支持long polling | 支持long polling/大部分增量 |
自身监控 | metrics | - | metrics | metrics |
安全 | acl/https支持(弱) | acl | https支持(弱) | - |
SpringCloud集成 | 已支持 | 已支持 | 已支持 | 已支持 |
Spring Cloud Config是Spring Cloud生态圈中的配置中心中间件,它把应用原本放在本地文件中的配置抽取出来放在中心服务器,从而能够提供更好的管理、发布能力。Spring Cloud Config基于应用、环境、版本三个维度管理,配置存储支持Git和其他扩展存储,且无缝支持Spring里Environment和PropertySource的接口。但是Spring Cloud Config的缺点是没有可视化的管控平台,因此会用其他的配置中心中间件取代它管理配置
网关中间件概述API Gateway(APIGW/API网关),顾名思义,是出现在系统边界上一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,可以理解为企业级应用防火墙,主要起到隔离外部访问与内部系统的作用。
随着微服务架构概念的提出,API网关成为微服务架构的一个标配组件。作为一个网关中间件,至少具备如下四大功能。
(1)统一接入功能
(2)协议适配功能
(3)流量管控功能:网关作为所有请求流量的入口
(4)安全防护功能
Spring Cloud第一代网关Zuul
Spring Cloud第二代网关 Gateway
Spring Cloud Gateway是Spring官方基于Spring5.0、Spring Boot 2.0和Project Reactor等技术开发的网关,旨在为微服务架构提供一种简单、有效、统一的API路由管理方式。Spring CloudGateway底层基于Netty实现(Netty的线程模型是多线程reactor模型,使用boss线程和worker线程接收并异步处理请求,具有很强大的高并发处理能力),因此Spring Cloud Gateway出现的目的就是替代Netflix Zuul。其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如,安全、监控/埋点、限流等。
利用全链路监控中间件收集、汇总并分析日志信息,进行可视化展示和监控告警。
全链路监控中间件应该提供的主要功能包括:
如果使用Java技术栈,希望采用非侵入式的监控,推荐使用Pinpoint或者Skywalking。