Spring Cloud系列(一)——相关概念及组件简介
微服务架构
发展过程:
1. 单体架构–>集群与垂直化
在业务的发展过程中,由于用户量和访问量的不断扩大,单体架构下服务器无法支撑高负载,因此出现了两种优化方法:
- 横向增加服务器——集群
- 垂直拆分业务为多个子业务——垂直化
2. SOA
为了解决以下问题:
出现了SOA (Service-Oriented Architecture ),即面向服务的架构。SOA架构将业务划分为了粗粒度的业务服务和业务流程作为服务层。而在服务层及不同系统间,采用ESB企业服务总线来作为通信桥梁。
3. 微服务
与SOA不同,微服务关注的重点在于:解耦。在微服务架构中可以将业务拆分的更细,相应的服务独立性更强,但管理大量的为服务也会变得复杂。因此微服务中的粒度需要根据实际业务情况而定,并不一定越细越好。
微服务框架的功能:
- 注册中心:可以注册服务、获得服务信息
- 配置中心:统一管理配置文件
- 服务链路追踪:追踪服务间的调用,有助于快速定位问题
- 负载均衡:保证服务高可用
- 服务容错:隔离、熔断、降级、限流等容错策略
- 隔离:线程池隔离(调用服务时给予固定线程数量)、信号量隔离(使用Semaphore实现,拿不到信号量时直接拒接)。线程池隔离适用于对延时要求不高的服务,信号量非常轻量级,对低延时的调用影响较小(常用)。
- 熔断:熔断器模型(closed状态:请求正常访问;open状态:所有请求被降级;half open状态:释放部分请求通过)
- 降级:服务压力增大时,系统将某些不重要的业务或接口功能降级,只提供部分功能或完全停止。
- 限流:漏桶算法;令牌桶算法;固定时间窗口算法
- 服务网关:可对用户请求进行限流、排队、过载保护、黑白名单、过滤拦截等操作
- 服务发布与回滚
- 服务动态伸缩、容器化
Spring Cloud框架及相关组件
? Spring Cloud框架是Spring提供的微服务框架,借助了Spring Boot并利用其特性和优势简化了开发步骤,做到一键启动和部署。
Eureka:服务注册和发现 组件
Eureka是一个用户服务注册和发现的组件。
? 为什么要使用Eureka?在微服务架构中,各个微服务之间存在业务关系,例如订单服务(服务消费者)需要调用支付服务(服务提供者)实现支付功能。调用时需要指定微服务的调用地址,当微服务的数量很多时,管理和维护服务的调用地址就变得非常困难,如果能有一个组件实现服务的注册和发现,要调用服务的时候就去找这个组件,由组件返回可用的服务提供者的集合,就降低了维护成本,提高了效率。
Eureka中有三大角色:服务提供者、服务消费者、注册中心
? 可以将注册中心看成物业,服务提供者看成住户,服务消费者则是抄水表员。每当有新的业主(服务提供者)入住,都需要向物业进行注册(服务注册),并且定期向物业交管理费(发送心跳),表明住户还住着,抄水表员向物业确认(获取服务列表)后则可以正常入室抄水表(消费服务)。当住户连续几个月没有交管理费(连续几次未发送心跳),则物业会将该户视为无人居住(剔除该服务),抄水表员则无法再入室抄水表。
LoadBalancer:负载均衡
负载均衡:将负载分摊到多个执行单元上。
常见方式:
- 一个独立进程单元,通过负载均衡策略,将请求转发到不用的执行单元。如Nginx。
- 将负载均衡逻辑以代码的形式封装到服务消费者的客户端,服务消费者客户端维护了一份服务提供者的信息列表,通过负载均衡策略将请求分摊给多个服务提供者。
LoadBalancer是Spring Cloud Commons的一个子项目,以上述第2种方式实现负载均衡。
使用方式:
- 与RestTemplate结合
- 与Feign相结合
RestTemplate:RESTful API接口请求框架
? RestTemplate提供了简单的方法来实现对REST服务的访问(支持常见的HTTP协议请求方法:POST、GET、PUT、DELETE等),并且可以将调用结果(一般为json)反序列化为指定对象,大大提高了开发效率。
Spring Cloud OpenFeign:HTTP客户端组件
? Feign是声明式的HTTP客户端组件,旨在使编写HTTP客户端变得更加容易。
? OpenFeign支持Spring MVC注解,同时集成了Spring Cloud LoadBalancer和Spring Cloud CircuitBreaker,即提供了负载均衡和熔断降级的功能。
? 在微服务框架中,OpenFeign主要用于微服务间的调用。
Resilience4j:轻量级容错框架
Resilience4j提供了一组高阶函数(装饰器),在使用时不需要引入所有依赖,只引入需要的依赖即可。
核心模块:
- resilience4j-circuitbreaker: 熔断
- resilience4j-ratelimiter: 限流
- resilience4j-bulkhead: 隔离
- resilience4j-retry: 自动重试
- resilience4j-cache: 结果缓存
- resilience4j-timelimiter: 超时处理
Spring Cloud Gateway:微服务网关
? 为了将各种微服务提供给外部应用调用,同时避免直接让客户端与各个微服务通讯(可能会存在:跨域请求、认证复杂、难以重构等问题),我们需要使用微服务网关将内部服务隐藏起来,统一管理,对外统一暴露api接口。
? 微服务网关能实现:路由、负载均衡、权限管理、身份认证等多种功能。
Spring Cloud Config:配置中心组件
? 为了降低维护配置文件的成本(在不同环境下需要有不同的服务连接配置;配置的更新),需要对配置进行统一的管理,因此可以将各个系统中的配置放到一个第三方组件上进行统一维护,同时,配置中心上的数据变更需要推送给相应的服务节点实现动态更新。
? Spring Cloud Config就是这样一个配置中心组件,且可以选择git、svn、本地文件作为存储。配置动态更新需要使用消息队列来实现,支持Kafka和RabbitMQ后续的实践中选择RabbitMQ
Spring Cloud Bus、Sping Boot Actuator:实现配置自动刷新
实现过程:
? 用户在git上修改了配置文件后,发起一个post请求/actuator/bus-refresh 到配置中心,此时配置中心的Spring Cloud Bus会发送消息给消息队列,监听该队列的各个微服务收到消息后会重新获取配置。
Spring Cloud Sleuth:链路追踪
? 由于各个微服务之间可能存在多层调用,当问题出现时难以定位,因此在微服务架构中需要实现分布式链路追踪,跟进每一个请求都有哪些服务参与,调用的顺序,从而实现问题快速定位。
|