diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java b/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java index 7a06bd7379..3ac7330d9c 100644 --- a/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java +++ b/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java @@ -29,6 +29,9 @@ public class DiscoveryConstant { public static final String SPRING_APPLICATION_NO_SERVERS_RETRY_TIMES = "spring.application.no.servers.retry.times"; public static final String SPRING_APPLICATION_NO_SERVERS_RETRY_AWAIT_TIME = "spring.application.no.servers.retry.await.time"; public static final String SPRING_APPLICATION_NO_SERVERS_NOTIFY_ENABLED = "spring.application.no.servers.notify.enabled"; + public static final String SPRING_APPLICATION_ENVIRONMENT_ISOLATION_ENABLED = "spring.application.environment.isolation.enabled"; + public static final String SPRING_APPLICATION_ENVIRONMENT_TRANSFER = "spring.application.environment.transfer"; + public static final String SPRING_APPLICATION_ENVIRONMENT_TRANSFER_VALUE = "common"; public static final String CONTEXT_PATH = "server.servlet.context-path"; @@ -64,6 +67,7 @@ public class DiscoveryConstant { public static final String VERSION = "version"; public static final String REGION = "region"; + public static final String ENVIRONMENT = "env"; public static final String ADDRESS = "address"; public static final String VERSION_WEIGHT = "version-weight"; public static final String REGION_WEIGHT = "region-weight"; @@ -77,6 +81,7 @@ public class DiscoveryConstant { public static final String N_D_SERVICE_ADDRESS = "n-d-service-address"; public static final String N_D_SERVICE_VERSION = "n-d-service-version"; public static final String N_D_SERVICE_REGION = "n-d-service-region"; + public static final String N_D_SERVICE_ENVIRONMENT = "n-d-service-env"; public static final String N_D_VERSION = "n-d-version"; public static final String N_D_REGION = "n-d-region"; diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java index 61c88f1518..9eb3d239cf 100644 --- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java +++ b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java @@ -24,6 +24,7 @@ public class InstanceEntity implements Serializable { private String serviceId; private String version; private String region; + private String environment; private String host; private int port; private Map metadata; @@ -60,6 +61,14 @@ public void setRegion(String region) { this.region = region; } + public String getEnvironment() { + return environment; + } + + public void setEnvironment(String environment) { + this.environment = environment; + } + public String getHost() { return host; } diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java index 7d7eda1a03..a03a2f594a 100644 --- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java +++ b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java @@ -25,6 +25,7 @@ public class RouterEntity implements Serializable { private String serviceId; private String version; private String region; + private String environment; private String host; private int port; private int weight = -1; @@ -64,6 +65,14 @@ public void setRegion(String region) { this.region = region; } + public String getEnvironment() { + return environment; + } + + public void setEnvironment(String environment) { + this.environment = environment; + } + public String getHost() { return host; } diff --git a/discovery-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 3400fd0c75..71a49ee6f4 100644 --- a/discovery-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/discovery-common/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -95,6 +95,18 @@ "type": "java.lang.Boolean", "defaultValue": false, "description": "Whether no server notify is enabled." + }, + { + "name": "spring.application.environment.isolation.enabled", + "type": "java.lang.Boolean", + "defaultValue": false, + "description": "Whether environment isolation is enabled." + }, + { + "name": "spring.application.environment.transfer", + "type": "java.lang.String", + "defaultValue": "common", + "description": "If environment isolation failed, an environment will transfer." } ] } \ No newline at end of file diff --git a/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/RouterTopology.java b/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/RouterTopology.java index daae679ef8..39bf9cc3b9 100644 --- a/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/RouterTopology.java +++ b/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/RouterTopology.java @@ -233,14 +233,15 @@ private String getNodeName(Instance instance) { } stringBuilder.append(instance.getServiceId()).append("\n"); stringBuilder.append(instance.getHost()).append(":").append(instance.getPort()); - if (StringUtils.isNotEmpty(instance.getVersion())) { stringBuilder.append("\n [V").append(instance.getVersion()).append("]"); } - if (StringUtils.isNotEmpty(instance.getRegion())) { stringBuilder.append("\n [Region=").append(instance.getRegion()).append("]"); } + if (StringUtils.isNotEmpty(instance.getEnvironment())) { + stringBuilder.append("\n [Env=").append(instance.getEnvironment()).append("]"); + } return ButtonManager.getHtmlText(stringBuilder.toString()); } @@ -252,14 +253,15 @@ private String getNodeName(RouterEntity routerEntity) { } stringBuilder.append(routerEntity.getServiceId()).append("\n"); stringBuilder.append(routerEntity.getHost()).append(":").append(routerEntity.getPort()); - if (StringUtils.isNotEmpty(routerEntity.getVersion())) { stringBuilder.append("\n [V").append(routerEntity.getVersion()).append("]"); } - if (StringUtils.isNotEmpty(routerEntity.getRegion())) { stringBuilder.append("\n [Region=").append(routerEntity.getRegion()).append("]"); } + if (StringUtils.isNotEmpty(routerEntity.getEnvironment())) { + stringBuilder.append("\n [Env=").append(routerEntity.getEnvironment()).append("]"); + } return ButtonManager.getHtmlText(stringBuilder.toString()); } diff --git a/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/ServiceTopology.java b/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/ServiceTopology.java index e21c64592c..45d72f0870 100644 --- a/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/ServiceTopology.java +++ b/discovery-console-desktop/src/main/java/com/nepxion/discovery/console/desktop/workspace/ServiceTopology.java @@ -390,6 +390,9 @@ private String getNodeName(Instance instance) { if (StringUtils.isNotEmpty(instance.getRegion())) { stringBuilder.append("\n [Region=").append(instance.getRegion()).append("]"); } + if (StringUtils.isNotEmpty(instance.getEnvironment())) { + stringBuilder.append("\n [Env=").append(instance.getEnvironment()).append("]"); + } return ButtonManager.getHtmlText(stringBuilder.toString()); } diff --git a/discovery-console/src/main/java/com/nepxion/discovery/console/endpoint/ConsoleEndpoint.java b/discovery-console/src/main/java/com/nepxion/discovery/console/endpoint/ConsoleEndpoint.java index 6309edb121..d38c708619 100644 --- a/discovery-console/src/main/java/com/nepxion/discovery/console/endpoint/ConsoleEndpoint.java +++ b/discovery-console/src/main/java/com/nepxion/discovery/console/endpoint/ConsoleEndpoint.java @@ -323,6 +323,7 @@ public List getInstanceList(String service) { String serviceType = metadata.get(DiscoveryConstant.SPRING_APPLICATION_TYPE); String version = metadata.get(DiscoveryConstant.VERSION); String region = metadata.get(DiscoveryConstant.REGION); + String environment = metadata.get(DiscoveryConstant.ENVIRONMENT); String host = serviceInstance.getHost(); int port = serviceInstance.getPort(); @@ -331,6 +332,7 @@ public List getInstanceList(String service) { instanceEntity.setServiceId(serviceId); instanceEntity.setVersion(version); instanceEntity.setRegion(region); + instanceEntity.setEnvironment(environment); instanceEntity.setHost(host); instanceEntity.setPort(port); instanceEntity.setMetadata(metadata); diff --git a/discovery-plugin-admin-center/src/main/java/com/nepxion/discovery/plugin/admincenter/endpoint/RouterEndpoint.java b/discovery-plugin-admin-center/src/main/java/com/nepxion/discovery/plugin/admincenter/endpoint/RouterEndpoint.java index d4aaccd842..11a7b06db2 100644 --- a/discovery-plugin-admin-center/src/main/java/com/nepxion/discovery/plugin/admincenter/endpoint/RouterEndpoint.java +++ b/discovery-plugin-admin-center/src/main/java/com/nepxion/discovery/plugin/admincenter/endpoint/RouterEndpoint.java @@ -122,6 +122,7 @@ public RouterEntity getRouterEntity() { String serviceId = pluginAdapter.getServiceId(); String version = pluginAdapter.getVersion(); String region = pluginAdapter.getRegion(); + String environment = pluginAdapter.getEnvironment(); String host = pluginAdapter.getHost(); int port = pluginAdapter.getPort(); int weight = -1; @@ -132,6 +133,7 @@ public RouterEntity getRouterEntity() { routerEntity.setServiceId(serviceId); routerEntity.setVersion(version); routerEntity.setRegion(region); + routerEntity.setEnvironment(environment); routerEntity.setHost(host); routerEntity.setPort(port); routerEntity.setWeight(weight); @@ -159,6 +161,7 @@ public List getRouterEntityList(String routeServiceId) { String serviceType = pluginAdapter.getInstanceServiceType(instance); String version = pluginAdapter.getInstanceVersion(instance); String region = pluginAdapter.getInstanceRegion(instance); + String environment = pluginAdapter.getInstanceEnvironment(instance); String host = instance.getHost(); int port = instance.getPort(); int weight = getWeight(routeServiceId, version, region); @@ -169,6 +172,7 @@ public List getRouterEntityList(String routeServiceId) { routerEntity.setServiceId(serviceId); routerEntity.setVersion(version); routerEntity.setRegion(region); + routerEntity.setEnvironment(environment); routerEntity.setHost(host); routerEntity.setPort(port); routerEntity.setWeight(weight); diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/AbstractPluginAdapter.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/AbstractPluginAdapter.java index 45a6677872..bc1bde91e1 100644 --- a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/AbstractPluginAdapter.java +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/AbstractPluginAdapter.java @@ -164,7 +164,6 @@ public void clearDynamicRule() { @Override public String getRegion() { String region = getMetadata().get(DiscoveryConstant.REGION); - if (StringUtils.isEmpty(region)) { region = DiscoveryConstant.DEFAULT; } @@ -172,6 +171,16 @@ public String getRegion() { return region; } + @Override + public String getEnvironment() { + String environment = getMetadata().get(DiscoveryConstant.ENVIRONMENT); + if (StringUtils.isEmpty(environment)) { + environment = DiscoveryConstant.DEFAULT; + } + + return environment; + } + @Override public String getServerGroupKey(Server server) { String groupKey = getServerMetadata(server).get(DiscoveryConstant.SPRING_APPLICATION_GROUP_KEY); @@ -234,6 +243,16 @@ public String getServerRegion(Server server) { return serverRegion; } + @Override + public String getServerEnvironment(Server server) { + String serverEnvironment = getServerMetadata(server).get(DiscoveryConstant.ENVIRONMENT); + if (StringUtils.isEmpty(serverEnvironment)) { + serverEnvironment = DiscoveryConstant.DEFAULT; + } + + return serverEnvironment; + } + @Override public String getServerContextPath(Server server) { return getServerMetadata(server).get(DiscoveryConstant.SPRING_APPLICATION_CONTEXT_PATH); @@ -297,6 +316,16 @@ public String getInstanceRegion(ServiceInstance serviceInstance) { return instanceRegion; } + @Override + public String getInstanceEnvironment(ServiceInstance serviceInstance) { + String instanceEnvironment = getInstanceMetadata(serviceInstance).get(DiscoveryConstant.ENVIRONMENT); + if (StringUtils.isEmpty(instanceEnvironment)) { + instanceEnvironment = DiscoveryConstant.DEFAULT; + } + + return instanceEnvironment; + } + @Override public String getInstanceContextPath(ServiceInstance serviceInstance) { return getInstanceMetadata(serviceInstance).get(DiscoveryConstant.SPRING_APPLICATION_CONTEXT_PATH); @@ -309,6 +338,7 @@ public String getPluginInfo(String previousPluginInfo) { int port = getPort(); String version = getVersion(); String region = getRegion(); + String environment = getEnvironment(); String group = getGroup(); StringBuilder stringBuilder = new StringBuilder(); @@ -320,6 +350,9 @@ public String getPluginInfo(String previousPluginInfo) { if (StringUtils.isNotEmpty(region)) { stringBuilder.append("[R=" + region + "]"); } + if (StringUtils.isNotEmpty(environment)) { + stringBuilder.append("[E=" + environment + "]"); + } if (StringUtils.isNotEmpty(group)) { stringBuilder.append("[G=" + group + "]"); } diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/DefaultEnvironmentTransferAdapter.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/DefaultEnvironmentTransferAdapter.java new file mode 100644 index 0000000000..1c5d3c6706 --- /dev/null +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/DefaultEnvironmentTransferAdapter.java @@ -0,0 +1,21 @@ +package com.nepxion.discovery.plugin.framework.adapter; + +/** + *

Title: Nepxion Discovery

+ *

Description: Nepxion Discovery

+ *

Copyright: Copyright (c) 2017-2050

+ *

Company: Nepxion

+ * @author Haojun Ren + * @version 1.0 + */ + +import org.springframework.beans.factory.annotation.Autowired; + +public abstract class DefaultEnvironmentTransferAdapter implements EnvironmentTransferAdapter { + @Autowired + protected PluginAdapter pluginAdapter; + + public PluginAdapter getPluginAdapter() { + return pluginAdapter; + } +} \ No newline at end of file diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/EnvironmentTransferAdapter.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/EnvironmentTransferAdapter.java new file mode 100644 index 0000000000..9dfd4b6243 --- /dev/null +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/EnvironmentTransferAdapter.java @@ -0,0 +1,14 @@ +package com.nepxion.discovery.plugin.framework.adapter; + +/** + *

Title: Nepxion Discovery

+ *

Description: Nepxion Discovery

+ *

Copyright: Copyright (c) 2017-2050

+ *

Company: Nepxion

+ * @author Haojun Ren + * @version 1.0 + */ + +public interface EnvironmentTransferAdapter { + boolean isTransferred(); +} \ No newline at end of file diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/PluginAdapter.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/PluginAdapter.java index 20eae39989..b1645f6660 100644 --- a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/PluginAdapter.java +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/adapter/PluginAdapter.java @@ -57,6 +57,8 @@ public interface PluginAdapter { String getRegion(); + String getEnvironment(); + Map getServerMetadata(Server server); String getServerGroupKey(Server server); @@ -71,6 +73,8 @@ public interface PluginAdapter { String getServerRegion(Server server); + String getServerEnvironment(Server server); + String getServerContextPath(Server server); Map getInstanceMetadata(ServiceInstance serviceInstance); @@ -87,6 +91,8 @@ public interface PluginAdapter { String getInstanceRegion(ServiceInstance serviceInstance); + String getInstanceEnvironment(ServiceInstance serviceInstance); + String getInstanceContextPath(ServiceInstance serviceInstance); String getPluginInfo(String previousPluginInfo); diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java index b6addf6615..69cafaf32b 100644 --- a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/configuration/PluginAutoConfiguration.java @@ -24,9 +24,11 @@ import com.nepxion.discovery.plugin.framework.generator.GitGenerator; import com.nepxion.discovery.plugin.framework.generator.GroupGenerator; import com.nepxion.discovery.plugin.framework.listener.discovery.DiscoveryListenerExecutor; +import com.nepxion.discovery.plugin.framework.listener.discovery.EnvironmentFilterDiscoveryListener; import com.nepxion.discovery.plugin.framework.listener.discovery.HostFilterDiscoveryListener; import com.nepxion.discovery.plugin.framework.listener.discovery.RegionFilterDiscoveryListener; import com.nepxion.discovery.plugin.framework.listener.discovery.VersionFilterDiscoveryListener; +import com.nepxion.discovery.plugin.framework.listener.loadbalance.EnvironmentFilterLoadBalanceListener; import com.nepxion.discovery.plugin.framework.listener.loadbalance.HostFilterLoadBalanceListener; import com.nepxion.discovery.plugin.framework.listener.loadbalance.LoadBalanceListenerExecutor; import com.nepxion.discovery.plugin.framework.listener.loadbalance.NotificationLoadBalanceListener; @@ -105,6 +107,13 @@ public VersionFilterDiscoveryListener versionFilterDiscoveryListener() { return new VersionFilterDiscoveryListener(); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(value = DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ISOLATION_ENABLED, matchIfMissing = false) + public EnvironmentFilterDiscoveryListener environmentFilterDiscoveryListener() { + return new EnvironmentFilterDiscoveryListener(); + } + @Bean public RegionFilterDiscoveryListener regionFilterDiscoveryListener() { return new RegionFilterDiscoveryListener(); @@ -132,6 +141,13 @@ public NotificationLoadBalanceListener notificationLoadBalanceListener() { return new NotificationLoadBalanceListener(); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(value = DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ISOLATION_ENABLED, matchIfMissing = false) + public EnvironmentFilterLoadBalanceListener environmentFilterLoadBalanceListener() { + return new EnvironmentFilterLoadBalanceListener(); + } + @Bean @ConditionalOnMissingBean @ConditionalOnProperty(value = DiscoveryConstant.SPRING_APPLICATION_GROUP_GENERATOR_ENABLED, matchIfMissing = false) diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/discovery/EnvironmentFilterDiscoveryListener.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/discovery/EnvironmentFilterDiscoveryListener.java new file mode 100644 index 0000000000..25358d87f2 --- /dev/null +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/discovery/EnvironmentFilterDiscoveryListener.java @@ -0,0 +1,83 @@ +package com.nepxion.discovery.plugin.framework.listener.discovery; + +/** + *

Title: Nepxion Discovery

+ *

Description: Nepxion Discovery

+ *

Copyright: Copyright (c) 2017-2050

+ *

Company: Nepxion

+ * @author Haojun Ren + * @version 1.0 + */ + +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.client.ServiceInstance; + +import com.nepxion.discovery.common.constant.DiscoveryConstant; +import com.nepxion.discovery.plugin.framework.adapter.EnvironmentTransferAdapter; + +public class EnvironmentFilterDiscoveryListener extends AbstractDiscoveryListener { + @Value("${" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_TRANSFER + ":" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_TRANSFER_VALUE + "}") + protected String environmentTransfer; + + @Autowired(required = false) + private EnvironmentTransferAdapter environmentTransferAdapter; + + @Override + public void onGetInstances(String serviceId, List instances) { + applyEnvironmentFilter(serviceId, instances); + } + + private void applyEnvironmentFilter(String providerServiceId, List instances) { + String environment = pluginAdapter.getEnvironment(); + boolean validated = validate(instances, environment); + Iterator iterator = instances.iterator(); + while (iterator.hasNext()) { + ServiceInstance serviceInstance = iterator.next(); + String instanceEnvironment = pluginAdapter.getInstanceEnvironment(serviceInstance); + if (validated) { + // 环境隔离:调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用 + if (!StringUtils.equals(instanceEnvironment, environment)) { + iterator.remove(); + } + } else { + // 环境切流:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量切到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default) + if (environmentTransferAdapter != null && environmentTransferAdapter.isTransferred()) { + if (!StringUtils.equals(instanceEnvironment, environmentTransfer)) { + iterator.remove(); + } + } else { + // 环境切流关闭,移除所有不匹配的实例 + iterator.remove(); + } + } + } + } + + // 判断环境是否要切流。只要调用端实例和至少一个提供端实例的元数据Metadata环境配置值相等,就不需要切流 + private boolean validate(List instances, String environment) { + for (ServiceInstance serviceInstance : instances) { + String instanceEnvironment = pluginAdapter.getInstanceEnvironment(serviceInstance); + if (StringUtils.equals(instanceEnvironment, environment)) { + return true; + } + } + + return false; + } + + @Override + public void onGetServices(List services) { + + } + + @Override + public int getOrder() { + // Highest priority + return HIGHEST_PRECEDENCE + 3; + } +} \ No newline at end of file diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/loadbalance/EnvironmentFilterLoadBalanceListener.java b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/loadbalance/EnvironmentFilterLoadBalanceListener.java new file mode 100644 index 0000000000..00c6ca58c5 --- /dev/null +++ b/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/listener/loadbalance/EnvironmentFilterLoadBalanceListener.java @@ -0,0 +1,78 @@ +package com.nepxion.discovery.plugin.framework.listener.loadbalance; + +/** + *

Title: Nepxion Discovery

+ *

Description: Nepxion Discovery

+ *

Copyright: Copyright (c) 2017-2050

+ *

Company: Nepxion

+ * @author Haojun Ren + * @version 1.0 + */ + +import java.util.Iterator; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; + +import com.nepxion.discovery.common.constant.DiscoveryConstant; +import com.nepxion.discovery.plugin.framework.adapter.EnvironmentTransferAdapter; +import com.netflix.loadbalancer.Server; + +public class EnvironmentFilterLoadBalanceListener extends AbstractLoadBalanceListener { + @Value("${" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_TRANSFER + ":" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_TRANSFER_VALUE + "}") + protected String environmentTransfer; + + @Autowired(required = false) + private EnvironmentTransferAdapter environmentTransferAdapter; + + @Override + public void onGetServers(String serviceId, List servers) { + applyEnvironmentFilter(serviceId, servers); + } + + private void applyEnvironmentFilter(String providerServiceId, List servers) { + String environment = pluginAdapter.getEnvironment(); + boolean validated = validate(servers, environment); + Iterator iterator = servers.iterator(); + while (iterator.hasNext()) { + Server server = iterator.next(); + String serverEnvironment = pluginAdapter.getServerEnvironment(server); + if (validated) { + // 环境隔离:调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用 + if (!StringUtils.equals(serverEnvironment, environment)) { + iterator.remove(); + } + } else { + // 环境切流:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量切到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default) + if (environmentTransferAdapter != null && environmentTransferAdapter.isTransferred()) { + if (!StringUtils.equals(serverEnvironment, environmentTransfer)) { + iterator.remove(); + } + } else { + // 环境切流关闭,移除所有不匹配的实例 + iterator.remove(); + } + } + } + } + + // 判断环境是否要切流。只要调用端实例和至少一个提供端实例的元数据Metadata环境配置值相等,就不需要切流 + private boolean validate(List servers, String environment) { + for (Server server : servers) { + String serverEnvironment = pluginAdapter.getServerEnvironment(server); + if (StringUtils.equals(serverEnvironment, environment)) { + return true; + } + } + + return false; + } + + @Override + public int getOrder() { + // Highest priority + return HIGHEST_PRECEDENCE + 3; + } +} \ No newline at end of file diff --git a/discovery-plugin-strategy-opentracing/src/main/java/com/nepxion/discovery/plugin/opentracing/operation/StrategyOpentracingOperation.java b/discovery-plugin-strategy-opentracing/src/main/java/com/nepxion/discovery/plugin/opentracing/operation/StrategyOpentracingOperation.java index 7f11820d1b..36f174273b 100644 --- a/discovery-plugin-strategy-opentracing/src/main/java/com/nepxion/discovery/plugin/opentracing/operation/StrategyOpentracingOperation.java +++ b/discovery-plugin-strategy-opentracing/src/main/java/com/nepxion/discovery/plugin/opentracing/operation/StrategyOpentracingOperation.java @@ -92,6 +92,7 @@ public void opentracingHeader(Map customizationMap) { span.setTag(DiscoveryConstant.N_D_SERVICE_ADDRESS, strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ADDRESS)); span.setTag(DiscoveryConstant.N_D_SERVICE_VERSION, strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_VERSION)); span.setTag(DiscoveryConstant.N_D_SERVICE_REGION, strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_REGION)); + span.setTag(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT)); String routeVersion = strategyContextHolder.getHeader(DiscoveryConstant.N_D_VERSION); if (StringUtils.isNotEmpty(routeVersion)) { @@ -149,6 +150,7 @@ public void opentracingLocal(String className, String methodName, Map filter(ServerWebExchange exchange, GatewayFilterChain chain) { GatewayStrategyFilterResolver.setHeader(requestBuilder, DiscoveryConstant.N_D_SERVICE_ADDRESS, pluginAdapter.getHost() + ":" + pluginAdapter.getPort(), gatewayHeaderPriority); GatewayStrategyFilterResolver.setHeader(requestBuilder, DiscoveryConstant.N_D_SERVICE_VERSION, pluginAdapter.getVersion(), gatewayHeaderPriority); GatewayStrategyFilterResolver.setHeader(requestBuilder, DiscoveryConstant.N_D_SERVICE_REGION, pluginAdapter.getRegion(), gatewayHeaderPriority); + GatewayStrategyFilterResolver.setHeader(requestBuilder, DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, pluginAdapter.getEnvironment(), gatewayHeaderPriority); } ServerHttpRequest newRequest = requestBuilder.build(); diff --git a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/AbstractStrategyInterceptor.java b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/AbstractStrategyInterceptor.java index b940557a9a..83af032a0f 100644 --- a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/AbstractStrategyInterceptor.java +++ b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/AbstractStrategyInterceptor.java @@ -106,7 +106,8 @@ protected boolean isHeaderContainsExcludeInner(String headerName) { !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_ID) && !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_ADDRESS) && !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_VERSION) && - !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_REGION); + !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_REGION) && + !StringUtils.equals(headerName, DiscoveryConstant.N_D_SERVICE_ENVIRONMENT); // return isHeaderContains(headerName) && !headerName.startsWith(DiscoveryConstant.N_D_SERVICE_PREFIX); } } \ No newline at end of file diff --git a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/FeignStrategyInterceptor.java b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/FeignStrategyInterceptor.java index 0b70a88e6e..a472b51c24 100644 --- a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/FeignStrategyInterceptor.java +++ b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/FeignStrategyInterceptor.java @@ -76,6 +76,7 @@ private void applyInnerHeader(RequestTemplate requestTemplate) { requestTemplate.header(DiscoveryConstant.N_D_SERVICE_ADDRESS, pluginAdapter.getHost() + ":" + pluginAdapter.getPort()); requestTemplate.header(DiscoveryConstant.N_D_SERVICE_VERSION, pluginAdapter.getVersion()); requestTemplate.header(DiscoveryConstant.N_D_SERVICE_REGION, pluginAdapter.getRegion()); + requestTemplate.header(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, pluginAdapter.getEnvironment()); } } diff --git a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/RestTemplateStrategyInterceptor.java b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/RestTemplateStrategyInterceptor.java index 63e62d810b..a53a499a63 100644 --- a/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/RestTemplateStrategyInterceptor.java +++ b/discovery-plugin-strategy-starter-service/src/main/java/com/nepxion/discovery/plugin/strategy/service/aop/RestTemplateStrategyInterceptor.java @@ -82,6 +82,7 @@ private void applyInnerHeader(HttpRequest request) { headers.add(DiscoveryConstant.N_D_SERVICE_ADDRESS, pluginAdapter.getHost() + ":" + pluginAdapter.getPort()); headers.add(DiscoveryConstant.N_D_SERVICE_VERSION, pluginAdapter.getVersion()); headers.add(DiscoveryConstant.N_D_SERVICE_REGION, pluginAdapter.getRegion()); + headers.add(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, pluginAdapter.getEnvironment()); } } diff --git a/discovery-plugin-strategy-starter-zuul/src/main/java/com/nepxion/discovery/plugin/strategy/zuul/filter/AbstractZuulStrategyRouteFilter.java b/discovery-plugin-strategy-starter-zuul/src/main/java/com/nepxion/discovery/plugin/strategy/zuul/filter/AbstractZuulStrategyRouteFilter.java index 97c8627c51..40aaebbd11 100644 --- a/discovery-plugin-strategy-starter-zuul/src/main/java/com/nepxion/discovery/plugin/strategy/zuul/filter/AbstractZuulStrategyRouteFilter.java +++ b/discovery-plugin-strategy-starter-zuul/src/main/java/com/nepxion/discovery/plugin/strategy/zuul/filter/AbstractZuulStrategyRouteFilter.java @@ -107,6 +107,7 @@ public Object run() { ZuulStrategyFilterResolver.setHeader(DiscoveryConstant.N_D_SERVICE_ADDRESS, pluginAdapter.getHost() + ":" + pluginAdapter.getPort(), zuulHeaderPriority); ZuulStrategyFilterResolver.setHeader(DiscoveryConstant.N_D_SERVICE_VERSION, pluginAdapter.getVersion(), zuulHeaderPriority); ZuulStrategyFilterResolver.setHeader(DiscoveryConstant.N_D_SERVICE_REGION, pluginAdapter.getRegion(), zuulHeaderPriority); + ZuulStrategyFilterResolver.setHeader(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, pluginAdapter.getEnvironment(), zuulHeaderPriority); } extendFilter(); diff --git a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/tracer/StrategyTracer.java b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/tracer/StrategyTracer.java index 9ae56a8cf3..f967fb8968 100644 --- a/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/tracer/StrategyTracer.java +++ b/discovery-plugin-strategy/src/main/java/com/nepxion/discovery/plugin/strategy/tracer/StrategyTracer.java @@ -68,6 +68,7 @@ public void mdcHeader() { MDC.put(DiscoveryConstant.N_D_SERVICE_ADDRESS, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_ADDRESS + "=" : StringUtils.EMPTY) + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ADDRESS)); MDC.put(DiscoveryConstant.N_D_SERVICE_VERSION, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_VERSION + "=" : StringUtils.EMPTY) + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_VERSION)); MDC.put(DiscoveryConstant.N_D_SERVICE_REGION, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_REGION + "=" : StringUtils.EMPTY) + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_REGION)); + MDC.put(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_ENVIRONMENT + "=" : StringUtils.EMPTY) + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT)); LOG.debug("Trace chain information outputs to MDC..."); } @@ -94,6 +95,7 @@ public void mdcLocal() { MDC.put(DiscoveryConstant.N_D_SERVICE_ADDRESS, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_ADDRESS + "=" : StringUtils.EMPTY) + pluginAdapter.getHost() + ":" + pluginAdapter.getPort()); MDC.put(DiscoveryConstant.N_D_SERVICE_VERSION, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_VERSION + "=" : StringUtils.EMPTY) + pluginAdapter.getVersion()); MDC.put(DiscoveryConstant.N_D_SERVICE_REGION, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_REGION + "=" : StringUtils.EMPTY) + pluginAdapter.getRegion()); + MDC.put(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT, (traceLoggerMdcKeyShown ? DiscoveryConstant.N_D_SERVICE_ENVIRONMENT + "=" : StringUtils.EMPTY) + pluginAdapter.getEnvironment()); LOG.debug("Trace chain information outputs to MDC..."); } @@ -124,6 +126,7 @@ public void debugHeader() { System.out.println(DiscoveryConstant.N_D_SERVICE_ADDRESS + "=" + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ADDRESS)); System.out.println(DiscoveryConstant.N_D_SERVICE_VERSION + "=" + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_VERSION)); System.out.println(DiscoveryConstant.N_D_SERVICE_REGION + "=" + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_REGION)); + System.out.println(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT + "=" + strategyContextHolder.getHeader(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT)); String routeVersion = strategyContextHolder.getHeader(DiscoveryConstant.N_D_VERSION); if (StringUtils.isNotEmpty(routeVersion)) { @@ -171,6 +174,7 @@ public void debugLocal() { System.out.println(DiscoveryConstant.N_D_SERVICE_ADDRESS + "=" + pluginAdapter.getHost() + ":" + pluginAdapter.getPort()); System.out.println(DiscoveryConstant.N_D_SERVICE_VERSION + "=" + pluginAdapter.getVersion()); System.out.println(DiscoveryConstant.N_D_SERVICE_REGION + "=" + pluginAdapter.getRegion()); + System.out.println(DiscoveryConstant.N_D_SERVICE_ENVIRONMENT + "=" + pluginAdapter.getEnvironment()); String routeVersion = strategyContextHolder.getHeader(DiscoveryConstant.N_D_VERSION); if (StringUtils.isNotEmpty(routeVersion)) { diff --git a/discovery-springcloud-example-gateway/src/main/java/com/nepxion/discovery/plugin/example/gateway/impl/MyDiscoveryEnabledStrategy.java b/discovery-springcloud-example-gateway/src/main/java/com/nepxion/discovery/plugin/example/gateway/impl/MyDiscoveryEnabledStrategy.java index 428a152453..6705145608 100644 --- a/discovery-springcloud-example-gateway/src/main/java/com/nepxion/discovery/plugin/example/gateway/impl/MyDiscoveryEnabledStrategy.java +++ b/discovery-springcloud-example-gateway/src/main/java/com/nepxion/discovery/plugin/example/gateway/impl/MyDiscoveryEnabledStrategy.java @@ -41,9 +41,10 @@ private boolean applyFromHeader(Server server) { String serviceId = pluginAdapter.getServerServiceId(server); String version = pluginAdapter.getServerVersion(server); String region = pluginAdapter.getServerRegion(server); + String environment = pluginAdapter.getServerEnvironment(server); String address = server.getHostPort(); - LOG.info("负载均衡用户定制触发:mobile={}, serviceId={}, version={}, region={}, address={}", mobile, serviceId, version, region, address); + LOG.info("负载均衡用户定制触发:mobile={}, serviceId={}, version={}, region={}, env={}, address={}", mobile, serviceId, version, region, environment, address); if (StringUtils.isNotEmpty(mobile)) { // 手机号以移动138开头,路由到1.0版本的服务上 diff --git a/discovery-springcloud-example-gateway/src/main/resources/bootstrap.properties b/discovery-springcloud-example-gateway/src/main/resources/bootstrap.properties index ab6f0fcd5d..f22482eea7 100644 --- a/discovery-springcloud-example-gateway/src/main/resources/bootstrap.properties +++ b/discovery-springcloud-example-gateway/src/main/resources/bootstrap.properties @@ -131,6 +131,13 @@ spring.application.strategy.trace.debug.enabled=true # 开启Spring Cloud Gateway网关上实现Hystrix线程隔离模式做服务隔离时,必须把spring.application.strategy.hystrix.threadlocal.supported设置为true,同时要引入discovery-plugin-strategy-starter-hystrix包,否则线程切换时会发生ThreadLocal上下文对象丢失。缺失则默认为false # spring.application.strategy.hystrix.threadlocal.supported=true +# 启动和关闭环境隔离和切流。缺失则默认为false +# 环境隔离:调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用 +# 环境切流:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量切到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default) +# spring.application.environment.isolation.enabled=false +# 流量切到指定的环境下。不允许为保留值default,缺失则默认为common +# spring.application.environment.transfer=common + # 开启和关闭使用服务名前缀来作为服务组名。缺失则默认为false # spring.application.group.generator.enabled=true # 服务名前缀的长度,必须大于0 diff --git a/discovery-springcloud-example-service/src/main/java/com/nepxion/discovery/plugin/example/service/impl/MyDiscoveryEnabledStrategy.java b/discovery-springcloud-example-service/src/main/java/com/nepxion/discovery/plugin/example/service/impl/MyDiscoveryEnabledStrategy.java index a38f9dc3c8..e29d9b9f52 100644 --- a/discovery-springcloud-example-service/src/main/java/com/nepxion/discovery/plugin/example/service/impl/MyDiscoveryEnabledStrategy.java +++ b/discovery-springcloud-example-service/src/main/java/com/nepxion/discovery/plugin/example/service/impl/MyDiscoveryEnabledStrategy.java @@ -50,9 +50,10 @@ private boolean applyFromHeader(Server server) { String serviceId = pluginAdapter.getServerServiceId(server); String version = pluginAdapter.getServerVersion(server); String region = pluginAdapter.getServerRegion(server); + String environment = pluginAdapter.getServerEnvironment(server); String address = server.getHostPort(); - LOG.info("负载均衡用户定制触发:token={}, serviceId={}, version={}, region={}, address={}", token, serviceId, version, region, address); + LOG.info("负载均衡用户定制触发:token={}, serviceId={}, version={}, region={}, env={}, address={}", token, serviceId, version, region, environment, address); String filterServiceId = "discovery-springcloud-example-c"; String filterToken = "123"; @@ -72,9 +73,10 @@ private boolean applyFromMethod(Server server) { String serviceId = pluginAdapter.getServerServiceId(server); String version = pluginAdapter.getServerVersion(server); String region = pluginAdapter.getServerRegion(server); + String environment = pluginAdapter.getServerEnvironment(server); String address = server.getHostPort(); - LOG.info("负载均衡用户定制触发:attributes={}, serviceId={}, version={}, region={}, address={}", attributes, serviceId, version, region, address); + LOG.info("负载均衡用户定制触发:attributes={}, serviceId={}, version={}, region={}, env={}, address={}", attributes, serviceId, version, region, environment, address); String filterServiceId = "discovery-springcloud-example-b"; String filterVersion = "1.0"; diff --git a/discovery-springcloud-example-service/src/main/resources/application-a1.properties b/discovery-springcloud-example-service/src/main/resources/application-a1.properties index 13c33ff1ee..e2190c4d80 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-a1.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-a1.properties @@ -6,19 +6,22 @@ server.port=1100 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.0 eureka.instance.metadataMap.region=dev +eureka.instance.metadataMap.env=env1 # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev,env=env1 # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.0 spring.cloud.zookeeper.discovery.metadata.region=dev +spring.cloud.zookeeper.discovery.metadata.env=env1 # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.0 spring.cloud.nacos.discovery.metadata.region=dev +spring.cloud.nacos.discovery.metadata.env=env1 # Management config management.server.port=5100 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-a2.properties b/discovery-springcloud-example-service/src/main/resources/application-a2.properties index 713aed5626..ba82b511fa 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-a2.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-a2.properties @@ -6,19 +6,22 @@ server.port=1101 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.1 eureka.instance.metadataMap.region=qa +eureka.instance.metadataMap.env=common # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa,env=common # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.1 spring.cloud.zookeeper.discovery.metadata.region=qa +spring.cloud.zookeeper.discovery.metadata.env=common # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.1 spring.cloud.nacos.discovery.metadata.region=qa +spring.cloud.nacos.discovery.metadata.env=common # Management config management.server.port=5101 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-b1.properties b/discovery-springcloud-example-service/src/main/resources/application-b1.properties index 9a172529d2..9ba4603c3b 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-b1.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-b1.properties @@ -6,19 +6,22 @@ server.port=1200 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.0 eureka.instance.metadataMap.region=dev +eureka.instance.metadataMap.env=env1 # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev,env=env1 # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.0 spring.cloud.zookeeper.discovery.metadata.region=dev +spring.cloud.zookeeper.discovery.metadata.env=env1 # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.0 spring.cloud.nacos.discovery.metadata.region=dev +spring.cloud.nacos.discovery.metadata.env=env1 # Management config management.server.port=5200 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-b2.properties b/discovery-springcloud-example-service/src/main/resources/application-b2.properties index 4073f8aee4..0ec1c66418 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-b2.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-b2.properties @@ -6,19 +6,22 @@ server.port=1201 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.1 eureka.instance.metadataMap.region=qa +eureka.instance.metadataMap.env=common # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa,env=common # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.1 spring.cloud.zookeeper.discovery.metadata.region=qa +spring.cloud.zookeeper.discovery.metadata.env=common # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.1 spring.cloud.nacos.discovery.metadata.region=qa +spring.cloud.nacos.discovery.metadata.env=common # Management config management.server.port=5201 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-c1.properties b/discovery-springcloud-example-service/src/main/resources/application-c1.properties index 09229fc3a9..a549323294 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-c1.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-c1.properties @@ -6,19 +6,22 @@ server.port=1300 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.0 eureka.instance.metadataMap.region=dev +eureka.instance.metadataMap.env=env1 # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.0,region=dev,env=env1 # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.0 spring.cloud.zookeeper.discovery.metadata.region=dev +spring.cloud.zookeeper.discovery.metadata.env=env1 # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.0 spring.cloud.nacos.discovery.metadata.region=dev +spring.cloud.nacos.discovery.metadata.env=env1 # Management config management.server.port=5300 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-c2.properties b/discovery-springcloud-example-service/src/main/resources/application-c2.properties index dceae39268..386daad579 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-c2.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-c2.properties @@ -6,19 +6,22 @@ server.port=1301 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.1 eureka.instance.metadataMap.region=qa +eureka.instance.metadataMap.env=common # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.1,region=qa,env=common # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.1 spring.cloud.zookeeper.discovery.metadata.region=qa +spring.cloud.zookeeper.discovery.metadata.env=common # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.1 spring.cloud.nacos.discovery.metadata.region=qa +spring.cloud.nacos.discovery.metadata.env=common # Management config management.server.port=5301 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/application-c3.properties b/discovery-springcloud-example-service/src/main/resources/application-c3.properties index d22238b3d8..af9f58aa2f 100644 --- a/discovery-springcloud-example-service/src/main/resources/application-c3.properties +++ b/discovery-springcloud-example-service/src/main/resources/application-c3.properties @@ -6,19 +6,22 @@ server.port=1302 eureka.instance.metadataMap.group=example-service-group eureka.instance.metadataMap.version=1.2 eureka.instance.metadataMap.region=qa +eureka.instance.metadataMap.env=env2 # Consul config for discovery -spring.cloud.consul.discovery.tags=group=example-service-group,version=1.2,region=qa +spring.cloud.consul.discovery.tags=group=example-service-group,version=1.2,region=qa,env=env2 # Zookeeper config for discovery spring.cloud.zookeeper.discovery.metadata.group=example-service-group spring.cloud.zookeeper.discovery.metadata.version=1.2 spring.cloud.zookeeper.discovery.metadata.region=qa +spring.cloud.zookeeper.discovery.metadata.env=env2 # Nacos config for discovery spring.cloud.nacos.discovery.metadata.group=example-service-group spring.cloud.nacos.discovery.metadata.version=1.2 spring.cloud.nacos.discovery.metadata.region=qa +spring.cloud.nacos.discovery.metadata.env=env2 # Management config management.server.port=5302 \ No newline at end of file diff --git a/discovery-springcloud-example-service/src/main/resources/bootstrap.properties b/discovery-springcloud-example-service/src/main/resources/bootstrap.properties index 892c448dd0..ade60200f1 100644 --- a/discovery-springcloud-example-service/src/main/resources/bootstrap.properties +++ b/discovery-springcloud-example-service/src/main/resources/bootstrap.properties @@ -175,6 +175,13 @@ spring.application.strategy.trace.debug.enabled=true # 服务端执行规则时候,以Http请求中的Header值作为关键Key。缺失则默认为n-d-service-id,即以服务名作为关键Key # spring.application.strategy.service.sentinel.request.origin.key=n-d-service-id +# 启动和关闭环境隔离和切流。缺失则默认为false +# 环境隔离:调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用 +# 环境切流:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量切到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default) +# spring.application.environment.isolation.enabled=false +# 流量切到指定的环境下。不允许为保留值default,缺失则默认为common +# spring.application.environment.transfer=common + # 开启和关闭使用服务名前缀来作为服务组名。缺失则默认为false # spring.application.group.generator.enabled=true # 服务名前缀的长度,必须大于0 diff --git a/discovery-springcloud-example-zuul/src/main/java/com/nepxion/discovery/plugin/example/zuul/impl/MyDiscoveryEnabledStrategy.java b/discovery-springcloud-example-zuul/src/main/java/com/nepxion/discovery/plugin/example/zuul/impl/MyDiscoveryEnabledStrategy.java index f15f44f6ea..8852014ed5 100644 --- a/discovery-springcloud-example-zuul/src/main/java/com/nepxion/discovery/plugin/example/zuul/impl/MyDiscoveryEnabledStrategy.java +++ b/discovery-springcloud-example-zuul/src/main/java/com/nepxion/discovery/plugin/example/zuul/impl/MyDiscoveryEnabledStrategy.java @@ -41,9 +41,10 @@ private boolean applyFromHeader(Server server) { String serviceId = pluginAdapter.getServerServiceId(server); String version = pluginAdapter.getServerVersion(server); String region = pluginAdapter.getServerRegion(server); + String environment = pluginAdapter.getServerEnvironment(server); String address = server.getHostPort(); - LOG.info("负载均衡用户定制触发:mobile={}, serviceId={}, version={}, region={}, address={}", mobile, serviceId, version, region, address); + LOG.info("负载均衡用户定制触发:mobile={}, serviceId={}, version={}, region={}, env={}, address={}", mobile, serviceId, version, region, environment, address); if (StringUtils.isNotEmpty(mobile)) { // 手机号以移动138开头,路由到1.0版本的服务上 diff --git a/discovery-springcloud-example-zuul/src/main/resources/bootstrap.properties b/discovery-springcloud-example-zuul/src/main/resources/bootstrap.properties index b5512430ee..18ca8540b3 100644 --- a/discovery-springcloud-example-zuul/src/main/resources/bootstrap.properties +++ b/discovery-springcloud-example-zuul/src/main/resources/bootstrap.properties @@ -131,6 +131,13 @@ spring.application.strategy.trace.debug.enabled=true # 开启Zuul网关上实现Hystrix线程隔离模式做服务隔离时,必须把spring.application.strategy.hystrix.threadlocal.supported设置为true,同时要引入discovery-plugin-strategy-starter-hystrix包,否则线程切换时会发生ThreadLocal上下文对象丢失。缺失则默认为false # spring.application.strategy.hystrix.threadlocal.supported=true +# 启动和关闭环境隔离和切流。缺失则默认为false +# 环境隔离:调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用 +# 环境切流:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量切到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default) +# spring.application.environment.isolation.enabled=false +# 流量切到指定的环境下。不允许为保留值default,缺失则默认为common +# spring.application.environment.transfer=common + # 开启和关闭使用服务名前缀来作为服务组名。缺失则默认为false # spring.application.group.generator.enabled=true # 服务名前缀的长度,必须大于0