From 93fdad4dd03f84a3e190594ec8f791ec72a2fcae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Sun, 12 Jan 2020 15:57:04 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=85=A8=E5=B1=80=E7=9A=84=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=81=B0=E5=BA=A6=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-auth/pom.xml | 5 + pigx-common/pigx-common-bom/pom.xml | 5 + .../pigx/common/core/util/WebUtils.java | 10 +- pigx-common/pigx-common-gateway/pom.xml | 4 + .../GrayLoadBalancerClientConfiguration.java | 55 +++++++++ .../PigxRibbonRuleAutoConfiguration.java | 76 ------------ .../filter/GrayLoadBalancerClientFilter.java | 49 -------- .../GrayReactiveLoadBalancerClientFilter.java | 108 ++++++++++++++++++ .../AbstractDiscoveryEnabledPredicate.java | 51 --------- .../predicate/GrayMetadataAwarePredicate.java | 67 ----------- .../rule/AbstractDiscoveryEnabledRule.java | 76 ------------ .../common/gateway/rule/GrayLoadBalancer.java | 39 +++++++ .../gateway/rule/MetadataAwareRule.java | 91 --------------- .../gateway/rule/VersionGrayLoadBalancer.java | 81 +++++++++++++ pigx-common/pigx-common-gray/pom.xml | 49 ++++++++ .../GrayRibbonLoadBalancerConfiguration.java | 43 +++++++ .../feign/GrayFeignRequestInterceptor.java | 50 ++++++++ .../gray/rule/GrayRibbonLoadBalancerRule.java | 82 +++++++++++++ .../main/resources/META-INF/spring.factories | 2 + .../ElasticJobAutoConfiguration.java | 10 +- .../XxlJobAutoConfiguration.java | 6 +- .../annotation/EnablePigxElasticJob.java | 4 +- .../annotation/EnablePigxXxlJob.java | 4 +- .../jobinit/AbstractJobInitialization.java | 6 +- .../jobinit/DataflowJobInitialization.java | 4 +- .../jobinit/ScriptJobInitialization.java | 4 +- .../jobinit/SimpleJobInitialization.java | 4 +- .../properties/ElasticJobProperties.java | 4 +- .../properties/XxlAdminProperties.java | 2 +- .../properties/XxlExecutorProperties.java | 2 +- .../properties/XxlJobProperties.java | 2 +- .../service/PigxUserDetailsServiceImpl.java | 8 -- pigx-common/pom.xml | 1 + pigx-gateway/pom.xml | 4 + pigx-gateway/src/main/resources/bootstrap.yml | 5 +- .../PigxDaemonElasticJobApplication.java | 2 +- 36 files changed, 566 insertions(+), 449 deletions(-) create mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java delete mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/PigxRibbonRuleAutoConfiguration.java delete mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayLoadBalancerClientFilter.java create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java delete mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/AbstractDiscoveryEnabledPredicate.java delete mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/GrayMetadataAwarePredicate.java delete mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/AbstractDiscoveryEnabledRule.java create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java delete mode 100755 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/MetadataAwareRule.java create mode 100644 pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java create mode 100644 pigx-common/pigx-common-gray/pom.xml create mode 100644 pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayRibbonLoadBalancerConfiguration.java create mode 100644 pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java create mode 100644 pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRibbonLoadBalancerRule.java create mode 100644 pigx-common/pigx-common-gray/src/main/resources/META-INF/spring.factories rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/ElasticJobAutoConfiguration.java (91%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/XxlJobAutoConfiguration.java (92%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/annotation/EnablePigxElasticJob.java (90%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/annotation/EnablePigxXxlJob.java (90%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/jobinit/AbstractJobInitialization.java (98%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/jobinit/DataflowJobInitialization.java (94%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/jobinit/ScriptJobInitialization.java (94%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/jobinit/SimpleJobInitialization.java (94%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/properties/ElasticJobProperties.java (98%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/properties/XxlAdminProperties.java (96%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/properties/XxlExecutorProperties.java (97%) rename pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/{job => gray}/properties/XxlJobProperties.java (95%) diff --git a/pigx-auth/pom.xml b/pigx-auth/pom.xml index 3c2fa96c8..0adc34f60 100644 --- a/pigx-auth/pom.xml +++ b/pigx-auth/pom.xml @@ -68,6 +68,11 @@ com.pig4cloud pigx-common-sentinel + + + com.pig4cloud + pigx-common-gray + org.springframework.boot diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml index a912c9bbb..73e9930db 100644 --- a/pigx-common/pigx-common-bom/pom.xml +++ b/pigx-common/pigx-common-bom/pom.xml @@ -42,6 +42,11 @@ pigx-common-gateway ${pigx.version} + + com.pig4cloud + pigx-common-gray + ${pigx.version} + com.pig4cloud pigx-common-datasource diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java index bcffaa807..ba927567e 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java @@ -51,8 +51,8 @@ import java.nio.charset.StandardCharsets; @Slf4j @UtilityClass public class WebUtils extends org.springframework.web.util.WebUtils { - private final String BASIC_ = "Basic "; - private final String UNKNOWN = "unknown"; + private final String BASIC_ = "Basic "; + private final String UNKNOWN = "unknown"; /** * 判断是否ajax请求 @@ -122,7 +122,11 @@ public class WebUtils extends org.springframework.web.util.WebUtils { * @return {HttpServletRequest} */ public HttpServletRequest getRequest() { - return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + try { + return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + } catch (IllegalStateException e) { + return null; + } } /** diff --git a/pigx-common/pigx-common-gateway/pom.xml b/pigx-common/pigx-common-gateway/pom.xml index 182eede61..c97fff40c 100644 --- a/pigx-common/pigx-common-gateway/pom.xml +++ b/pigx-common/pigx-common-gateway/pom.xml @@ -50,5 +50,9 @@ spring-cloud-alibaba-nacos-discovery compile + + org.springframework.cloud + spring-cloud-starter-loadbalancer + diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java new file mode 100755 index 000000000..c160cfc82 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/GrayLoadBalancerClientConfiguration.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.configuration; + +import com.pig4cloud.pigx.common.gateway.rule.GrayLoadBalancer; +import com.pig4cloud.pigx.common.gateway.rule.VersionGrayLoadBalancer; +import com.pig4cloud.pigx.common.gateway.filter.GrayReactiveLoadBalancerClientFilter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.gateway.config.GatewayReactiveLoadBalancerClientAutoConfiguration; +import org.springframework.cloud.gateway.config.LoadBalancerProperties; +import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Mica ribbon rule auto configuration. + * + * @author L.cm + * @link https://github.com/lets-mica/mica + */ +@Configuration +@EnableConfigurationProperties(LoadBalancerProperties.class) +@ConditionalOnProperty(value = "gray.rule.enabled", havingValue = "true") +@AutoConfigureBefore(GatewayReactiveLoadBalancerClientAutoConfiguration.class) +public class GrayLoadBalancerClientConfiguration { + + @Bean + public ReactiveLoadBalancerClientFilter gatewayLoadBalancerClientFilter(GrayLoadBalancer grayLoadBalancer, + LoadBalancerProperties properties) { + return new GrayReactiveLoadBalancerClientFilter(properties, grayLoadBalancer); + } + + @Bean + public GrayLoadBalancer grayLoadBalancer(DiscoveryClient discoveryClient) { + return new VersionGrayLoadBalancer(discoveryClient); + } +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/PigxRibbonRuleAutoConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/PigxRibbonRuleAutoConfiguration.java deleted file mode 100755 index 0c3aa42f2..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/PigxRibbonRuleAutoConfiguration.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.configuration; - -import com.alibaba.cloud.nacos.ribbon.NacosServer; -import com.pig4cloud.pigx.common.gateway.filter.GrayLoadBalancerClientFilter; -import com.pig4cloud.pigx.common.gateway.rule.AbstractDiscoveryEnabledRule; -import com.pig4cloud.pigx.common.gateway.rule.MetadataAwareRule; -import com.pig4cloud.pigx.common.gateway.support.PigxRibbonRuleProperties; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import org.springframework.cloud.gateway.config.LoadBalancerProperties; -import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter; -import org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration; -import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; -import org.springframework.cloud.netflix.ribbon.SpringClientFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -/** - * Mica ribbon rule auto configuration. - * - * @author L.cm - * @link https://github.com/lets-mica/mica - */ -@Configuration -@RequiredArgsConstructor -@ConditionalOnClass(NacosServer.class) -@AutoConfigureBefore(RibbonClientConfiguration.class) -@EnableConfigurationProperties(PigxRibbonRuleProperties.class) -@ConditionalOnProperty(value = "ribbon.rule.enabled", matchIfMissing = true) -public class PigxRibbonRuleAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public AbstractDiscoveryEnabledRule metadataAwareRule() { - return new MetadataAwareRule(); - } - - @Bean - @ConditionalOnMissingBean(LoadBalancerClient.class) - public LoadBalancerClient loadBalancerClient(SpringClientFactory springClientFactory) { - return new RibbonLoadBalancerClient(springClientFactory); - } - - @Bean - @ConditionalOnMissingBean(LoadBalancerClientFilter.class) - public LoadBalancerClientFilter loadBalancerClientFilter(RibbonLoadBalancerClient client - , LoadBalancerProperties properties) { - return new GrayLoadBalancerClientFilter(client, properties); - } - -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayLoadBalancerClientFilter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayLoadBalancerClientFilter.java deleted file mode 100644 index 256e16a82..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayLoadBalancerClientFilter.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.filter; - -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.gateway.config.LoadBalancerProperties; -import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter; -import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; -import org.springframework.http.HttpHeaders; -import org.springframework.web.server.ServerWebExchange; - -import java.net.URI; - -import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; - -/** - * @author Spencer Gibb - * @author Tim Ysewyn - */ -public class GrayLoadBalancerClientFilter extends LoadBalancerClientFilter { - private final RibbonLoadBalancerClient loadBalancer; - - public GrayLoadBalancerClientFilter(RibbonLoadBalancerClient loadBalancer, LoadBalancerProperties properties) { - super(loadBalancer, properties); - this.loadBalancer = loadBalancer; - } - - @Override - protected ServiceInstance choose(ServerWebExchange exchange) { - HttpHeaders headers = exchange.getRequest().getHeaders(); - return loadBalancer.choose(((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost(), headers); - } - -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java new file mode 100644 index 000000000..248f2e5ea --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/filter/GrayReactiveLoadBalancerClientFilter.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.filter; + +import com.pig4cloud.pigx.common.gateway.rule.GrayLoadBalancer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalancerUriTools; +import org.springframework.cloud.client.loadbalancer.reactive.DefaultResponse; +import org.springframework.cloud.client.loadbalancer.reactive.Response; +import org.springframework.cloud.gateway.config.LoadBalancerProperties; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter; +import org.springframework.cloud.gateway.support.DelegatingServiceInstance; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.net.URI; + +/** + * @author lengleng + * @date 2020/1/11 + */ +@Slf4j +public class GrayReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter { + private static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10150; + private LoadBalancerProperties properties; + + private GrayLoadBalancer grayLoadBalancer; + + public GrayReactiveLoadBalancerClientFilter(LoadBalancerProperties properties, GrayLoadBalancer grayLoadBalancer) { + super(null, properties); + this.properties = properties; + this.grayLoadBalancer = grayLoadBalancer; + } + + @Override + public int getOrder() { + return LOAD_BALANCER_CLIENT_FILTER_ORDER; + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + URI url = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); + String schemePrefix = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR); + if (url == null + || (!"lb".equals(url.getScheme()) && !"lb".equals(schemePrefix))) { + return chain.filter(exchange); + } + // preserve the original url + ServerWebExchangeUtils.addOriginalRequestUrl(exchange, url); + + if (log.isTraceEnabled()) { + log.trace(ReactiveLoadBalancerClientFilter.class.getSimpleName() + + " url before: " + url); + } + + return choose(exchange).doOnNext(response -> { + + if (!response.hasServer()) { + throw NotFoundException.create(properties.isUse404(), + "Unable to find instance for " + url.getHost()); + } + + URI uri = exchange.getRequest().getURI(); + + // if the `lb:` mechanism was used, use `` as the default, + // if the loadbalancer doesn't provide one. + String overrideScheme = null; + if (schemePrefix != null) { + overrideScheme = url.getScheme(); + } + + DelegatingServiceInstance serviceInstance = new DelegatingServiceInstance( + response.getServer(), overrideScheme); + + URI requestUrl = LoadBalancerUriTools.reconstructURI(serviceInstance, uri); + + if (log.isTraceEnabled()) { + log.trace("LoadBalancerClientFilter url chosen: " + requestUrl); + } + exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, requestUrl); + }).then(chain.filter(exchange)); + } + + private Mono> choose(ServerWebExchange exchange) { + URI uri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR); + ServiceInstance serviceInstance = grayLoadBalancer.choose(uri.getHost(),exchange.getRequest()); + return Mono.just(new DefaultResponse(serviceInstance)); + } +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/AbstractDiscoveryEnabledPredicate.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/AbstractDiscoveryEnabledPredicate.java deleted file mode 100755 index ace152074..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/AbstractDiscoveryEnabledPredicate.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.predicate; - -import com.alibaba.cloud.nacos.ribbon.NacosServer; -import com.netflix.loadbalancer.AbstractServerPredicate; -import com.netflix.loadbalancer.PredicateKey; -import org.springframework.http.HttpHeaders; -import org.springframework.lang.Nullable; - -/** - * 过滤服务 - * - * @author L.cm - */ -public abstract class AbstractDiscoveryEnabledPredicate extends AbstractServerPredicate { - - /** - * {@inheritDoc} - */ - @Override - public boolean apply(@Nullable PredicateKey input) { - return input != null - && input.getServer() instanceof NacosServer - && apply((NacosServer) input.getServer(), (HttpHeaders) input.getLoadBalancerKey()); - } - - /** - * Returns whether the specific {@link NacosServer} matches this predicate. - * - * @param server the discovered server - * @param headers 请求头 - * @return whether the server matches the predicate - */ - abstract boolean apply(NacosServer server, HttpHeaders headers); -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/GrayMetadataAwarePredicate.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/GrayMetadataAwarePredicate.java deleted file mode 100755 index 4f3be07a0..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/predicate/GrayMetadataAwarePredicate.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.predicate; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.cloud.nacos.ribbon.NacosServer; -import com.pig4cloud.pigx.common.core.constant.CommonConstants; -import com.pig4cloud.pigx.common.core.util.SpringContextHolder; -import com.pig4cloud.pigx.common.gateway.support.PigxRibbonRuleProperties; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpHeaders; - -import java.util.Map; - -/** - * 基于 Metadata version 的服务筛选 - * - * @author L.cm - * @author lengleng - */ -@Slf4j -public class GrayMetadataAwarePredicate extends AbstractDiscoveryEnabledPredicate { - - @Override - protected boolean apply(NacosServer server, HttpHeaders headers) { - PigxRibbonRuleProperties ribbonProperties = SpringContextHolder.getBean(PigxRibbonRuleProperties.class); - - if (!ribbonProperties.isGrayEnabled()) { - log.debug("gray closed,GrayMetadataAwarePredicate return true"); - return true; - } - - final Map metadata = server.getMetadata(); - String version = metadata.get(CommonConstants.VERSION); - // 判断Nacos服务是否有版本标签 - if (StrUtil.isBlank(version)) { - log.debug("nacos server tag is blank ,GrayMetadataAwarePredicate return true"); - return true; - } - - // 判断请求中是否有版本 - String target = headers.getFirst(CommonConstants.VERSION); - if (StrUtil.isBlank(target)) { - log.debug("request headers version is blank,GrayMetadataAwarePredicate return true"); - return true; - } - - log.debug("请求版本:{} ,当前服务版本:{}", target, version); - return target.equals(version); - } - -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/AbstractDiscoveryEnabledRule.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/AbstractDiscoveryEnabledRule.java deleted file mode 100755 index 2d0a762f7..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/AbstractDiscoveryEnabledRule.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.rule; - -import com.google.common.base.Optional; -import com.netflix.loadbalancer.*; -import com.pig4cloud.pigx.common.gateway.predicate.AbstractDiscoveryEnabledPredicate; -import org.springframework.util.Assert; - -import java.util.List; - -/** - * ribbon 路由规则 - * - * @author L.cm - */ -public abstract class AbstractDiscoveryEnabledRule extends PredicateBasedRule { - private final CompositePredicate predicate; - - public AbstractDiscoveryEnabledRule(AbstractDiscoveryEnabledPredicate discoveryEnabledPredicate) { - Assert.notNull(discoveryEnabledPredicate, "Parameter 'discoveryEnabledPredicate' can't be null"); - this.predicate = createCompositePredicate(discoveryEnabledPredicate, new AvailabilityPredicate(this, null)); - } - - /** - * {@inheritDoc} - */ - @Override - public AbstractServerPredicate getPredicate() { - return predicate; - } - - @Override - public Server choose(Object key) { - ILoadBalancer lb = getLoadBalancer(); - - List allServers = lb.getAllServers(); - // 过滤服务列表 - List serverList = filterServers(allServers); - - Optional server = getPredicate().chooseRoundRobinAfterFiltering(serverList, key); - if (server.isPresent()) { - return server.get(); - } else { - return null; - } - } - - /** - * 过滤服务 - * - * @param serverList 服务列表 - * @return 服务列表 - */ - public abstract List filterServers(List serverList); - - private CompositePredicate createCompositePredicate(AbstractDiscoveryEnabledPredicate discoveryEnabledPredicate, AvailabilityPredicate availabilityPredicate) { - return CompositePredicate.withPredicates(discoveryEnabledPredicate, availabilityPredicate) - .build(); - } -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java new file mode 100644 index 000000000..ad2efe0eb --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/GrayLoadBalancer.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.rule; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.http.server.reactive.ServerHttpRequest; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * 灰度路由 + */ +public interface GrayLoadBalancer { + + /** + * 根据serviceId 筛选可用服务 + * + * @param serviceId 服务ID + * @param request 当前请求 + * @return + */ + ServiceInstance choose(String serviceId, ServerHttpRequest request); +} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/MetadataAwareRule.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/MetadataAwareRule.java deleted file mode 100755 index 92eea034e..000000000 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/MetadataAwareRule.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2018-2025, lengleng All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * Neither the name of the pig4cloud.com developer nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * Author: lengleng (wangiegie@gmail.com) - */ - -package com.pig4cloud.pigx.common.gateway.rule; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.system.HostInfo; -import cn.hutool.system.SystemUtil; -import com.netflix.loadbalancer.Server; -import com.pig4cloud.pigx.common.core.util.SpringContextHolder; -import com.pig4cloud.pigx.common.gateway.predicate.AbstractDiscoveryEnabledPredicate; -import com.pig4cloud.pigx.common.gateway.predicate.GrayMetadataAwarePredicate; -import com.pig4cloud.pigx.common.gateway.support.PigxRibbonRuleProperties; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.PatternMatchUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * ribbon 路由规则器 - * - * @author dream.lu - */ -@Slf4j -public class MetadataAwareRule extends AbstractDiscoveryEnabledRule { - - public MetadataAwareRule() { - this(new GrayMetadataAwarePredicate()); - } - - public MetadataAwareRule(AbstractDiscoveryEnabledPredicate predicate) { - super(predicate); - } - - @Override - public List filterServers(List serverList) { - PigxRibbonRuleProperties ribbonProperties = SpringContextHolder.getBean(PigxRibbonRuleProperties.class); - List priorIpPattern = ribbonProperties.getPriorIpPattern(); - - if (ribbonProperties.isGrayEnabled()) { - return serverList; - } - - // 1. 查找是否有本机 ip - HostInfo hostInfo = SystemUtil.getHostInfo(); - String hostIp = hostInfo.getAddress(); - - // 优先的 ip 规则 - boolean hasPriorIpPattern = !priorIpPattern.isEmpty(); - String[] priorIpPatterns = priorIpPattern.toArray(new String[0]); - - List priorServerList = new ArrayList<>(); - for (Server server : serverList) { - String host = server.getHost(); - // 2. 优先本地 ip 的服务 - if (!hasPriorIpPattern && ObjectUtil.equal(hostIp, host)) { - log.debug("{} 不存在优先配置,本地路由条件", hostIp); - return Collections.singletonList(server); - } - // 3. 优先的 ip 服务 - if (hasPriorIpPattern && PatternMatchUtils.simpleMatch(priorIpPatterns, host)) { - log.debug("{} 存在优先配置,ribbon 强制路由", priorIpPatterns); - priorServerList.add(server); - } - } - - // 4. 如果优先的有数据直接返回 - if (!priorServerList.isEmpty()) { - return priorServerList; - } - - return Collections.unmodifiableList(serverList); - } - -} diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java new file mode 100644 index 000000000..07c69a1e9 --- /dev/null +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/rule/VersionGrayLoadBalancer.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gateway.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.gateway.support.NotFoundException; +import org.springframework.http.server.reactive.ServerHttpRequest; + +import java.util.List; +import java.util.Map; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * 基于客户端版本号灰度路由 + */ +@Slf4j +@AllArgsConstructor +public class VersionGrayLoadBalancer implements GrayLoadBalancer { + private DiscoveryClient discoveryClient; + + + /** + * 根据serviceId 筛选可用服务 + * + * @param serviceId 服务ID + * @param request 当前请求 + * @return + */ + @Override + public ServiceInstance choose(String serviceId, ServerHttpRequest request) { + List instances = discoveryClient.getInstances(serviceId); + + //注册中心无实例 抛出异常 + if (CollUtil.isEmpty(instances)) { + log.warn("No instance available for {}", serviceId); + throw new NotFoundException("No instance available for " + serviceId); + } + + // 获取请求version,无则随机返回可用实例 + String reqVersion = request.getHeaders().getFirst(CommonConstants.VERSION); + if (StrUtil.isBlank(reqVersion)) { + return instances.get(RandomUtil.randomInt(instances.size())); + } + + // 遍历可以实例元数据,若匹配则返回此实例 + for (ServiceInstance instance : instances) { + Map metadata = instance.getMetadata(); + String targetVersion = MapUtil.getStr(metadata, CommonConstants.VERSION); + if (reqVersion.equalsIgnoreCase(targetVersion)) { + log.debug("gray requst match success :{} {}", reqVersion, instance); + return instance; + } + } + return instances.get(RandomUtil.randomInt(instances.size())); + } +} diff --git a/pigx-common/pigx-common-gray/pom.xml b/pigx-common/pigx-common-gray/pom.xml new file mode 100644 index 000000000..343520e64 --- /dev/null +++ b/pigx-common/pigx-common-gray/pom.xml @@ -0,0 +1,49 @@ + + + + + 4.0.0 + + com.pig4cloud + pigx-common + 3.6.0 + + + pigx-common-gray + jar + + pigx 灰度路由 + + + + com.pig4cloud + pigx-common-core + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + io.github.openfeign + feign-core + + + diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayRibbonLoadBalancerConfiguration.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayRibbonLoadBalancerConfiguration.java new file mode 100644 index 000000000..bae8ca647 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/GrayRibbonLoadBalancerConfiguration.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray; + +import com.pig4cloud.pigx.common.gray.feign.GrayFeignRequestInterceptor; +import com.pig4cloud.pigx.common.gray.rule.GrayRibbonLoadBalancerRule; +import feign.RequestInterceptor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author lengleng + * @date 2020/1/12 + */ +@Configuration +@ConditionalOnProperty(value = "gray.rule.enabled", havingValue = "true") +public class GrayRibbonLoadBalancerConfiguration { + @Bean + public GrayRibbonLoadBalancerRule ribbonLoadBalancerRule() { + return new GrayRibbonLoadBalancerRule(); + } + + @Bean + public RequestInterceptor pigxFeignTenantInterceptor() { + return new GrayFeignRequestInterceptor(); + } +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java new file mode 100644 index 000000000..1d261750f --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/feign/GrayFeignRequestInterceptor.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray.feign; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import lombok.extern.slf4j.Slf4j; + +/** + * @author lengleng + * @date 2020/1/12 + *

+ * feign 请求VERSION 传递 + */ +@Slf4j +public class GrayFeignRequestInterceptor implements RequestInterceptor { + /** + * Called for every request. Add data using methods on the supplied {@link RequestTemplate}. + * + * @param template + */ + @Override + public void apply(RequestTemplate template) { + String reqVersion = WebUtils.getRequest() != null + ? WebUtils.getRequest().getHeader(CommonConstants.VERSION) : null; + + if (StrUtil.isNotBlank(reqVersion)) { + log.debug("feign gray add header version :{}", reqVersion); + template.header(CommonConstants.VERSION, reqVersion); + } + } +} diff --git a/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRibbonLoadBalancerRule.java b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRibbonLoadBalancerRule.java new file mode 100644 index 000000000..5d71c22fc --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/java/com/pig4cloud/pigx/common/gray/rule/GrayRibbonLoadBalancerRule.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.common.gray.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.cloud.nacos.ribbon.NacosServer; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AbstractLoadBalancerRule; +import com.netflix.loadbalancer.ILoadBalancer; +import com.netflix.loadbalancer.Server; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; + +/** + * @author lengleng + * @date 2020/1/12 + */ +@Slf4j +public class GrayRibbonLoadBalancerRule extends AbstractLoadBalancerRule { + @Override + public void initWithNiwsConfig(IClientConfig iClientConfig) { + + } + + @Override + public Server choose(Object key) { + return choose(getLoadBalancer(), key); + } + + + public Server choose(ILoadBalancer lb, Object key) { + List reachableServers = lb.getReachableServers(); + + //注册中心无可用实例 抛出异常 + if (CollUtil.isEmpty(reachableServers)) { + log.warn("No instance available for {}", key); + return null; + } + + // 获取请求version,无则随机返回可用实例 + String reqVersion = WebUtils.getRequest() != null + ? WebUtils.getRequest().getHeader(CommonConstants.VERSION) : null; + if (StrUtil.isBlank(reqVersion)) { + return reachableServers.get(RandomUtil.randomInt(reachableServers.size())); + } + + // 遍历可以实例元数据,若匹配则返回此实例 + for (Server server : reachableServers) { + NacosServer nacosServer = (NacosServer) server; + Map metadata = nacosServer.getMetadata(); + String targetVersion = MapUtil.getStr(metadata, CommonConstants.VERSION); + if (reqVersion.equalsIgnoreCase(targetVersion)) { + log.debug("gray requst match success :{} {}", reqVersion, nacosServer); + return nacosServer; + } + } + return reachableServers.get(RandomUtil.randomInt(reachableServers.size())); + } + +} diff --git a/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..0dc0c1d27 --- /dev/null +++ b/pigx-common/pigx-common-gray/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.pig4cloud.pigx.common.gray.GrayRibbonLoadBalancerConfiguration \ No newline at end of file diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/ElasticJobAutoConfiguration.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/ElasticJobAutoConfiguration.java similarity index 91% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/ElasticJobAutoConfiguration.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/ElasticJobAutoConfiguration.java index 97afd9bb7..903ceca42 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/ElasticJobAutoConfiguration.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/ElasticJobAutoConfiguration.java @@ -15,14 +15,14 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job; +package com.pig4cloud.pigx.common.gray; import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration; import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; -import com.pig4cloud.pigx.common.job.jobinit.DataflowJobInitialization; -import com.pig4cloud.pigx.common.job.jobinit.ScriptJobInitialization; -import com.pig4cloud.pigx.common.job.jobinit.SimpleJobInitialization; -import com.pig4cloud.pigx.common.job.properties.ElasticJobProperties; +import com.pig4cloud.pigx.common.gray.jobinit.DataflowJobInitialization; +import com.pig4cloud.pigx.common.gray.jobinit.ScriptJobInitialization; +import com.pig4cloud.pigx.common.gray.jobinit.SimpleJobInitialization; +import com.pig4cloud.pigx.common.gray.properties.ElasticJobProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/XxlJobAutoConfiguration.java similarity index 92% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/XxlJobAutoConfiguration.java index 7e81e44bd..b24fb5d79 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/XxlJobAutoConfiguration.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/XxlJobAutoConfiguration.java @@ -15,9 +15,9 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job; +package com.pig4cloud.pigx.common.gray; -import com.pig4cloud.pigx.common.job.properties.XxlJobProperties; +import com.pig4cloud.pigx.common.gray.properties.XxlJobProperties; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -32,7 +32,7 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @EnableAutoConfiguration -@ComponentScan("com.pig4cloud.pigx.common.job.properties") +@ComponentScan("com.pig4cloud.pigx.common.gray.properties") public class XxlJobAutoConfiguration { @Bean(initMethod = "start", destroyMethod = "destroy") diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxElasticJob.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxElasticJob.java similarity index 90% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxElasticJob.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxElasticJob.java index bd1d92460..da37b80fd 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxElasticJob.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxElasticJob.java @@ -15,9 +15,9 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.annotation; +package com.pig4cloud.pigx.common.gray.annotation; -import com.pig4cloud.pigx.common.job.ElasticJobAutoConfiguration; +import com.pig4cloud.pigx.common.gray.ElasticJobAutoConfiguration; import org.springframework.context.annotation.Import; import java.lang.annotation.*; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxXxlJob.java similarity index 90% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxXxlJob.java index aa40052aa..b57b7c5a9 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/annotation/EnablePigxXxlJob.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/annotation/EnablePigxXxlJob.java @@ -15,9 +15,9 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.annotation; +package com.pig4cloud.pigx.common.gray.annotation; -import com.pig4cloud.pigx.common.job.XxlJobAutoConfiguration; +import com.pig4cloud.pigx.common.gray.XxlJobAutoConfiguration; import org.springframework.context.annotation.Import; import java.lang.annotation.*; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/AbstractJobInitialization.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/AbstractJobInitialization.java similarity index 98% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/AbstractJobInitialization.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/AbstractJobInitialization.java index b9b81b5d8..9f0e2b014 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/AbstractJobInitialization.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/AbstractJobInitialization.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.jobinit; +package com.pig4cloud.pigx.common.gray.jobinit; import com.dangdang.ddframe.job.api.ElasticJob; import com.dangdang.ddframe.job.api.JobType; @@ -30,7 +30,7 @@ import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener; import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration; import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler; import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter; -import com.pig4cloud.pigx.common.job.properties.ElasticJobProperties; +import com.pig4cloud.pigx.common.gray.properties.ElasticJobProperties; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.config.BeanDefinition; @@ -46,7 +46,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import static com.pig4cloud.pigx.common.job.ElasticJobAutoConfiguration.DEFAULT_REGISTRY_CENTER_NAME; +import static com.pig4cloud.pigx.common.gray.ElasticJobAutoConfiguration.DEFAULT_REGISTRY_CENTER_NAME; /** diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/DataflowJobInitialization.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/DataflowJobInitialization.java similarity index 94% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/DataflowJobInitialization.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/DataflowJobInitialization.java index 66af592bb..989710152 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/DataflowJobInitialization.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/DataflowJobInitialization.java @@ -15,12 +15,12 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.jobinit; +package com.pig4cloud.pigx.common.gray.jobinit; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.JobTypeConfiguration; import com.dangdang.ddframe.job.config.dataflow.DataflowJobConfiguration; -import com.pig4cloud.pigx.common.job.properties.ElasticJobProperties; +import com.pig4cloud.pigx.common.gray.properties.ElasticJobProperties; import java.util.Map; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/ScriptJobInitialization.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/ScriptJobInitialization.java similarity index 94% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/ScriptJobInitialization.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/ScriptJobInitialization.java index c7cbd5890..bded1fb30 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/ScriptJobInitialization.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/ScriptJobInitialization.java @@ -15,12 +15,12 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.jobinit; +package com.pig4cloud.pigx.common.gray.jobinit; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.JobTypeConfiguration; import com.dangdang.ddframe.job.config.script.ScriptJobConfiguration; -import com.pig4cloud.pigx.common.job.properties.ElasticJobProperties; +import com.pig4cloud.pigx.common.gray.properties.ElasticJobProperties; import java.util.Map; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/SimpleJobInitialization.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/SimpleJobInitialization.java similarity index 94% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/SimpleJobInitialization.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/SimpleJobInitialization.java index fbbead7cb..551e6ba85 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/jobinit/SimpleJobInitialization.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/jobinit/SimpleJobInitialization.java @@ -15,12 +15,12 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.jobinit; +package com.pig4cloud.pigx.common.gray.jobinit; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.JobTypeConfiguration; import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; -import com.pig4cloud.pigx.common.job.properties.ElasticJobProperties; +import com.pig4cloud.pigx.common.gray.properties.ElasticJobProperties; import java.util.Map; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/ElasticJobProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/ElasticJobProperties.java similarity index 98% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/ElasticJobProperties.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/ElasticJobProperties.java index 7dbbab4d7..12d63de13 100755 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/ElasticJobProperties.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/ElasticJobProperties.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.properties; +package com.pig4cloud.pigx.common.gray.properties; import com.dangdang.ddframe.job.api.JobType; import lombok.Getter; @@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.LinkedHashMap; import java.util.Map; -import static com.pig4cloud.pigx.common.job.ElasticJobAutoConfiguration.DEFAULT_REGISTRY_CENTER_NAME; +import static com.pig4cloud.pigx.common.gray.ElasticJobAutoConfiguration.DEFAULT_REGISTRY_CENTER_NAME; /** diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlAdminProperties.java similarity index 96% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlAdminProperties.java index eda15b774..29d2ad359 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlAdminProperties.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlAdminProperties.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.properties; +package com.pig4cloud.pigx.common.gray.properties; import lombok.Data; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlExecutorProperties.java similarity index 97% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlExecutorProperties.java index 09f56cec7..24d14d906 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlExecutorProperties.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlExecutorProperties.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.properties; +package com.pig4cloud.pigx.common.gray.properties; import lombok.Data; diff --git a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlJobProperties.java similarity index 95% rename from pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java rename to pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlJobProperties.java index a45e0a475..15e8050a9 100644 --- a/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/job/properties/XxlJobProperties.java +++ b/pigx-common/pigx-common-job/src/main/java/com/pig4cloud/pigx/common/gray/properties/XxlJobProperties.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.job.properties; +package com.pig4cloud.pigx.common.gray.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java index 819269f59..0f1029b48 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java @@ -22,14 +22,12 @@ import cn.hutool.core.util.StrUtil; import com.pig4cloud.pigx.admin.api.dto.UserInfo; import com.pig4cloud.pigx.admin.api.entity.SysUser; import com.pig4cloud.pigx.admin.api.feign.RemoteUserService; -import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.R; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; @@ -62,14 +60,8 @@ public class PigxUserDetailsServiceImpl implements PigxUserDetailsService { @Override @SneakyThrows public UserDetails loadUserByUsername(String username) { - Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); - if (cache != null && cache.get(username) != null) { - return (PigxUser) cache.get(username).get(); - } - R result = remoteUserService.info(username, SecurityConstants.FROM_IN); UserDetails userDetails = getUserDetails(result); - cache.put(username, userDetails); return userDetails; } diff --git a/pigx-common/pom.xml b/pigx-common/pom.xml index 46a7edf89..7d2bcbf31 100644 --- a/pigx-common/pom.xml +++ b/pigx-common/pom.xml @@ -38,6 +38,7 @@ pigx-common-data pigx-common-datasource pigx-common-gateway + pigx-common-gray pigx-common-job pigx-common-log pigx-common-minio diff --git a/pigx-gateway/pom.xml b/pigx-gateway/pom.xml index c97f8f620..20110e78a 100644 --- a/pigx-gateway/pom.xml +++ b/pigx-gateway/pom.xml @@ -47,6 +47,10 @@ com.pig4cloud pigx-common-gateway + + com.pig4cloud + pigx-common-gray + com.alibaba.cloud diff --git a/pigx-gateway/src/main/resources/bootstrap.yml b/pigx-gateway/src/main/resources/bootstrap.yml index 7f9f41e22..bdbe859da 100644 --- a/pigx-gateway/src/main/resources/bootstrap.yml +++ b/pigx-gateway/src/main/resources/bootstrap.yml @@ -5,6 +5,9 @@ spring: application: name: @artifactId@ cloud: + loadbalancer: + ribbon: + enabled: false nacos: discovery: server-addr: ${NACOS-HOST:pigx-register}:${NACOS-PORT:8848} @@ -13,4 +16,4 @@ spring: file-extension: yml shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} profiles: - active: @profiles.active@ + active: @profiles.active@ \ No newline at end of file diff --git a/pigx-visual/pigx-daemon-elastic-job/src/main/java/com/pig4cloud/pigx/daemon/elastic/PigxDaemonElasticJobApplication.java b/pigx-visual/pigx-daemon-elastic-job/src/main/java/com/pig4cloud/pigx/daemon/elastic/PigxDaemonElasticJobApplication.java index d31f9fe51..55fc6f750 100644 --- a/pigx-visual/pigx-daemon-elastic-job/src/main/java/com/pig4cloud/pigx/daemon/elastic/PigxDaemonElasticJobApplication.java +++ b/pigx-visual/pigx-daemon-elastic-job/src/main/java/com/pig4cloud/pigx/daemon/elastic/PigxDaemonElasticJobApplication.java @@ -17,7 +17,7 @@ package com.pig4cloud.pigx.daemon.elastic; -import com.pig4cloud.pigx.common.job.annotation.EnablePigxXxlJob; +import com.pig4cloud.pigx.common.gray.annotation.EnablePigxXxlJob; import com.pig4cloud.pigx.common.security.annotation.EnablePigxFeignClients; import com.pig4cloud.pigx.common.security.annotation.EnablePigxResourceServer; import com.pig4cloud.pigx.common.swagger.annotation.EnablePigxSwagger2;