nacos 手动实现负载均衡策略

9 篇文章 0 订阅
9 篇文章 0 订阅

nacos 手动实现负载均衡

手动实现源码

import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.beans.factory.annotation.Value;

  import org.springframework.cloud.client.ServiceInstance;

  import org.springframework.cloud.client.discovery.DiscoveryClient;

  import org.springframework.stereotype.Component;

  import java.net.InetAddress;

  import java.util.List;

  import java.util.Random;

  import java.util.concurrent.atomic.AtomicInteger;

  /**

 * nacos 手动实现服务治理负责均衡 随机,轮询,Hash

 */

  @Component

  public class ServiceInstanceLoadBalancer {

    //nacos 提供者服务名称

    @Value("${server.cloud.name}")

    private String providerServer;

    //负载均衡策略,该配置可改成动态方式

    @Value("${server.instance.type:0}")

    private String instanceType; // 0-随机,1-轮询,2-Hash

    //随机

    private static final String RANDOM = "0";

    //轮询

    //private static final String POLL = "1";

    //Hash

    private static final String HASH = "2";

    //获取随机数

    private static final Random random = new Random();
    
    //CAS 原子类 用于轮询使用

    private AtomicInteger poll = new AtomicInteger(0);

    //nacos注册服务客户端

    @Autowired
    protected DiscoveryClient discoveryClient;
    //获取服务提供者
    public ServiceInstance getServiceInstance(){
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances(providerServer);
        ServiceInstance serviceInstance =null;
        try {
            if (RANDOM.equals(instanceType)) {//随机
                serviceInstance = serviceInstanceList.get(random.nextInt(serviceInstanceList.size()));
            } else if (HASH.equals(instanceType)) {//IP Hash
                serviceInstance = serviceInstanceList.get(getIpHash() % serviceInstanceList.size());
            } else {//轮询,默认
                serviceInstance = serviceInstanceList.get(poll.getAndIncrement() % serviceInstanceList.size());
            }
        }catch (Exception e){
        }
        return serviceInstance;
    }

    //获取本地IP Hash 值

    private int getIpHash(){
        try {
            return InetAddress.getLocalHost().getHostAddress().hashCode();
        } catch (Exception e) {
            return 0;
        }
    }
}

属性字段解释

String providerServer nacos 服务端提供者服务名称

String instanceType 负载均衡策略,该配置可改成动态方式(disconf,apollo,redis)

Random random 随机数轮询

AtomicInteger pollCAS 原子类 用于轮询自增使用

DiscoveryClient discoveryClient: nacos 提供者客户端获取所有服务

方法解释

public ServiceInstance getServiceInstance()

根据instanceType策略(0-随机,1-轮询,2-Hash)获取服务端server

private int getIpHash()

获取本地IP地址转为HashCode(int),用于Hash方式获取服务端server

代码演示结果

instanceType (0-随机)策略

instanceType (1-轮询)策略

instanceType (2-Hash)策略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值