1场景:本篇,是师范 ribbon 与nacos 的权重测试,ribbon读取 nacos内权重设置。

在调用端增加配置文件

代码如下:

(1) 本次测试nacos 1.4.1;

(2) spring cloud 版本:

org.springframework.cloud

spring-cloud-dependencies

Hoxton.SR1

pom

import

(3)ribbon版本:

org.springframework.cloud

spring-cloud-openfeign

2.2.1.RELEASE

..

package com.pooj.messager.fileHandel.config;

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;

import com.alibaba.cloud.nacos.NacosServiceManager;

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.*;

import lombok.extern.slf4j.Slf4j;

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

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

import java.util.List;

@Slf4j

@Component

public class ArtisanWeightedRule extends AbstractLoadBalancerRule{

@Resource

private NacosDiscoveryProperties discoveryProperties;

@Override

public void initWithNiwsConfig(IClientConfig iClientConfig) {

//读取配置文件并且初始化,ribbon内部的, 几乎用不上

}

@Autowired

private NacosServiceManager nacosServiceManager;

@Override

public Server choose(Object key) {

// 1.获取服务的名称

BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();

String serverName = loadBalancer.getName();

// 2.获取NameService

NamingService namingService = nacosServiceManager.getNamingService(discoveryProperties.getNacosProperties());

try {

//3.此时Nacos Client会自动实现基于权重的负载均衡算法,获取健康实例

Instance instance = namingService.selectOneHealthyInstance(serverName);

return new NacosServer(instance);

} catch (NacosException e) {

log.error("获取healthy服务失败,原因是:{}", e.getErrMsg(), e);

}

return null;

}

//本地版本 discoveryProperties.namingServiceInstance() ,这个方法找不到。

//这里的方法,网上比较通用,预估是版本问题。换成以上版本。

/*try {

log.info("key:{}", key);

BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) this.getLoadBalancer();

log.info("baseLoadBalancer--->:{}", baseLoadBalancer);

//获取微服务的名称

String serviceName = baseLoadBalancer.getName();

//获取Nacos服务发现的相关组件API,网上用这个比较多,但是这个版本内没有这个方法

NamingService namingService = discoveryProperties.namingServiceInstance();

//获取 一个基于nacos client 实现权重的负载均衡算法

Instance instance = namingService.selectOneHealthyInstance(serviceName);

//返回一个server

return new NacosServer(instance);

} catch (NacosException e) {

log.error("自定义负载均衡算法错误");

}*/

}

2调用方注意,这里没有调用网关(spring gateway),直接调用服务名称

3测试结果:服务提供方,测试例子,调用十次结果;

权重0.8 的输出

权重0.2的输出

符合测试预期结束。

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: