定制软件SpringCloud Alibaba之Ribbon 修改和自定义负载均衡策略

Ribbon 简介

Spring Cloud Ribbon定制软件是一个基于HTTP和TCP定制软件的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,定制软件可以让我们轻松地将面向服务的REST定制软件模版请求自动转换成客定制软件户端负载均衡的服务调用。Ribbon定制软件实现客户端的负载均衡,定制软件负载均衡器提供很多对http和tcp定制软件的行为控制。Spring cloud Feign已经集成Ribbon,所以注解@FeignClient的类,定制软件默认实现了ribbon的功能。定制软件它几乎存在于每一个Spring Cloud定制软件构建的微服务和基础设施中。在SpringCloud Alibabba组件中,定制软件当我们引入Nacos定制软件依赖的时候,也默认帮我们引入了Ribben的依赖。

**

Ribben的默认配置

**
使用ribben默认配置只需要定义一个RestTemplateBean并在方法上加上**@LoadBalanced** 的注解就可以使用了,默认负载均衡机制为轮训

    @Bean    @LoadBalanced   //ribbon的负载均衡注解    public RestTemplate restTemplate(){        return new RestTemplate();    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

**

Ribbon的

**
1, RoundRobinRule
Rabon默认采用轮询策略。如果在一轮轮询后找不到提供者,它最多可以轮询10轮
如果没有找到,则返回NULL。
例如,目前有三个提供者A、B和C,逐个对它们进行一次轮询。A、B和C不访问(一轮)。A、B、C三次访问(两轮)十次,如果它还不能访问,则返回NULL。

2, RandomRule
随机策略,从所有可用的提供者中选择。

3, RetryRule
重试策略:首先根据RoundRobin Rule策略获取提供者(策略制定者),直接返回。如果检索失败,请在指定的时间限制内重试,
缺省情况下,时间限制为500毫秒。[RoundRobin Rule轮询策略。]默认为10发。我会给你500毫秒给RetryRule。您可以重试,直到您找到它。]

4, BestAvailableRule
最可行的策略。选择并发性最高的提供者,即连接消费者数量最低的提供者。

5, AvailabilityFilteringRule
可以实现滤波算法。算法规则为:过滤掉处于融合状态和超过连接限制的提供者,对剩余的提供者采用轮询策略。

6, ZoneAvoidanceRule
区回避策略。根据提供程序所在的区域和提供程序的可用性选择提供程序。

7, WeightedResponseTimeRule
权重响应时间策略。每个提供者的权重是根据其平均响应时间计算的。响应时间越快,选择权重的可能性就越大。
在启动初期,采用轮询策略。之后,您将根据重量进行选择。

修改默认负载均衡策略

1.配置文件yaml中进行配置

#给某一个服务配置负载均衡策略nacos-provider: # 被调用的nacos中的服务名称  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
  • 1
  • 2
  • 3
  • 4

2.配置类
不能写在@SpringApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享,不建议这么使用,推荐yaml方式

import com.alibaba.cloud.nacos.ribbon.NacosRule;import com.netflix.loadbalancer.IRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class RibbonConfig {        /**     * 全局配置     */    @Bean    public IRule iRule(){        //指定使用Nacos提供的负载均衡策略(优先调用统一集群的实例,基于随机权重)        return new NacosRule();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在主启动类上添加@RibbonClients注解

//配置多个 RibbonConfig 不能被@SpringApplication注解的@CompentScan扫描到,否则就是全局配置效果//局部配置@RibbonClients(value = {  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class),  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class)})// 使用全局的配置//@RibbonClients(defaultConfiguration = RibbonConfig.class)public class ManageApplication {    public static void main(String[] args) {        SpringApplication.run(ManageApplication.class,args);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

自定义负载均衡策略

自定义负载均衡策略需要继承 AbstractLoadBalancerRule 抽象类

  1. 自定义一个带有权重的负载均衡器MyWeightRule
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;import com.alibaba.cloud.nacos.ribbon.NacosServer;import com.alibaba.nacos.api.exception.NacosException;import com.alibaba.nacos.api.naming.NamingService;import com.alibaba.nacos.api.naming.pojo.Instance;import com.netflix.client.config.IClientConfig;import com.netflix.loadbalancer.AbstractLoadBalancerRule;import com.netflix.loadbalancer.BaseLoadBalancer;import com.netflix.loadbalancer.ILoadBalancer;import com.netflix.loadbalancer.Server;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;/** * 自定义一个权重负载均衡策略 */@Slf4jpublic class MyWeightRule extends AbstractLoadBalancerRule {    @Autowired    private NacosDiscoveryProperties discoveryProperties;    @Override    public void initWithNiwsConfig(IClientConfig iClientConfig) {        // 读取配置文件, 并且初始化, ribbon内部基本上用不上    }    /**     * 这个方法是实现负载均衡策略的方法     *     * @param     * @return     */    @Override    public Server choose(Object key) {        try {            log.info("key:{}", key);            // 调用父类方法, 获取当前使用的负载均衡器            BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();            // 获取当前服务的名称            String serviceName = baseLoadBalancer.getName();            /**             * namingService: 获取nacos的服务发现API             */            NamingService namingService = discoveryProperties.namingServiceInstance();            /**             * 根据名称获取服务发现实例             * 在selectOneHealthyInstance中, nacos实现了权重的负载均衡算法             */            Instance instance = namingService.selectOneHealthyInstance(serviceName);            return new NacosServer(instance);        } catch (NacosException e) {            e.printStackTrace();        }        return null;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

2.启用自定义的负载均衡器应用
我们执行当前使用的负载均衡策略是自定义的权重负载均衡策略

import com.lxl.www.gateway.myrule.MyWeightRule;import com.netflix.loadbalancer.IRule;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class GlobalRibbonConfig {    @Bean    public IRule getRule() {        // 实现带有权重的负载均衡策略        return new MyWeightRule();    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

设置为全局配置GlobalRibbonConfig.class
//

//局部配置/*@RibbonClients(value = {  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class),  @RibbonClient(name = "服务名称",configuration = RibbonConfig.class)})*/// 使用全局的配置@RibbonClients(defaultConfiguration = GlobalRibbonConfig.class)public class ManageApplication {    public static void main(String[] args) {        SpringApplication.run(ManageApplication.class,args);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

开启饥饿加载,解决第一次调用慢的问题

ribbon:  eager-load:    #开启ribbon饥饿加载    enabled: true    #配置服务使用ribbon饥饿加载,多个使用逗号分隔    clients: 服务名称1,服务名称2,服务名称3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发