【SpringCloud微服务架构】

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等功能;

  • 限流

    当并发访问量过大的时候,可以配置计算器算法、漏桶算法或者令牌桶算法实现请求限流。

    1. 路由转发:将来自客户端的请求转发到对应的微服务系统,同时可以针对不同的请求进行路由规则配置。
    2. 协议转换:将不同协议的请求转换成微服务所支持的协议,如将 REST 转换成 Dubbo 或者 gRPC 协议。
    3. 请求过滤:对请求进行统一的鉴权、限流、参数校验、日志输出等预处理,从而减轻后端服务压力,提高系统的吞吐量和稳定性。
    4. 负载均衡和服务注册:配置多实例来实现负载均衡,同时要有服务注册与发现机制,可以根据需要自由地添加、删除微服务实例。
    5. 安全认证:对请求进行安全认证,比如用户身份认证、请求合法性校验等。
    6. 熔断降级:在服务不可用、拒绝服务或者超时等情况下,进行熔断降级处理,防止整个系统崩溃。

五.服务熔断降级

在微服务体系架构中,如果某源头服务出现问题,例如网络延迟,会对调用服务造成的影响,有时甚至由于同时访问目标过多,会导致服务瘫痪,甚至导致服务“雪崩”。熔断器就是一种应对这种灾难风险的策略。 当服务不可以使用是或者是服务到达某个临界点时, 对该服务进行阻断的处理方式, 通过这种方式,可以容忍这样的灾难服务,而不会使整个大的体系崩溃,有点像家庭用电里的断路保险盒,某个线路负载过重了,只是断掉该线路,而整个家庭线路依然可以提供服务。

我们常用的熔断器有Hystrix、Setinel,其中Setinel提供了图形化管理界面,我们使用更多的是Setinel。

熔断器的工作流程:

1.默认情况下熔断器的状态是关闭的,所有的请求都能正常访问调用;

2.如果在指定时间内,访问失败的请求比例达到阈值,比如10秒内有20个访问请求,其中有10次失败了,访问失败的比例达到50%。这时熔断器就会打开;

3.熔断器处于打开状态的时候,所有的请求都不能正常访问;

4.当熔断器处于打开状态的时间达到了指定的休眠时间,熔断器就会进入半开状态,这时他会允许一个随机请求进行访问;

5.如果这个请求成功了,则修改熔断器的状态为关闭;如果请求失败了,则修改熔断器的状态为打开,重新等待休眠时间,然后再次进入半开状态,直到服务能够成功访问。

的休眠时间,熔断器就会进入半开状态,这时他会允许一个随机请求进行访问;

5.如果这个请求成功了,则修改熔断器的状态为关闭;如果请求失败了,则修改熔断器的状态为打开,重新等待休眠时间,然后再次进入半开状态,直到服务能够成功访问。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值