spring cloud alibaba组件实现原理

3 篇文章 0 订阅
2 篇文章 1 订阅

Ribbon原理:

最核心的是 LoadBalancerlnterceptor.intercept 这个拦截器

拦截请求的url进行解析。

请求注册中心,例如:nacos,根据服务名称,会将ip、端口、等信息拿到本地来(注册表),然后去本地查询对应的服务信息,再去调用对应的服务,(ribbon调用服务 默认是轮训调用)

 减少库存、加积分等服务启动的时候会往nacos注册中心注册自己的服务信息,例如ip、端口等。

如果添加新的服务,也不需要重启整个系统,新服务启动后会往注册中心nacos中,nacos的动态感知的,ribbon是通过定时任务(心跳的原理),每隔一段时间(不会很久)就去nacos注册中心拉取一次然后覆盖本地。

如果某个服务挂了,每个服务引入nacos包,会定时给注册中心发送心跳,如果服务挂了,就不会给注册中心发心跳了, 注册中心如果 太久没收到发送的心跳,就认为这个服务挂了,就会从注册中心移除这个服务,当ribbon再去nacos注册中心拉取的时候覆盖本地,本地就没有这个服务了,

在某服务挂了期间但是在ribbon还没获取到注册中心最新数据之前,还是有可能会获取并请求这个挂的服务,这种情况会报错,但是报错后ribbon会重试再调用其他服务(集群)。

Ribbon负载均衡策略

IRule
这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。

AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。

RandomRule
看名字就知道,这种负载均衡策略就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象,然后在它重写的choose方法又调用了choose(ILoadBalancer lb, Object key)这个重载的choose方法,在这个重载的choose方法中,每次利用random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。

RoundRobinRule
RoundRobinRule这种负载均衡策略叫做线性轮询负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)函数整体逻辑是这样的:开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX。

RetryRule (在轮询的基础上进行重试)
看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。

WeightedResponseTimeRule( 权重 —nacos的NacosRule ,Nacos还扩展了一个自己的基于配置的权重扩展 )
WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展,WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫DynamicServerWeightTask的定时任务,默认情况下每隔30秒会计算一次各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。

ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule,choose方法还是采用了RoundRobinRule的choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。

BestAvailableRule
BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。

ZoneAvoidanceRule ( 默认规则,复合判断server所在区域的性能和server的可用性选择服务器。 )
ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以AvailabilityPredicate 为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询( RoundRobinRule )的方式从过滤结果中选择一个出来。AvailabilityFilteringRule(先过滤掉故障实例,再选择并发较小的实例)过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
 

openFeign原理:

最核心的是代理;

当调用某个接口的时候,底层代理对象会将@FeignClient(value ="stock-service") 的value值和接口的@GetMapping("/stock/deduct/{productId}/{stockCount}")值拼接一个可以直接访问的url地址 :http://stock-service/stock/deduct/{productId}/{stockCount}

 底层借住ribbon实现服务发现,实现负载均衡去远端调用。

 服务限流sentinel

降级后可以将这次信息记录到日志或者数据库单独一个表,通过定时任务去处理这个降级问题

 降级操作

 sentinel会拦截或者过滤所有的请求,会获取到所有的http请求,对这个这些请求进行处理,放行或者流控 

Nacos服务

Nacos服务注册表结构:Map<namespace,Map<group:serviceName, Service>>

通过namespace来区分是开发环境dev还是测试环境test还是生产环境product,通过两个嵌套的map来实现的,外map的key存放环境名称,内map的key是对应的服务名称(分组了)

nacos中服务启动停止的执行流程

nacos是基于spring boot写的一个web项目,其实就是通过暴露一些接口,供其他服务通过http的方式去调用。

关于 Nacos Starter 更多的配置项信息地址:

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

配置项Key默认值说明

服务端地址

spring.cloud.nacos.discovery.server-addr

Nacos Server 启动监听的ip地址和端口

服务名

spring.cloud.nacos.discovery.service

${spring.application.name}

给当前的服务命名

服务分组

spring.cloud.nacos.discovery.group

DEFAULT_GROUP

设置服务所处的分组

权重

spring.cloud.nacos.discovery.weight

1

取值范围 1 到 100,数值越大,权重越大

网卡名

spring.cloud.nacos.discovery.network-interface

当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址

注册的IP地址

spring.cloud.nacos.discovery.ip

优先级最高

注册的端口

spring.cloud.nacos.discovery.port

-1

默认情况下不用配置,会自动探测

命名空间

spring.cloud.nacos.discovery.namespace

常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

AccessKey

spring.cloud.nacos.discovery.access-key

当要上阿里云时,阿里云上面的一个云账号名

SecretKey

spring.cloud.nacos.discovery.secret-key

当要上阿里云时,阿里云上面的一个云账号密码

Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息

日志文件名

spring.cloud.nacos.discovery.log-name

集群

spring.cloud.nacos.discovery.cluster-name

DEFAULT

配置成Nacos集群名称

接入点

spring.cloud.nacos.discovery.enpoint

UTF-8

地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址

是否集成Ribbon

ribbon.nacos.enabled

true

一般都设置成true即可

是否开启Nacos Watch

spring.cloud.nacos.discovery.watch.enabled

true

可以设置成false来关闭 watch

Seata 服务端

分布式事务协调者,通过@GlobalTransactional开启全局事务,产生一个XID,向TC开启一个全局事务,其他子服务使用@Transactional使用本地事务,

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloudAlibaba是一个基于Spring Cloud的微服务框架,它包含了多个组件,每个组件都有不同的原理和作用。其中,Nacos是服务注册中心,负责服务的注册和发现,可以帮助实现微服务架构下的服务治理。Dubbo是一个RPC调用框架,它负责处理负载均衡、网络连接和RPC调用等任务,使得微服务之间可以方便地通信。Sentinel是流量防护组件,用于监控和控制微服务的流量,保证系统的稳定性和安全性。最后一个组件是Seata,它是一个分布式事务组件,用于解决分布式事务的一致性和隔离性问题。 总之,SpringCloudAlibaba组件原理包括服务注册和发现、RPC调用、流量控制和分布式事务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring cloud alibaba组件实现原理](https://blog.csdn.net/qq_36961226/article/details/117445594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [拜托,面试请不要再问我 Spring Cloud Alibaba 底层原理](https://blog.csdn.net/qq_42046105/article/details/123468936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值