SpringCloud
一.注册中心
1.1Zookeeper
Zookeeper没有针对服务发现设计数据模型,它的数据是以⼀种更加抽象的树形 K-V 组织的,因此理论上可以存储任何语义的数据,常用作为RPC服务的注册中心。
它的健康检测是使用TCP的KeepAlive确保客户端和服务端的连接。
1.2Eureka
Eureka采用了CAP原理中的AP模型,即可用性(Availability)和分区容错性(Partition Tolerance),牺牲了一致性性(Consistency),通过心跳机制来维护服务实例的状态,这里的心跳检测是服务向Eureka发送心跳包,并通过负载均衡实现服务端的负载均衡。
1.3Nacos
Nacos可以作为服务注册中心,支持服务自动注册和注销,并可通过服务实例列表的方式动态地发现可用的服务实例。
在服务注册时,Nacos还提供了健康检查和心跳机制,保证服务的可用性和稳定性。如果是临时实例,Nacos的健康检测是由服务向Nacos定时发送心跳包,如果服务失去连接超过30秒,Nacos认为它宕机了,会从服务的实例列表中进行剔除,它是实现AP高可用的模式;如果是非临时实例,Nacos的健康检测是通过Nacos主动向服务发送心跳包进行检测,如果服务失去连接超过30秒,Nacos不会把它从实例列表中移除,而是等待它修复好重新上线,这是实现CP强一致性的模式。
Nacos服务注册和发现的具体工作流程如下:
- 服务注册
服务提供者在启动时,向Nacos注册中心发送一个HTTP请求,包含服务名、IP地址、端口号、健康状态等信息。Nacos将这些信息进行注册,并返回一个唯一的标识符给服务提供者,用于后续的服务发现和调用。
- 服务发现
服务消费者在启动时,向Nacos注册中心发送一个HTTP请求,请求一个指定服务的服务实例列表。Nacos将该请求路由到注册该服务的任意一台Nacos Server上,并返回该服务的一个服务实例列表,包含IP地址、端口号、健康状态等信息,服务消费者根据这些数据选择一个最优的服务实例进行服务调用。
另外Nacos还可以作为配置中心,实现云端配置的热更新。
1.4Consul
Consul是国外常用的开源服务注册中心。Consul提供了高可用性、分布式架构、支持服务运行状况检查等功能。通过Consul,服务可以自动注册和注销,服务消费方可以动态的查询可用的服务实例,并将请求分发给服务提供方。
二、负载均衡
负载均衡是分布式计算系统中常用的一种技术,主要作用是在多个服务器中分配请求,使每个服务器的负载得到合理分配,提高了整个系统的处理性能和可用性。
常见的负载均衡策略有以下几种:
- RoundRobinRule:轮询。在存活服务中随机选择,默认策略。
- RandomRule:随机访问。在存活服务中随机选择。
- RetryRule:轮询重试。先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,默认重试间隔500毫秒。
- WeightedResponseTimeRule:响应速度决定权重。是对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,权重越大越容易被选择。
- BestAvailableRule:最优可用。优先选择并发连接数最少的服务,有固定的默认最小连接数,当所有服务的连接数都大于默认最小连接数,使用RoundRobinRule策略。
- AvailabilityFilteringRule:可用性过滤规则。先过滤掉故障实例,再选择并发连接数较小的实例。
- ZoneAvoidanceRule:区域内可用性能最优。首先判断一个zone的运行性能是否可用,剔除不可用的区域zone的所有server,然后再利用AvailabilityPredicate过滤并发连接过多的服务。
我们可以通过创建一个负载均衡的配置类,里面注册一个Bean,返回一个IRule接口的实现类,这个实现类就可以指定具体的负载均衡策略。
三.同步服务远程调用
Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式进行了封装,我们就不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。
OpenFeign的工作流程:
- 定义Feign客户端
使用@FeignClient注解定义一个Feign客户端,其中name属性为服务名,需要配合微服务的注册中心使用。在接口方法中使用@RequestMapping注解来定义HTTP请求类型、路径和参数。
- 注入Feign客户端
在需要调用该服务的类中,使用@Autowired注解将定义的Feign客户端注入进来,可以直接调用定义的接口方法来发起HTTP请求。
- 实现远程服务调用
完成客户端的注入后,可以通过调用Feign客户端中定义的接口方法,内部会自动进行服务发现和负载均衡,并封装成HTTP请求发送给远程服务,同时也支持多种自定义拦截器和配置项,以便定制不同的请求场景。
- 服务降级和容错
当服务出现异常或者超时等情况时,OpenFeign可以根据预设Fallback逻辑自动降级或者返回默认值,从而保证整个系统的稳定性和可用性。
四.网关
SpringCloud中常用的网关组件有Gateway、Zuul。Zuul使用的是阻塞式的 API,不支持长连接,仅支持同步。因此,现在主流使用的网关就是Gateway。
Gateway的功能:
-
请求路由
可以根据请求断言,把客户端发送的请求路由到指定的微服务进行处理;
-
全局过滤器
其实Gateway中还提供了默认过滤器和路由过滤器,但我们最常用的还是全局过滤器,通过这个全局过滤器,我们可以实现比如登录鉴权,添加请求头token等功能;
-
限流
当并发访问量过大的时候,可以配置计算器算法、漏桶算法或者令牌桶算法实现请求限流。
- 路由转发:将来自客户端的请求转发到对应的微服务系统,同时可以针对不同的请求进行路由规则配置。
- 协议转换:将不同协议的请求转换成微服务所支持的协议,如将 REST 转换成 Dubbo 或者 gRPC 协议。
- 请求过滤:对请求进行统一的鉴权、限流、参数校验、日志输出等预处理,从而减轻后端服务压力,提高系统的吞吐量和稳定性。
- 负载均衡和服务注册:配置多实例来实现负载均衡,同时要有服务注册与发现机制,可以根据需要自由地添加、删除微服务实例。
- 安全认证:对请求进行安全认证,比如用户身份认证、请求合法性校验等。
- 熔断降级:在服务不可用、拒绝服务或者超时等情况下,进行熔断降级处理,防止整个系统崩溃。
五.服务熔断降级
在微服务体系架构中,如果某源头服务出现问题,例如网络延迟,会对调用服务造成的影响,有时甚至由于同时访问目标过多,会导致服务瘫痪,甚至导致服务“雪崩”。熔断器就是一种应对这种灾难风险的策略。 当服务不可以使用是或者是服务到达某个临界点时, 对该服务进行阻断的处理方式, 通过这种方式,可以容忍这样的灾难服务,而不会使整个大的体系崩溃,有点像家庭用电里的断路保险盒,某个线路负载过重了,只是断掉该线路,而整个家庭线路依然可以提供服务。
我们常用的熔断器有Hystrix、Setinel,其中Setinel提供了图形化管理界面,我们使用更多的是Setinel。
熔断器的工作流程:
1.默认情况下熔断器的状态是关闭的,所有的请求都能正常访问调用;
2.如果在指定时间内,访问失败的请求比例达到阈值,比如10秒内有20个访问请求,其中有10次失败了,访问失败的比例达到50%。这时熔断器就会打开;
3.熔断器处于打开状态的时候,所有的请求都不能正常访问;
4.当熔断器处于打开状态的时间达到了指定的休眠时间,熔断器就会进入半开状态,这时他会允许一个随机请求进行访问;
5.如果这个请求成功了,则修改熔断器的状态为关闭;如果请求失败了,则修改熔断器的状态为打开,重新等待休眠时间,然后再次进入半开状态,直到服务能够成功访问。
的休眠时间,熔断器就会进入半开状态,这时他会允许一个随机请求进行访问;
5.如果这个请求成功了,则修改熔断器的状态为关闭;如果请求失败了,则修改熔断器的状态为打开,重新等待休眠时间,然后再次进入半开状态,直到服务能够成功访问。