SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性简化了分布式系统的开发
如:服务发现,负载均衡,断路器,智能路由,微代理,控制总线等等
微服务架构示例包含:
服务注册与发现(Eureka),客户端负载均衡(Ribbon),断路器(Hystrix)
- 微服务架构的优势
可扩展性:微服务架构可以通过添加或者删除服务来扩展或缩小系统规模
独立部署:微服务可以独立部署,使得开发人员可以在不影响整个系统的情况下更新和维护单个服务。
灵活性:微服务可以使用不同的技术和语言进行开发,使得开发人员可以选择最合适他们的工具。
- 核心设计理念
1 注册中心:服务发现和注册是微服务架构的核心,SpringCloud使用Eureka,Consul或者Zookeeper等注册中心来实现服务的发现和注册。
Eureka是通过心跳检测,健康检查和客户端缓存等机制,提高系统的灵活性,可伸缩性和可用性
Eureka包含两个组件:Eureka Server和Eureka Client,Eureka Client是一个Java客户端。用于简化与Eureka Server 的交互,Eureka Server 提供服务发现的能力,各个微服务启动时,会通知Eureka Client和Eureka Server进行注册自己的信息,Eureka Server 会存储该服务的信息。
30S 客户端会每个30S去获取并更新数据
60S 服务端每隔60S 对客户端链接进行检查
90S 服务端超过90S没有接到客户端心跳,会移除该实例
15分钟 80% 如果15分钟内80%的客户端失效,就会启动自我保护机制。
@EnableEurekaServer 和 @EnableEurekaClient 注解分别用于标记应用为注册中心和服务提供者/消费者。服务消费者使用 @FeignClient 注解定义了一个远程调用的接口。当服务消费者需要调用服务提供者的服务时,它会通过 Feign 客户端进行远程调用。
2 负载均衡:在微服务架构中,服务可能会被部署在多个实例上,因此需要使用负载均衡算法来平衡流量,SpringCloud提供了Ribbon实现客户端负载均衡。
负载均衡是高并发高可用系统必不可少的组件
负载均衡器是基于Netflix Ribbon实现的,是一个客户端负载均衡器,它可以在客户端配置服务提供者的列表,并且可以根据特定的负载均衡策略来选择服务提供者。
Ribbon的配置和使用通常是隐式的,因为Spring Cloud集成了Ribbon,并且通过Spring Cloud Netflix提供了一套简化的声明式服务调用模板。
负载均衡的策略
轮询:默认策略,请求按顺序依次分配到各服务器
随机:请求随机分配到各服务器
最少活跃调用数:使用服务器的活跃请求数量来决定分配
最小响应时间:根据服务器响应时间来决定分配。
调用示例:
通常会有一个服务消费者(RestTemplate)来调用服务提供者。
服务提供者会注册到服务发现组件比如Eureka
消费者会使用服务提供者的名字进行调用,Ribbon会根据服务提供者的名字来查询服务列表,并根据配置的负载均衡策略来选择具体的服务提供者实例。
分为客户端的负载均衡和服务端的负载均衡
服务端的负载均衡,比如订单服务调用商品服务,此时订单服务就是客户端,商品服务就是服务端
Nginx就是一个比较有名的负载均衡器,请求会先到达负载均衡器,然后通过负载均衡算法,在多个服务之间访问。
客户端服务均衡时客户端进行负载均衡算法的分配,客户端先到注册中心获取服务列表,接下来客户端把负载均衡以代码公共类库的方式放到客户端,然后客户端获取服务列表之后,根据算法进行选择访问
负载均衡是一种思想,即按照什么样的策略进行负载均衡分配,目前支持
轮询策略和随机策略,Spring Cloud LoadBalancer 默认的策略是轮训策略
public class CustomLoadBalancerConfiguration { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RandomLoadBalancer(loadBalancerClientFactory .getLazyProvider(name, ServiceInstanceListSupplier.class), name); } }
3 服务网关:服务网关是微服务架构中的另一个重要组件,它可以将客户端的请求路由到不同的微服务实例上。Gateway和Netflix Zuul是常用的服务网关。
过滤器和Zuul的过滤器在概念上类似,可以使用Filter拦截和修改请求,实现对上游的响应,进行二次处理,实现横切与应用无关的功能,如安全、访问超时设置、限流等功能
路由,网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个ID、一个目标URI、一组断言和一组过滤器组成。如果断言为真,则路由匹配,目标URI会被访问
断言
4 熔断器:在微服务架构中,由于服务之间调用可能会产生故障,因此需要使用熔断器来保护系统免受故障的影响,SpringCloud Hystrix提供了熔断器的实现。
原理是基于断路器模式,这是一种分布式系统中防止服务雪崩效应的重要机制,
监控与统计:Hystrix为每个依赖服务的调用都包装成一个HystrixCommand或HystrixObservableCommand对象。它会跟踪该命令的成功、失败、超时和拒绝等指标,并维护这些指标的统计信息
断路器状态:Hystrix的断路器有三种状态:关闭(Closed)、开启(Open)和半开(Half-Open)。
- 关闭状态:初始状态,允许请求正常通过到后端服务。
- 开启状态:当一定时间内失败率达到阈值(如50%失败率)时,断路器切换到开启状态,此时所有对该服务的请求将不再实际执行,而是直接失败并调用降级逻辑(Fallback)。
- 半开状态:经过一段时间(如默认的5秒),断路器会自动切换到半开状态,此时会允许少量请求尝试通过,如果这些请求成功,则认为服务恢复正常,断路器回到关闭状态;如果请求仍然失败,则断路器再次变为开启状态。
降级逻辑:当断路器开启时,Hystrix会执行预先定义的降级逻辑(Fallback),提供一个备选的响应,而不是让请求长时间阻塞或抛出异常。
资源隔离:通过线程池或信号量来实现服务间的资源隔离,即使某个服务出现故障或延迟,也不会耗尽整个系统的线程资源
5 配置中心:微服务架构中的配置管理也是非常重要的,SpringCloud提供了Config Server和Config Client来管理分布式系统的配置。
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每次服务都需要必要的配置信息才能运行,所以也面临了一些问题
随着微服务工程的越来越多,每个工程都有一套配置文件,系统膨胀,如果每个项目都有公共的比如数据库连接信息,没有统一的管理,想要修改则需要每个工程都有修改,所以我们通常有很多系统环境如: prod-生产环境,test-测试环境,dev-预发布环境。因此一套集中式的,动态的管理设施是必不可少的。