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.
		
		
		
		
		
			
		
			
				
					
					
						
							94 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							94 lines
						
					
					
						
							2.8 KiB
						
					
					
				| 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(); | |
|     } | |
| }
 | |
| 
 |