forked from rongchao/epmet-cloud-rizhao
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
95 lines
2.8 KiB
5 years ago
|
package com.epmet.loadbalancer;
|
||
|
|
||
|
import com.netflix.client.config.IClientConfig;
|
||
|
import com.netflix.loadbalancer.ILoadBalancer;
|
||
|
import com.netflix.loadbalancer.Server;
|
||
|
import com.netflix.loadbalancer.ZoneAvoidanceRule;
|
||
|
import org.apache.commons.lang3.StringUtils;
|
||
|
import org.slf4j.Logger;
|
||
|
import org.slf4j.LoggerFactory;
|
||
|
import org.springframework.core.env.Environment;
|
||
|
import org.springframework.util.CollectionUtils;
|
||
|
|
||
|
import java.util.List;
|
||
|
|
||
|
/**
|
||
|
* Epmet负载均衡算法规则类。当前支持读取环境变量,将请求重定向到指定的HOST:PORT
|
||
|
*
|
||
|
* @RibbonClient(name = "MS-PROXY", configuration = EpmetRequestLoadBalancerRule.class)
|
||
|
*
|
||
|
* @Bean
|
||
|
* @LoadBalanced
|
||
|
* public RestTemplate getRestTemplate() {
|
||
|
* return new RestTemplate();
|
||
|
* }
|
||
|
*
|
||
|
* @Bean
|
||
|
* public IRule getMyLoadBalancerRule(Environment env) {
|
||
|
* EpmetRequestLoadBalancerRule rule = new EpmetRequestLoadBalancerRule();
|
||
|
* rule.setEnv(env);
|
||
|
* return rule;
|
||
|
* }
|
||
|
*
|
||
|
*/
|
||
|
public class EpmetRequestLoadBalancerRule extends ZoneAvoidanceRule {
|
||
|
|
||
|
private static Logger logger = LoggerFactory.getLogger(EpmetRequestLoadBalancerRule.class);
|
||
|
|
||
|
private Environment env;
|
||
|
|
||
|
public EpmetRequestLoadBalancerRule() {
|
||
|
}
|
||
|
|
||
|
public void setEnv(Environment env) {
|
||
|
this.env = env;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void initWithNiwsConfig(IClientConfig iClientConfig) {
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 此处会取环境变量中"测试服务器"的值,
|
||
|
* @param key
|
||
|
* @return
|
||
|
*/
|
||
|
@Override
|
||
|
public Server choose(Object key) {
|
||
|
ILoadBalancer loadBalancer = getLoadBalancer();
|
||
|
List<Server> servers = loadBalancer.getReachableServers();
|
||
|
if (CollectionUtils.isEmpty(servers)) {
|
||
|
logger.error("自定义负载均衡器:ReachableServers列表为空");
|
||
|
return super.choose(key);
|
||
|
}
|
||
|
Server server = servers.get(0);
|
||
|
String appName = server.getMetaInfo().getAppName();
|
||
|
String serviceName = appName.split("@@")[1];
|
||
|
String hostEnvKey = getHostEnvKey(serviceName);
|
||
|
String portEnvKey = getPortEnvKey(serviceName);
|
||
|
String epmetGovOrgHost = env.getProperty(hostEnvKey);
|
||
|
String epmetGovOrgPort = env.getProperty(portEnvKey);
|
||
|
if (StringUtils.isAnyBlank(epmetGovOrgHost, epmetGovOrgPort)) {
|
||
|
// 没有配置,走父类均衡器
|
||
|
return super.choose(key);
|
||
|
}
|
||
|
|
||
|
server.setHost(epmetGovOrgHost);
|
||
|
server.setPort(Integer.valueOf(epmetGovOrgPort));
|
||
|
return server;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取host环境变量Key
|
||
|
* @param serviceName
|
||
|
* @return
|
||
|
*/
|
||
|
public String getHostEnvKey(String serviceName) {
|
||
|
return serviceName.replace("-", "_").concat("_HOST").toUpperCase();
|
||
|
}
|
||
|
|
||
|
public String getPortEnvKey(String serviceName) {
|
||
|
return serviceName.replace("-", "_").concat("_PORT").toUpperCase();
|
||
|
}
|
||
|
}
|