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
			| 
								 
											6 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();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |