5、自定义负载均衡策略

第一种方案:通过配置文件application.yml

第一步:创建项目

参考 nacos入门案例的《第三部分:编写订单服务》拷贝一份,修改项目名为:order-ribbon

第二步:创建自定义rule

package com.example.rule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class CustomRule extends AbstractLoadBalancerRule {
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    public Server choose(Object o) {
        //这里实现自定义负载均衡器
        System.out.println("自定义负载均衡");
        ILoadBalancer loadBalancer = this.getLoadBalancer();

        //获取当前请求的服务的实例
        List<Server> reachableServers = loadBalancer.getReachableServers();

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

        Server server = reachableServers.get(random);
        return server;
    }
}

第三步:修改配置文件

server:
  port: 8084
#应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
#提供者微服务名
stock-service:
  ribbon:
    #指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
    NFLoadBalancerRuleClassName: com.example.rule.CustomRule

第四步:启动测试,发现是随机的

第二种方案:通过配置类

第一步:创建项目

参考 nacos入门案例的《第三部分:编写订单服务》拷贝一份,修改项目名为:order-ribbon

第二步:创建自定义rule

package com.example.rule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class CustomRule extends AbstractLoadBalancerRule {
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    public Server choose(Object o) {
        //这里实现自定义负载均衡器
        System.out.println("自定义负载均衡");
        ILoadBalancer loadBalancer = this.getLoadBalancer();

        //获取当前请求的服务的实例
        List<Server> reachableServers = loadBalancer.getReachableServers();

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

        Server server = reachableServers.get(random);
        return server;
    }
}

第三步:创建配置类

注意有坑,不能放在@ComponentScan能扫描到的地方,否则全部服务实例均为该负载均衡策略

package com.example.ribbon;

import com.example.rule.CustomRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonRandomRuleConfig {

    //方法名一定要叫iRule
    @Bean
    public IRule iRule(){
        return new CustomRule();
    }
}

第四步:application.yml

server:
  port: 8084
#应用名称(nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

第五步:修改启动类

package com.example.order;

import com.example.ribbon.RibbonRandomRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
//---------------------第一种方案:配置类---------------------------------------------------------------
//name属性是服务名,configuration属性是指该服务的负载均衡机制为该配置类修改的负载均衡机制
//表示stock-service服务实例使用RibbonRandomRuleConfig配置类配置的负载均衡机制,这里是随机机制
@RibbonClients(value = {
        @RibbonClient(name = "stock-service",configuration = RibbonRandomRuleConfig.class)
})
//------------------------------------------------------------------------------------
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }

    @Bean
    @LoadBalanced //负载均衡
    /**
     * 默认的负载均衡机制采用的类似轮询的这种均衡机制
     */
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        //spring官网建议RestTemplateBuilder构造器来进行构造,这里体现了构造者设计模式
        return builder.build();
    }
}

第六步:启动测试,发现是随机

解决负载均衡懒加载

Ribbon默认懒加载,意味着只有在发起第一次调用的时候才会创建客户端。 在进行服务调用的时候,如果网络情况不好,第一次调用会超时。

访问http://localhost:8084/order/add才会出现如下图

5、自定义负载均衡策略

解决方案:使用饥饿加载

在order-ribbon配置文件application.yml加上

##解决懒加载
ribbon:
  eager-load:
    #开启ribbon饥饿加载
    enabled: true
    #配置stock-service使用ribbon饥饿加载,多个使用逗号分隔
    clients: stock-service

解决懒加载重启order-ribbon
在一启动时就出现了

5、自定义负载均衡策略

上一篇:Spring Cloud Netflix超时时间设置


下一篇:〖Spring Cloud〗Feign:基于服务端的负载均衡