package org.springframework.cloud.netflix.ribbon;
import com.netflix.loadbalancer.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
import static org.springframework.cloud.netflix.ribbon.SpringClientFactory.NAMESPACE;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description: * 扩展 spring cloud ribbon的PropertiesFactory
* * 使其能够支持 配置全局的ribbon.NFLoadBalancerRuleClassName=package.YourRule
* * 然后各个微服务还可以根据自身情况做个性化定制。如:SERVICE_ID.ribbon.NFLoadBalancerRuleClassName=package.YourRule
* @Project:
* @CreateDate: Created in 2020/2/21 13:31
* @Author: liuke
*/
public class DefaultPropertiesFactory extends PropertiesFactory {
@Autowired
private Environment environment;
private Map classToProperty = new HashMap<>(5);
public DefaultPropertiesFactory() {
super();
classToProperty.put(ILoadBalancer.class, "NFLoadBalancerClassName");
classToProperty.put(IPing.class, "NFLoadBalancerPingClassName");
classToProperty.put(IRule.class, "NFLoadBalancerRuleClassName");
classToProperty.put(ServerList.class, "NIWSServerListClassName");
classToProperty.put(ServerListFilter.class, "NIWSServerListFilterClassName");
}
/**
* 重写 支持 ribbon.NFLoadBalancerRuleClassName=package.YourRule 全局配置的方式
*/
@Override
public String getClassName(Class clazz, String name) {
String className = super.getClassName(clazz, name);
// 读取全局配置
if(!StringUtils.hasText(className) && this.classToProperty.containsKey(clazz)){
String classNameProperty = this.classToProperty.get(clazz);
className = environment.getProperty(NAMESPACE + "." + classNameProperty);
}
return className;
}
}