Skip to content

Commit

Permalink
增加环境隔离和路由功能
Browse files Browse the repository at this point in the history
  • Loading branch information
HaojunRen committed Nov 22, 2019
1 parent f92795c commit caf8916
Show file tree
Hide file tree
Showing 11 changed files with 46 additions and 22 deletions.
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1206,10 +1206,10 @@ spring.application.strategy.sentinel.param.flow.path=classpath:sentinel-param-fl
# 服务端执行规则时候以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
# 启动和关闭环境隔离环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用缺失则默认为false
spring.application.environment.isolation.enabled=true
# 启动和关闭环境路由环境路由指在环境隔离下调用端实例找不到符合条件的提供端实例把流量路由到一个通用或者备份环境例如元数据Metadata环境配置值为common该值可配置但不允许为保留值default)。缺失则默认为false
spring.application.environment.route.enabled=true
# 流量路由到指定的环境下不允许为保留值default缺失则默认为common
spring.application.environment.route=common

Expand Down Expand Up @@ -1288,10 +1288,10 @@ 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
# 启动和关闭环境隔离环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用缺失则默认为false
spring.application.environment.isolation.enabled=true
# 启动和关闭环境路由环境路由指在环境隔离下调用端实例找不到符合条件的提供端实例把流量路由到一个通用或者备份环境例如元数据Metadata环境配置值为common该值可配置但不允许为保留值default)。缺失则默认为false
spring.application.environment.route.enabled=true
# 流量路由到指定的环境下不允许为保留值default缺失则默认为common
spring.application.environment.route=common

Expand Down Expand Up @@ -1370,10 +1370,10 @@ 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
# 启动和关闭环境隔离环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用缺失则默认为false
spring.application.environment.isolation.enabled=true
# 启动和关闭环境路由环境路由指在环境隔离下调用端实例找不到符合条件的提供端实例把流量路由到一个通用或者备份环境例如元数据Metadata环境配置值为common该值可配置但不允许为保留值default)。缺失则默认为false
spring.application.environment.route.enabled=true
# 流量路由到指定的环境下不允许为保留值default缺失则默认为common
spring.application.environment.route=common

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class DiscoveryConstant {
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_ROUTE_ENABLED = "spring.application.environment.route.enabled";
public static final String SPRING_APPLICATION_ENVIRONMENT_ROUTE = "spring.application.environment.route";
public static final String SPRING_APPLICATION_ENVIRONMENT_ROUTE_VALUE = "common";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,12 @@
"defaultValue": false,
"description": "Whether environment isolation is enabled."
},
{
"name": "spring.application.environment.route.enabled",
"type": "java.lang.Boolean",
"defaultValue": false,
"description": "Whether environment route is enabled."
},
{
"name": "spring.application.environment.route",
"type": "java.lang.String",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,21 @@

import com.nepxion.discovery.common.constant.DiscoveryConstant;

public abstract class DefaultEnvironmentRouteAdapter implements EnvironmentRouteAdapter {
public class DefaultEnvironmentRouteAdapter implements EnvironmentRouteAdapter {
@Autowired
protected PluginAdapter pluginAdapter;

@Value("${" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ROUTE_ENABLED + ":false}")
protected Boolean environmentRouteEnabled;

@Value("${" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ROUTE + ":" + DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ROUTE_VALUE + "}")
protected String environmentRoute;

@Override
public boolean isRouteEnabled() {
return environmentRouteEnabled;
}

@Override
public String getEnvironmentRoute() {
return environmentRoute;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

public interface EnvironmentRouteAdapter {
// 是否要环境路由
boolean isRoutable();
boolean isRouteEnabled();

// 路由到哪个环境中
String getEnvironmentRoute();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import org.springframework.context.annotation.Configuration;

import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.framework.adapter.DefaultEnvironmentRouteAdapter;
import com.nepxion.discovery.plugin.framework.adapter.EnvironmentRouteAdapter;
import com.nepxion.discovery.plugin.framework.cache.PluginCache;
import com.nepxion.discovery.plugin.framework.cache.RuleCache;
import com.nepxion.discovery.plugin.framework.context.PluginContextAware;
Expand Down Expand Up @@ -148,6 +150,13 @@ public EnvironmentFilterLoadBalanceListener environmentFilterLoadBalanceListener
return new EnvironmentFilterLoadBalanceListener();
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = DiscoveryConstant.SPRING_APPLICATION_ENVIRONMENT_ISOLATION_ENABLED, matchIfMissing = false)
public EnvironmentRouteAdapter environmentRouteAdapter() {
return new DefaultEnvironmentRouteAdapter();
}

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = DiscoveryConstant.SPRING_APPLICATION_GROUP_GENERATOR_ENABLED, matchIfMissing = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private void applyEnvironmentFilter(String providerServiceId, List<ServiceInstan
}
} else {
// 环境路由:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default)
if (environmentRouteAdapter != null && environmentRouteAdapter.isRoutable()) {
if (environmentRouteAdapter != null && environmentRouteAdapter.isRouteEnabled()) {
if (!StringUtils.equals(instanceEnvironment, environmentRouteAdapter.getEnvironmentRoute())) {
iterator.remove();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private void applyEnvironmentFilter(String providerServiceId, List<? extends Ser
}
} else {
// 环境路由:环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default)
if (environmentRouteAdapter != null && environmentRouteAdapter.isRoutable()) {
if (environmentRouteAdapter != null && environmentRouteAdapter.isRouteEnabled()) {
if (!StringUtils.equals(serverEnvironment, environmentRouteAdapter.getEnvironmentRoute())) {
iterator.remove();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,10 @@ 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)
# 启动和关闭环境隔离,环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用。缺失则默认为false
# spring.application.environment.isolation.enabled=false
# 启动和关闭环境路由,环境路由指在环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default)。缺失则默认为false
# spring.application.environment.route.enabled=false
# 流量路由到指定的环境下。不允许为保留值default,缺失则默认为common
# spring.application.environment.route=common

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,10 +175,10 @@ 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)
# 启动和关闭环境隔离,环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用。缺失则默认为false
# spring.application.environment.isolation.enabled=false
# 启动和关闭环境路由,环境路由指在环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default)。缺失则默认为false
# spring.application.environment.route.enabled=false
# 流量路由到指定的环境下。不允许为保留值default,缺失则默认为common
# spring.application.environment.route=common

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,10 @@ 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)
# 启动和关闭环境隔离,环境隔离指调用端实例和提供端实例的元数据Metadata环境配置值相等才能调用。缺失则默认为false
# spring.application.environment.isolation.enabled=false
# 启动和关闭环境路由,环境路由指在环境隔离下,调用端实例找不到符合条件的提供端实例,把流量路由到一个通用或者备份环境,例如:元数据Metadata环境配置值为common(该值可配置,但不允许为保留值default)。缺失则默认为false
# spring.application.environment.route.enabled=false
# 流量路由到指定的环境下。不允许为保留值default,缺失则默认为common
# spring.application.environment.route=common

Expand Down

0 comments on commit caf8916

Please sign in to comment.