From c95e213b5285ff272e3ce12358c77096a1974eed Mon Sep 17 00:00:00 2001 From: wxz Date: Tue, 12 May 2020 15:26:23 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=BB=BA=E6=A8=A1=E5=9D=97epmet-com?= =?UTF-8?q?mons-service-call=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=E5=92=8C=E6=9C=8D=E5=8A=A1=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E9=85=8D=E7=BD=AE=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=202.gov-org-server,gov-mine-server=E5=BC=95=E5=85=A5epmet-comm?= =?UTF-8?q?ons-service-call=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86loadBalanc=E9=85=8D=E7=BD=AEdemo=EF=BC=8C=E6=9A=82?= =?UTF-8?q?=E6=9C=AA=E5=90=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet-commons-service-call/pom.xml | 33 +++++++ .../EpmetRequestLoadBalancerRule.java | 94 +++++++++++++++++++ epmet-commons/pom.xml | 1 + epmet-module/gov-mine/gov-mine-server/pom.xml | 13 ++- .../com/epmet/config/LoadBalancerConfig.java | 29 ++++++ epmet-module/gov-org/gov-org-server/pom.xml | 16 +++- .../com/epmet/config/LoadBalanceConfig.java | 23 +++++ 7 files changed, 203 insertions(+), 6 deletions(-) create mode 100644 epmet-commons/epmet-commons-service-call/pom.xml create mode 100644 epmet-commons/epmet-commons-service-call/src/main/java/com/epmet/loadbalancer/EpmetRequestLoadBalancerRule.java create mode 100644 epmet-module/gov-mine/gov-mine-server/src/main/java/com/epmet/config/LoadBalancerConfig.java create mode 100644 epmet-module/gov-org/gov-org-server/src/main/java/com/epmet/config/LoadBalanceConfig.java 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; + //} + +}