diff --git a/epmet-commons/epmet-commons-service-call/pom.xml b/epmet-commons/epmet-commons-service-call/pom.xml new file mode 100644 index 0000000000..bb36df7e4c --- /dev/null +++ b/epmet-commons/epmet-commons-service-call/pom.xml @@ -0,0 +1,33 @@ + + + + epmet-commons + com.epmet + 2.0.0 + + 4.0.0 + + epmet-commons-service-call + 0.3.1 + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + io.github.openfeign + feign-httpclient + 10.3.0 + + + + \ No newline at end of file diff --git a/epmet-commons/epmet-commons-service-call/src/main/java/com/epmet/loadbalancer/EpmetRequestLoadBalancerRule.java b/epmet-commons/epmet-commons-service-call/src/main/java/com/epmet/loadbalancer/EpmetRequestLoadBalancerRule.java new file mode 100644 index 0000000000..4bd075dad0 --- /dev/null +++ b/epmet-commons/epmet-commons-service-call/src/main/java/com/epmet/loadbalancer/EpmetRequestLoadBalancerRule.java @@ -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 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(); + } +} diff --git a/epmet-commons/pom.xml b/epmet-commons/pom.xml index 350503fdae..3f25f5b1b5 100644 --- a/epmet-commons/pom.xml +++ b/epmet-commons/pom.xml @@ -21,6 +21,7 @@ epmet-common-clienttoken epmet-commons-tools-wx-ma epmet-commons-tools-wx-mp + epmet-commons-service-call diff --git a/epmet-module/gov-mine/gov-mine-server/pom.xml b/epmet-module/gov-mine/gov-mine-server/pom.xml index 0eb920057f..465e254034 100644 --- a/epmet-module/gov-mine/gov-mine-server/pom.xml +++ b/epmet-module/gov-mine/gov-mine-server/pom.xml @@ -45,20 +45,27 @@ spring-boot-admin-starter-client ${spring.boot.admin.version} + + + com.epmet + epmet-commons-service-call + 0.3.1 + + - + com.epmet gov-org-client diff --git a/epmet-module/gov-mine/gov-mine-server/src/main/java/com/epmet/config/LoadBalancerConfig.java b/epmet-module/gov-mine/gov-mine-server/src/main/java/com/epmet/config/LoadBalancerConfig.java new file mode 100644 index 0000000000..2c0b3411e7 --- /dev/null +++ b/epmet-module/gov-mine/gov-mine-server/src/main/java/com/epmet/config/LoadBalancerConfig.java @@ -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; + } + +} diff --git a/epmet-module/gov-org/gov-org-server/pom.xml b/epmet-module/gov-org/gov-org-server/pom.xml index c731a93fb9..068c61a78d 100644 --- a/epmet-module/gov-org/gov-org-server/pom.xml +++ b/epmet-module/gov-org/gov-org-server/pom.xml @@ -40,20 +40,30 @@ org.springframework.boot spring-boot-starter-actuator + + com.epmet + epmet-commons-service-call + 0.3.1 + + + + + + - + diff --git a/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/config/LoadBalanceConfig.java b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/config/LoadBalanceConfig.java new file mode 100644 index 0000000000..97bd3ae321 --- /dev/null +++ b/epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/config/LoadBalanceConfig.java @@ -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; + //} + +}