2. Spring Cloud
Spring Cloud作为Java语言的微服务框架,依赖于Spring Boot,具有快速开发、持续交付、易于部署等特点。
2.1 微服务应该具备的功能
微服务的特点:
- 按照业务划分服务。每个微服务运行在独立的进程中,有独立的数据库等组件。
- 通过轻量级机制如HTTP通信。
- 有一套服务治理解决方案,服务之间不耦合。
- 单个微服务能够集群化部署,有负载均衡能力。
- 有一个完整的安全机制。
- 有链路追踪能力。
- 有一套完整的实时日志系统。
微服务的功能主要体现在:
- 服务注册和发现
- 服务负载均衡
- 服务容错
- 服务网关
- 服务配置统一管理
- 链路追踪
- 实时日志
2.1.1 服务的注册和发现
微服务系统由大量微服务构成,每个微服务有众多实例,服务之间相互依赖成网状,需要服务注册中心来统一管理微服务实例。
服务注册是指向服务注册中心一个服务实例,服务提供者将服务信息(服务名、IP地址等)告知服务注册中心。
服务发现是指当服务消费者需要消费另一个服务时,服务注册中心告知服务消费者其消费的服务的实例信息。
通常情况下,一个服务既是服务提供者也是服务消费者。
服务注册中心提供服务的健康检查方式。通常一个服务实例注册后会定时向服务注册中心发送心跳,表明处于可用状态。当一个服务实例停止向服务注册中心提供心跳一段时间后,服务注册中心认为该服务实例不可用,将其剔除服务注册列表。如果服务实例继续向注册中心提供信条,服务注册中心会将其重新加入服务注册列表。
2.1.2 服务的负载均衡
微服务系统中,所有的服务向服务注册中心注册,服务注册中心持有每个服务的服务名和IP地址等信息,同时每个服务也会获取服务注册列表信息。服务消费者集成负载均衡组件,向服务消费者获取服务注册列表信息,每隔一段时间刷新获取该列表。当服务消费者消费服务时,负载均衡组件获取服务提供者所有实例注册信息,并通过一定的负载均衡策略选择一个服务提供者实例,向该实例进行服务消费,这样就实现了负载均衡。
由于服务注册中心不但需要定时接收服务的心跳,还需要向服务提供注册列表信息,当服务实例数量较大时服务注册中心负载较重,此时需要实现服务注册中心高可用。一般做法是将服务注册中心集群化,每个服务注册中心的数据实时同步。
2.1.3 服务的容错
这里主要指分布式系统为解决雪崩效应引进的熔断器机制。当一个服务处理用户请求失败次数超过设定阀值时,打开熔断器,所有的请求不执行业务逻辑而直接执行快速失败。处于打开状态的熔断器,一段时间后会处于半打开状态,熔断器检测一部分请求是否正常,如果执行的请求成功,则关闭熔断器正常提供服务。
熔断器机制的优点:
- 将资源进行隔离。某服务的某个API借口故障只会隔离该API接口而不会影响到其他API接口。
- 服务降级。如果大量的请求短时间内涌入超过了服务的处理能力,打开熔断器将服务降级。
- 自我修复能力。自动检查请求处理情况控制熔断器开闭。
2.1.4 服务网关
微服务系统接口资源通常由服务网关统一暴露,内部服务不直接对外提供API接口。API网关通常有请求转发的作用,并可能负责一定的安全验证。服务网关层之前可能需要加负载均衡层(Nginx双机热备),通过一定的路由策略将请求转发到网关层,经过一系列的身份验证和权限判断转发到具体的服务。
网关层的功能特性:
- 将所有服务API接口统一聚合、对外暴露,保护内部微服务单元API借口。
- 可以作用户身份认证、权限验证。
- 监控功能,记录日志。
- 流量监控。
- 便于执行测试。
2.1.5 服务配置统一管理
微服务架构中需要有统一管理配置文件的组件。
首先,Config Server配置服务读取配置文件仓库的配置信息,配置文件仓库可以是本地仓库也可以是远程Git仓库;启动服务时,服务向配置服务读取配置信息;当服务配置信息执行修改后,向配置服务发送Post请求进行刷新,此时服务会向配置服务重新读取配置文件。
对于集群化的服务可以使用消息总线来刷新多个服务实例。
2.1.6 服务链路追踪
微服务架构中需要实现分布式链路追踪,来跟踪一个请求有哪些服务参与、参与的顺序如何,从而使请求链路清晰可见。
Google2010年发表的论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》是业内实现链路追踪的标杆和理论基础。常见的链路追踪组件有Dapper(Google)/Zipkin(Twitter)/Eagleeye(Alibaba)。
2.2 Spring Cloud
Spring Cloud是基于Spring Boot的。Spring Boot简化了Spring复杂的配置和依赖管理,通过起步依赖和内置Servlet容器能够使开发者迅速搭建一个Web工程。Spring Cloud的首要目标就是通过一系列开发组件和框架,帮助开发者迅速搭建一个分布式的微服务系统,通过包装一系列技术框架,实现了一套基于注解、Java配置和基于模板开发的微服务框架,提供了服务注册发现、配置中心、熔断器、智能路由、微代理、控制总线、全局锁、分布式会话等常用组件。
-
服务注册发现组件Eureka
-
熔断组件Hystrix
Hystrix除了基本的熔断器功能外,还能够实现服务降级、服务限流功能,另外还提供了熔断器健康监测。Hystrix Dashboard提供单个服务熔断器的健康状态数据UI,Hystrix Turbine提供多个服务熔断器的健康状态数据UI。
-
负载均衡组件Ribbon
Ribbon通常和Eureka、Zuul、RestTemplate、Feign配合使用。
-
路由网关Zuul
Zuul有智能路由和过滤的功能。Zuul与Ribbon结合能够做到负载均衡、智能路由。过滤功能是通过拦截请求实现的。
-
Spring Cloud Config
提供配置文件统一管理功能。通常情况下,Spring Cloud Config和Spring Cloud Bus相互配合刷新指定Client或所有Client的配置文件。
-
Spring Cloud Security
是对Spring Security的封装,提供用户权限验证。通常会配合Spring Security OAuth2使用。
-
Spring Cloud Sleuth
分布式链路追踪组件,封装了Dapper、Zipkin、Kibana等。
-
Spring Cloud Stream
数据流操作包,可以封装RabbitMQ、ActiveMQ、Kafka等消息组件。
一个简单的由Spring Cloud搭建的微服务系统通常由服务注册中心Eureka、网关Zuul、配置中心Config和授权服务Auth构成。
其他组件:
- Feign 声明式远程调度组件
- Spring Cloud Bus消息总线组件
- Spring Cloud Consul/Zookeeper服务注册发现组件
- Spring Cloud Task 基于Spring Task,提供任务调度和任务管理功能
2.3 Dubbo
Dubbo是阿里巴巴开源的分布式服务框架。包含如下核心内容:
- RPC远程调用:封装长连接NIO框架如Netty等。
- 集群容错:提供基于接口方法的远程调用,并实现负载均衡功能。
- 服务发现:集成Apache Zookeeper。
与Spring Cloud比较:
关注点 | Spring Cloud | Dubbo |
---|---|---|
配置管理 | Spring Cloud Config | - |
服务发现 | Eureka/Consul/Zookeeper | Zookeeper |
负载均衡 | Ribbon | 自带 |
网关 | Zuul | - |
分布式追踪 | Spring Cloud Sleuth | - |
容错 | Hystrix | 不完善 |
通信方式 | HTTP、Message | RPC |
安全模块 | Spring Cloud Security | - |
2.4 Kubernetes
Kubernetes是Google开发的容器集群管理系统,具有以下特点:
- Planet Scale大容量
- Never Outgrow永不过时
- Run Anywhere随时随地运行
Kubernetes提供的功能:
- Automatic Binpacking自动包装
- Self-healing自我修复
- Horizontal Scaling横向扩展
- Service Discovery and Load Balancing服务发现和负载均衡
- Automated Rollouts and Rollbacks自动部署或回滚
- Secret and Configuration Management配置管理
- Storge Orchestration存储编排
- Batch execution批量处理
Kubernetes完全可以成为构建和部署为服务的一个工具,是从服务编排上实现的。
与Spring Cloud对比:
关注点 | Spring Cloud | Kubernetes |
---|---|---|
配置管理 | Spring Cloud Config | Kubernetes ConfigMap |
服务发现 | Eureka/Consul/Zookeeper | Kubernetes Services |
负载均衡 | Ribbon | Kubernetes Services |
网关 | Zuul | Kubernetes Services |
分布式追踪 | Spring Cloud Sleuth | Open tracing |
容错 | Hystrix | Kubernetes Health Check |
安全模块 | Spring Cloud Security | - |
分布式日志 | ELK | EFK |
任务管理 | Spring Batch | Kubernetes Jobs |