Browse Source
2.gov-org-server,gov-mine-server引入epmet-commons-service-call模块,新增了loadBalanc配置demo,暂未启用master
7 changed files with 203 additions and 6 deletions
@ -0,0 +1,33 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<parent> |
||||
|
<artifactId>epmet-commons</artifactId> |
||||
|
<groupId>com.epmet</groupId> |
||||
|
<version>2.0.0</version> |
||||
|
</parent> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<artifactId>epmet-commons-service-call</artifactId> |
||||
|
<version>0.3.1</version> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>com.alibaba.cloud</groupId> |
||||
|
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> |
||||
|
</dependency> |
||||
|
|
||||
|
<!-- 替换Feign原生httpclient --> |
||||
|
<dependency> |
||||
|
<groupId>io.github.openfeign</groupId> |
||||
|
<artifactId>feign-httpclient</artifactId> |
||||
|
<version>10.3.0</version> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
|
||||
|
</project> |
@ -0,0 +1,94 @@ |
|||||
|
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(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
package com.epmet.config; |
||||
|
|
||||
|
import com.epmet.loadbalancer.EpmetRequestLoadBalancerRule; |
||||
|
import com.netflix.loadbalancer.IRule; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
|
||||
|
@Configuration |
||||
|
public class LoadBalancerConfig { |
||||
|
|
||||
|
//@Bean
|
||||
|
//@LoadBalanced
|
||||
|
//public RestTemplate getRestTemplate() {
|
||||
|
// return new RestTemplate();
|
||||
|
//}
|
||||
|
|
||||
|
/** |
||||
|
* 自定义负载均衡算法bean |
||||
|
* @return |
||||
|
*/ |
||||
|
@Bean |
||||
|
public IRule getMyLoadBalancerRule(Environment env) { |
||||
|
EpmetRequestLoadBalancerRule rule = new EpmetRequestLoadBalancerRule(); |
||||
|
rule.setEnv(env); |
||||
|
return rule; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package com.epmet.config; |
||||
|
|
||||
|
import com.epmet.loadbalancer.EpmetRequestLoadBalancerRule; |
||||
|
import com.netflix.loadbalancer.IRule; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
|
||||
|
@Configuration |
||||
|
public class LoadBalanceConfig { |
||||
|
|
||||
|
/** |
||||
|
* 自定义负载均衡算法bean |
||||
|
* @return |
||||
|
*/ |
||||
|
//@Bean
|
||||
|
//public IRule getMyLoadBalancerRule(Environment env) {
|
||||
|
// EpmetRequestLoadBalancerRule rule = new EpmetRequestLoadBalancerRule();
|
||||
|
// rule.setEnv(env);
|
||||
|
// return rule;
|
||||
|
//}
|
||||
|
|
||||
|
} |
Loading…
Reference in new issue