Spring cloud alibaba之Ribbon负载均衡实现方案

网友投稿 1142 2022-12-25

Spring cloud alibaba之Ribbon负载均衡实现方案

Spring cloud alibaba之Ribbon负载均衡实现方案

目录1.什么是Ribbon1.1客户端的负载均衡1.2服务器端的负载均衡1.3常见负载均衡算法2.Nacos使用Ribbon3.Ribbon负载均衡策略3.1常用负载均衡描述3.3修改默认的负载均衡策略--配置文件的方式3.4自定义负载均衡策略4.使用spring cloud loadbalancer替代ribbon

1.什么是Ribbon

目前主流的负载均衡方案分为以下两种:

(1)集中式负载均衡:在消费者和服务提供者中间使用独立的代理方式进行负载,有硬件的(F5),软件的Nginx

(2)客户端事先拿到提供者请求连接集合,根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡。

Spring cloud Ribbon是基于Netflix Ribbon实现的一套客户端的负载均衡工具,Ribbon客户端提供一系列完善的配置,如超时、重试等。通过Load Balancer获取到服务器提供的所有机器实例,Ribbon会自动基于某种规则(轮询、随机)去调用这些服务。Ribbon也可以实现自己的负载均衡算法。

1.1客户端的负载均衡

例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡,即在客户端进行负载均衡算法分配。

1.2http://服务器端的负载均衡

例如通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端进行负载均衡算法分配。

1.3常见负载均衡算法

(1)随机:通过随机选择服务进行执行,一般这种方法使用较少

(2)轮询:负载均衡默认实现方式,请求来之后排队处理

(3)加权轮询:通过对服务器性能的分型,给高配置、低负载的服务器分配更高的权重,均衡各个服务器的压力

(4)地址Hash,通过客户端地址请求地址的hash值取模映射进行调度,

(5)最小链接数:即使请求均衡了,压力不一定会均衡,最小链接数法就是根据服务器的情况,例如请求积压数的参数,将请求分配到当前压力最小的服务器上

2.Nacos使用Ribbon

(1)Nacos disconvery中默认已经引入了Ribbon,不需要单独引入

(2)添加@LoadBalanced注解

(3)调用的时候使用服务器名称替代ip+端口,即使用默认轮询的负载均衡方式

3.Ribbon负载均衡策略

3.1常用负载均衡描述

①RandomRule:随机选择一个服务实例

②RoundRobinRule:轮询负载均衡策略

③RetryTule:在轮询的基础上进行重试,一直重试的次数由服务连接的超时时间控制

④WeightedResponseTimeRule:一个服务的平均响应时间越短,则权重越大,那么改实例被选中执行任务的概率也越大

⑤BestAvaliableRule:过滤掉失效的服务实例,顺便找出并发最小的服务实例来使用

⑥ZoneAvoidanceRule:判断所在的区域,选择最近的服务调用

⑦NacosRule:按随机与配置的权重进行选择服务器

3.2修改默认的负载均衡策略--配置类的方式

①赋值一份消费端项目OrderNacos,重命名为OrderRibbon

删除OrderRibbon中原先的OrderNacos.iml文件

修改OrderRibbon的pom.xml的ArtifactId值

把新添加的OrderRibbon添加到父项目的pom.xml的module中

刷新maven项目

②创建RibbonConfig配置类

使用@Configuration标识是配置类,使用@Bean注入到spring容器中,方法名必须叫iRule,否则无效。

/**

* 重写负载均衡配置类

*/

@Configuration

public class RibbonConfig {

//方法名一定要叫iRule

@Bean

public IRule iRule(){

return new RandomRule();

}

}

****注意此配置类不能放在@SpringBootApplication的注解@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享,

springboot启动类,没有配置扫描范围的话,默认扫描到与启动类OrderApplication同目录级别的文件,此处为qingyun包下的文件都会被扫描到。

配置的目录如下:

③在启动类中使用注解@RibbonClients加入配置的自定义负载均衡器,value里面可以配置多个负载均衡器,是个数组类型的值;调用服务创建的RestTemplate使用@LoadBalanced进行修饰。

启动消费者,两个不同端口的服务提供者,通过页面访问,查看负载均衡机制由之前默认的改为轮询的方式

3.3修改默认的负载均衡策略--配置文件的方式

使用配置文件的方式设定负载均衡方式,具体到某个服务,格式:服务名.ribbon.NFLoadBalancerRuleClassName=服务方式

stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule

在nacos管理界面配置服务器的权重,权重越大,被选中的概率越大。

也可以在项目配置文件中设置

#设置服务的权重

spring.cloud.nacos.discovery.weight=4

3.4自定义负载均衡策略

(1)定义一个类继承AbstractLoadBalancerRule,重写choose方法

/**

* 自定义负载均衡策略

*/

public class CustomRule extends AbstractLoadBalancerRule {

@Override

public void initWithNiwsConfig(IClientConfig iClientConfig) {

}

@Override

public Server choose(Object o) {

ILoadBalancer loadBalancer = this.getLoadBalancer();

//获取当前请求的实例集合

List reachableServers = loadBalancer.getReachableServers();

//使用线程安全生成一个随机数

int i = ThreadLocalRandom.current().nextInt(reachableServers.size());

//获取服务

Server server = reachableServers.get(i);

return server;

}

}

(2)在application.properties中添加配置信息,指向自定义的配置类

stock-service.ribbon.NFLoadBalancerRuleClassName=com.rule.CustomRule

(3)开启ribbon饥饿加载

当没有任何配置的情况下,第一次请求服务时,才会请求加载对应的服务实例

可以在配置文件application.properties中配置饥饿加载

#开启ribbon饥饿加载

ribbon.eager-load.enabled=true

#饥饿加载是服务,多个使用逗号隔开

ribbon.eager-load.clients=stock-service

启动项目的时候,加载配置服务使用的负载均衡策略

4.使用spring cloud loadbalancer替代ribbon

(1)在pom.xml中引入nacos-discovery时,去除ribbon,此时项目依赖的包里面已经移除ribbon

(2)pom.xml中添加loadbalancer依赖,前提是项目中已经引入了spring cloud依赖(父maven已经引入)

org.springframework.cloud

spring-cloud-starter-loadbalancer

(3)创建RestTemplate时,需要加@LoadBalanced

//程序启动时创建RestTemplate

//使用注解LoadBalanced标识负载均衡,默认轮询的方式

@Bean

@LoadBalanced

public RestTemplate restTemplate(RestTemplateBuilder builder){

RestTemplate build = builder.build();

return build;

}

(4)application.properties中禁用ribbon

#禁用ribbon

spring.cloud.loadbalancer.ribbon.enabled=false

(5)若是想自定义loadbalancer,与自定义ribbon类似的方式,使用@LoadBalancerClients配置到springboot启动类中

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:酒泉市一体化政务服务平台(酒泉市人民政府官网)
下一篇:智能车载终端是什么?智能车载终端的主要功能包括哪些?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~