spring cloud 作为Java语言的微服务框架,它依赖于springboot ,有快速开发,持续交付和容易部署等特点。spring cloud 的组件非常多,涉及微服务的方方面面。
微服务具有以下的特点:
按照业务来划分服务,单个服务代码量小,业务单一,易于维护。 |
每个微服务都有自己独立的基础组件,例如数据库,缓存等,且运行在独立的进程中。 |
微服务之间的通信时通过HTTP协议或者消息组件,且具有容错能力。 |
微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。 |
单个微服务能够集群化部署,并且有负载均衡的能力。 |
整个微服务系统应该有一个完整的安全机制,包括用户验证,权限验证,资源保护等。 |
整个微服务系统有链路追踪的能力。 |
有一套完整的日志系统。 |
微服务的功能主要体现在:
服务的注册和发现 |
服务的负载均衡 |
服务的容错 |
服务网关 |
服务配置的统一管理 |
链路追踪 |
实时日志。 |
2.服务的注册与发现:
服务注册是指向服务注册中心一个服务实例,服务提供者将自己的服务信息告知服务注册中心,服务发现是指当服务消费者需要消费另外一个服务时,服务注册中心能够告知服务消费者它所要消费服务的实例信息。通常一个服务即是服务提供者,又是服务消费者。富足注册中心会提供服务的健康检查方案,检查被注册的服务是否可用。通常一个服务实例注册后,会定时向服务注册中心提供心跳,以表明自己还处于可用的状态。当一个服务实例停止向服务注册中心提供心跳一段时间后,那么,服务注册中心会人为该服务实例不可用,会将该服务实例从服务注册列表中剔除。
服务的负载均衡:
在微服务架构中,服务之间的相互调用一般是通过HTTP通信协议来实现的。网络往往具有不可靠性,为了保证服务的高可用,服务单元往往是集群化部署。
服务的负载均衡,就是所有的服务都向服务注册中心注册,服务注册中心持有每个服务的应用名和IP,同时每个服务也会获取所有的服务注册列表信息。服务消费者集成负载均衡组件,该组件会向服务消费者获取服务注册列表信息,并每隔一段时间重新刷新获取该列表。当服务消费者消费服务时,负载均衡组件获取服务提供者所有实例的注册信息,并通过一定的负载均衡策略,选择一个服务提供者的实例,向该实例进行服务消费,这样就实现了负载均衡。
服务注册中心不但要定时接受每个服务的心跳,而且每个服务会定期获取服务注册列表的信息。当服务实例数量很多时,服务注册中心承担了非常大的负载。由于服务注册中心在微服务系统中祈祷了至关重要的作用,所以要实现高可用。一般的做法是将服务注册中心集群化,每个服务注册中心的数据实时同步。
服务的容错:
为了解决防止雪崩效应的出现,分布式系统引进了熔断器机制。当一个服务的处理请求的失败次数在一定时间内小于设定的阀值时,熔断器处于关闭状态,服务正常。当服务处理用户请求的失败次数大于设定的阀值时,说明服务出现了故障,打开熔断器,这时所有的请求会执行快读失败,不执行业务逻辑。
熔断机制的意义,不仅能够防止系统的雪崩效应,还具有:
- 将资源进行隔离,如果某个服务里的某个API接口出现了故障,指挥隔离该API接口。不会影响到其他API接口。被隔离的api接口会执行快速失败的逻辑,不会等待,请求不会阻塞。如果不进行这样隔离,请求会一直处于阻塞状态,直到超时。若有大量的请求同时涌入,都处于阻塞的状态,服务器的线程资源,迅速被消耗完。
- 服务降级的功能。当服务处于正常的状态时,大量的请求在短时间内同时涌入,超过了服务的处理能力,这时熔断器会被打开,将服务降级,以免服务器因负载过高而出现故障。
- 自我修复能力。当因某个微小的故障,例如网络服务商的问题,导致网络在短时间内不可用,熔断器被打开。如果不能自我监控,自我检测和自我修复,那么需要开发人员手动的去关闭熔断器,那么就会增加开发人员的 工作量。
服务网关:
微服务系统通过将资源以API接口的形式暴露给外界来提供服务。在微服务系统中,API接口资源通常是由服务网关统一暴露,内部服务不直接对外提供API资源的暴露。保证了微服务系统 的安全,通常情况,网关层以集群的形式存在。在服务网关之前,可能需要加上负载均衡层,通常为Nginx双机热备,通过一定的路由策略,将请求转发到网关层。
网关的意义:
- 网关将所有的服务API接口资源统一聚合,对外统一暴露,外界系统调用的API接口都是网关对外暴露的API接口。
- 网关可以做一些用户身份认证,权限认证,防止非法请求操作API接口,对内部服务起到保护作用。
- 网关可以实现监控功能,实时日志输出,对请求进行记录。
- 网关可以用来做流量监控,在高流量的情况下,对服务进行降级。
- API接口从内部服务分离出来,方便做测试。
服务配置的统一管理:
在实际开发过程中,每个服务都有大量的配置文件,例如数据库的配置,日志输出级别的配置等。在微服务架构中,需要有统一管理配置文件的组件,例如spring cloud 的config 组件,阿里的diamond 等。
spring cloud :
spring cloud 是基于spring boot 的,简化了开发和部署的过程,简化了spring 复杂的配置和依赖管理,通过起步依赖和内置servlet 容器能够使开发者迅速搭起一个web 工程。
spring cloud 的首要目标就是通过提供一系列开发组件和框架,帮助开发者迅速搭建一个分布式的微服务系统。spring cloud 是通过包装其他技术框架来实现的。例如包装开源的Netflix OSS组件,实现了一套通过基于注解,Java配置和基于模板开发的微服务框架。spring cloud 提供了开发分布式微服务系统的一些常用组件,例如服务注册和发现,配置中心,熔断器,智能路由,微代理,控制总线,分布式会话等。
常用组件:
1.服务注册和发现组件Eureka
利用Eureka 组件可以很轻松的实现服务的注册和发现的功能。Eureka 组件提供了服务的健康检测,以及界面友好的UI。通过Eureka 组件提供的UI,eureka 组件可以让开发人员随时了解服务单元的运行情况。另外,spring cloud 也支持consul 和zookeeper ,用于注册和发信啊服务。
2.熔断组件Hystrix
Hystrix 是一个熔断组件,它除了有一些基本的熔断器功能外,还能够实现服务降级,服务限流的功能。另外,Hystrix提供了熔断器的健康检测,以及熔断器健康数据的API接口。Hystrix Dashboard 组件提供了单个服务熔断器的健康状态数据的界面展示功能,Hystrix Turbine 组件提供了多个服务的熔断器的健康状态数据的界面展示功能。
负载均衡组件Ribbon:
Ribbon 是一个负载均衡组件,它通过和Eureka,zuul,restTemplate,feign配合使用。ribbon 和zuul 配合,很容易做到负载均衡。将请求根据负载均衡策略分配到不同的服务实例种。ribbon 和restTemplate,feign 配合,再消费服务时能够做到负载均衡。
路由网关Zuul:
路由网关Zuul 有智能路由和过滤的功能。内部服务的API接口通过Zuul网关统一对外暴露,内部服务的API接口不直接暴露,防止了内部服务敏感信息对外暴露。默认情况下,zuul 和ribbon 组合,能够做到负载均衡,智能路由。zuul 的过滤功能是通过拦截请求来实现的,可以对一些用户的角色和权限进行判断,起到安全验证的作用,同时也可以用于输出实时的请求日志。
spring cloud config:
spring cloud config组件提供了配置文件统一管理的功能。spring cloud config包括server 端和client端。server端读取本地仓库或者远程仓库的配置文件,所有的client向sever读取配置信息,从而达到配置文件统一管理的目的。通常情况下,spring cloud config 和spring cloud bus 相互配合刷新指定client或所有的client 的配置文件。
spring cloud security:
spring cloud security 是对spring security 组件的封装,spring cloud security向服务单元提供了用户验证和权限认证。一般来说,单独在微服务系统中使用spring cloud security是很少见的,一般它会配合spring security oauth2组件一起使用,通过搭建授权服务,验证token 或jwt (java web token)这种形式对整个微服务系统进行安全验证。
spring cloud sleuth:
spring cloud sleuth 是一个分布式链路追踪组件,它封装了dapper,zipkin,kibana 等组件,通过它可以直到服务之间的相互依赖关系,并实时观察链路的调用情况。
spring cloud stream:
spring cloud stream是spring cloud 框架的数据流操作包,可以封装rabbitMQ,activeMQ,kafka,redis等消息组件,利用spring cloud strem 可以实现消息的接收和发送。
spring cloud config | 服务配置中心,将所有的服务的配置文件放到本地仓库或者远程仓库,配置中心负责读取仓库的配置文件,其他服务向配置中心读取配置。spring cloud config 使得服务的配置统一管理,并可以在不人为重启服务的情况下进行配置文件的刷新。 |
spring cloud netflix | 通过包装了Netflix 公司的微服务组件实现的,也是spring cloud核心的核心组件,包括eureka,hystrix,zuul,archaius等。 |
eureka | 服务注册和发现组件 |
hystrix | 熔断器组件。hystrix通过控制服务的api接口的熔断来转移故障,防止微服务系统发生雪崩。hystrix能够起到服务限流和服务降级的作用。使用hystrix dashboard 组件监控单个服务的熔断器的状态,使用turbine组件可以聚合多个服务的熔断器的状态。 |
zuul | 智能路由网关组件。Netflix zuul能够起到智能路由和请求过滤的作用,是服务接口统一暴露的关键模块,也是安全验证和权限控制的一道门。 |
feign | 声明式远程调度组件 |
ribbon | 负载均衡组件 |
archaius | 配置管理api的组件,一个基于Java的配置管理库,主要用于多配置的动态获取 |
spring cloud bus | 消息总线组件,常和spring cloud config 配合使用,用于动态刷新服务的配置 |
spring cloud sleuth | 服务链路追踪组件,封装了dapper,zipkin,kibana 等组件,通过它可以直到服务之间的相互依赖关系,并实时观察链路的调用情况。 |
spring cloud data flow | 大数据操作组件,spring cloud data flow 是spring xd的替代品,也是一个混合计算的模型,可以通过命令行的方式操作数据流 |
spring cloud security | 安全模块组件,是对spring security的封装,配合spring security oauth2组件一起使用,通过搭建授权服务,验证token 或jwt (java web token)这种形式对整个微服务系统进行安全验证。 |
spring cloud consul | 该组件是spring cloud 对consul的封装,和eureka 类似,它是另一个服务注册和发现组件。 |
spring cloud zookeeper | 该组件是spring cloud 对zookeeper的封装,和eureka,consul 类似,它是另一个服务注册和发现组件。 |
spring cloud stream | spring cloud stream是spring cloud 框架的数据流操作包,可以封装rabbitMQ,activeMQ,kafka,redis等消息组件,利用spring cloud strem 可以实现消息的接收和发送。 |
spring cloud cli | 该组件是spring cloud 对spring boot cli 的封装,可以让用户以命令行方式快速运行和搭建容器 |
spring cloud task | 该组件基于spring task ,提供了任务调度和任务管理的功能。 |
spring cloud connectors | 用于paas 云平台连接到后端。 |
dubbo:
dubbo 是阿里巴巴开源的一个分布式服务框架,致力于提高性能和透明化是RPC远程服务调用方案,以及SOA服务治理方案。
RPC远程调用 | 封装了长连接NIO框架,如netty,mina等,采用的是多线程模式 |
集群容错 | 提供了基于接口方法的远程调用的功能,并实现了负载均衡策略,失败容错等功能 |
服务发现 | 集成了apache 的zookeeper组件,用于服务的注册和发现。 |
dubbo架构的流程如下:
1.服务提供者向服务中心注册服务
2.服务消费者订阅服务
3.服务消费者发现服务
4.服务消费者远程调度服务提供者进行服务消费,在调度过程中,使用了负载均衡策略,容错失败的功能。
5.服务消费者和提供者,在内存中记录服务的调用次数和调用时间,并定时每分钟发送一次统计数据到监控中心。
连通性 | 注册中心负责服务的注册。监控中心负责收集调用次数,调用时间;注册中心,服务提供者,服务消费者为长连接。 |
健壮性 | 监控中心宕机不影响其他服务的调用;注册中心集群,任意一个实例宕机自动切换到另一个注册中心实例;服务实例集群,任意一个实例宕机,自动切换到另外一个可用的实例。 |
伸缩性 | 可以动态增减注册中心和服务的实例数量 |
升级性 | 服务集群升级,不会对现有的架构造成压力。 |
微服务关注点 | spring cloud | dubbo |
配置管理 | config | - |
服务发现 | eureka,consul,zookeeper | zookeeper |
负载均衡 | ribbon | 自带 |
网关 | zuul | - |
分布式追踪 | spring cloud sleuth | - |
容错 | hystrix | 不完善 |
通信方式 | http ,message | RPC |
安全模块 | spring cloud security | - |
dubbo | spring cloud |
dubbo 更倾向于spring xml 的配置方式,dubbo官方也推荐这种方式 | spring cloud 基于spring boot ,spring boot采用的是基于注解和java been配置方式的敏捷开发。 |
dubbo 的通信方式基于远程调用,对接口,平台,和语言有强依赖性。 | spring cloud 的通信方式大多数是基于http restful 风格的,服务与服务之间完全无关,无耦合。由于采用的是http rest ,因此服务无关语言和平台,只需要提供相应api接口就可以相互调用。 |
kubernates:
kubernates 是一个容器集群管理系统,为容器化的应用程序提供部署运行,维护,扩展,资源调度,服务发现等功能。