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