diff --git a/polaris-circuitbreaker/polaris-circuitbreaker-client/src/main/java/com/tencent/polaris/circuitbreak/client/api/DefaultCircuitBreakAPI.java b/polaris-circuitbreaker/polaris-circuitbreaker-client/src/main/java/com/tencent/polaris/circuitbreak/client/api/DefaultCircuitBreakAPI.java index 068f911f4..d5d9cc14c 100644 --- a/polaris-circuitbreaker/polaris-circuitbreaker-client/src/main/java/com/tencent/polaris/circuitbreak/client/api/DefaultCircuitBreakAPI.java +++ b/polaris-circuitbreaker/polaris-circuitbreaker-client/src/main/java/com/tencent/polaris/circuitbreak/client/api/DefaultCircuitBreakAPI.java @@ -20,11 +20,21 @@ import com.tencent.polaris.api.config.consumer.CircuitBreakerConfig; import com.tencent.polaris.api.plugin.circuitbreaker.CircuitBreaker; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.AbstractResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.InstanceResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.MethodResource; import com.tencent.polaris.api.plugin.circuitbreaker.entity.Resource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.ServiceResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.SubsetResource; import com.tencent.polaris.api.plugin.compose.Extensions; import com.tencent.polaris.api.pojo.CircuitBreakerStatus; import com.tencent.polaris.api.pojo.CircuitBreakerStatus.Status; import com.tencent.polaris.api.pojo.HalfOpenStatus; +import com.tencent.polaris.api.pojo.ServiceEventKey; +import com.tencent.polaris.api.pojo.ServiceEventKey.EventType; +import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.pojo.ServiceRule; +import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; import com.tencent.polaris.circuitbreak.api.FunctionalDecorator; import com.tencent.polaris.circuitbreak.api.InvokeHandler; @@ -34,11 +44,20 @@ import com.tencent.polaris.client.api.BaseEngine; import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.client.api.ServiceCallResultListener; +import com.tencent.polaris.client.flow.BaseFlow; +import com.tencent.polaris.client.flow.DefaultServiceResourceProvider; import com.tencent.polaris.client.util.CommonValidator; +import com.tencent.polaris.logging.LoggerFactory; +import org.slf4j.Logger; + import java.util.List; +import java.util.Objects; +import java.util.Optional; public class DefaultCircuitBreakAPI extends BaseEngine implements CircuitBreakAPI { + private static Logger LOG = LoggerFactory.getLogger(DefaultCircuitBreakAPI.class); + private ServiceCallResultChecker checker; public DefaultCircuitBreakAPI(SDKContext sdkContext) { @@ -112,7 +131,52 @@ public static void report(ResourceStat reportStat, Extensions extensions) { if (null == circuitBreaker) { return; } - circuitBreaker.report(reportStat); + Resource resource = replaceResource(reportStat.getResource(), extensions); + if (LOG.isDebugEnabled()) { + LOG.debug("[CircuitBreaker] report resource old info : {} new info : {}", reportStat.getResource(), resource); + } + ResourceStat copyStat = new ResourceStat(resource, reportStat.getRetCode(), reportStat.getDelay(), reportStat.getRetStatus()); + circuitBreaker.report(copyStat); + } + + + private static Resource replaceResource(Resource resource, Extensions extensions) { + try { + if (!(resource instanceof AbstractResource)) { + return resource; + } + ServiceKey callerService = resource.getCallerService(); + if (Objects.isNull(callerService)) { + return resource; + } + if (StringUtils.isAllEmpty(callerService.getService(), callerService.getNamespace())) { + return resource; + } + DefaultServiceResourceProvider provider = new DefaultServiceResourceProvider(extensions); + ServiceRule rule = provider.getServiceRule(new ServiceEventKey(callerService, EventType.CIRCUIT_BREAKING)); + ServiceKey serviceKey = Optional.ofNullable(rule.getAliasFor()).orElse(callerService); + + if (resource instanceof InstanceResource) { + InstanceResource old = (InstanceResource) resource; + return new InstanceResource(old.getService(), old.getHost(), old.getPort(), serviceKey); + } + if (resource instanceof MethodResource) { + MethodResource old = (MethodResource) resource; + return new MethodResource(old.getService(), old.getMethod(), serviceKey); + } + if (resource instanceof ServiceResource) { + ServiceResource old = (ServiceResource) resource; + return new ServiceResource(old.getService(), serviceKey); + } + if (resource instanceof SubsetResource) { + SubsetResource old = (SubsetResource) resource; + return new SubsetResource(old.getService(), old.getSubset(), old.getMetadata(), serviceKey); + } + return resource; + } catch (Throwable ex) { + LOG.error("[CircuitBreaker] replace resource caller_service info fail", ex); + return resource; + } } @Override diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/ServiceRule.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/ServiceRule.java index dd378b4f8..9c1653cef 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/ServiceRule.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/ServiceRule.java @@ -42,4 +42,11 @@ public interface ServiceRule { * @return revision */ String getRevision(); + + /** + * 获取服务原始名称信息 + * + * @return {@link ServiceKey} + */ + ServiceKey getAliasFor(); } diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServiceRuleByProto.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServiceRuleByProto.java index 8b75ab2f0..8cec3f2f4 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServiceRuleByProto.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServiceRuleByProto.java @@ -21,7 +21,12 @@ import com.google.protobuf.TextFormat; import com.tencent.polaris.api.pojo.RegistryCacheValue; import com.tencent.polaris.api.pojo.ServiceEventKey.EventType; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.ServiceRule; +import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; + +import java.util.Objects; /** * 通过PB对象封装的服务信息 @@ -43,12 +48,21 @@ public class ServiceRuleByProto implements ServiceRule, RegistryCacheValue { private final EventType eventType; - public ServiceRuleByProto(Message ruleValue, String revision, boolean loadFromFile, EventType eventType) { + private ServiceKey aliasFor; + + public ServiceRuleByProto(Message ruleValue, Service aliasFor, String revision, boolean loadFromFile, EventType eventType) { this.ruleValue = ruleValue; this.revision = revision; this.loadFromFile = loadFromFile; this.initialized = true; this.eventType = eventType; + if (Objects.nonNull(aliasFor)) { + this.aliasFor = new ServiceKey(aliasFor.getNamespace().getValue(), aliasFor.getName().getValue()); + } + } + + public ServiceRuleByProto(Message ruleValue, String revision, boolean loadFromFile, EventType eventType) { + this(ruleValue, null, revision, loadFromFile, eventType); } public ServiceRuleByProto() { @@ -69,6 +83,14 @@ public String getRevision() { return revision; } + @Override + public ServiceKey getAliasFor() { + if (StringUtils.isAllEmpty(aliasFor.getService(), aliasFor.getNamespace())) { + return null; + } + return aliasFor; + } + @Override public boolean isLoadedFromFile() { diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServicesByProto.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServicesByProto.java index 9f9d6d041..4501c4a84 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServicesByProto.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/pojo/ServicesByProto.java @@ -42,6 +42,8 @@ public class ServicesByProto implements Services, RegistryCacheValue { private final int hashCode; + private String revision; + private ServiceKey svcKey; public ServicesByProto() { @@ -63,6 +65,9 @@ public ServicesByProto(ResponseProto.DiscoverResponse response, boolean loadFrom this.services = new ArrayList<>(); this.svcKey = new ServiceKey("", ""); + if (Objects.nonNull(response.getService())) { + this.revision = response.getService().getRevision().getValue(); + } if (CollectionUtils.isNotEmpty(tmpServices)) { ServiceProto.Service svc = tmpServices.get(0); diff --git a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/circuitbreaker/entity/AbstractResource.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/circuitbreaker/entity/AbstractResource.java index 84e7f28a8..c10afaacf 100644 --- a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/circuitbreaker/entity/AbstractResource.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/circuitbreaker/entity/AbstractResource.java @@ -24,7 +24,7 @@ public abstract class AbstractResource implements Resource { protected final ServiceKey service; - protected final ServiceKey callerService; + protected ServiceKey callerService; public AbstractResource(ServiceKey service, ServiceKey callerService) { this.service = service; @@ -41,6 +41,10 @@ public ServiceKey getService() { return service; } + public void setCallerService(ServiceKey callerService) { + this.callerService = callerService; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/route/RouteInfo.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/route/RouteInfo.java index bb692bdc8..23d57b6c9 100644 --- a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/route/RouteInfo.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/route/RouteInfo.java @@ -43,9 +43,9 @@ public class RouteInfo { //源服务信息 - private final SourceService sourceService; + private SourceService sourceService; //目的服务信息 - private final ServiceMetadata destService; + private ServiceMetadata destService; //源路由规则 private ServiceRule sourceRouteRule; @@ -132,6 +132,14 @@ public RouteInfo(SourceService sourceService, ServiceMetadata destService, Strin this(sourceService, null, destService, null, method, serviceConfig); } + public void setSourceService(SourceService sourceService) { + this.sourceService = sourceService; + } + + public void setDestService(ServiceMetadata destService) { + this.destService = destService; + } + public MetadataFailoverType getMetadataFailoverType() { return metadataFailoverType; } diff --git a/polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/PolarisCircuitBreaker.java b/polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/PolarisCircuitBreaker.java index 75aa8a0d9..706535354 100644 --- a/polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/PolarisCircuitBreaker.java +++ b/polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/PolarisCircuitBreaker.java @@ -23,20 +23,35 @@ import com.tencent.polaris.api.plugin.PluginType; import com.tencent.polaris.api.plugin.circuitbreaker.CircuitBreaker; import com.tencent.polaris.api.plugin.circuitbreaker.ResourceStat; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.AbstractResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.InstanceResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.MethodResource; import com.tencent.polaris.api.plugin.circuitbreaker.entity.Resource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.ServiceResource; +import com.tencent.polaris.api.plugin.circuitbreaker.entity.SubsetResource; import com.tencent.polaris.api.plugin.common.InitContext; import com.tencent.polaris.api.plugin.common.PluginTypes; import com.tencent.polaris.api.plugin.compose.Extensions; import com.tencent.polaris.api.plugin.detect.HealthChecker; import com.tencent.polaris.api.pojo.CircuitBreakerStatus; import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.pojo.ServiceEventKey; +import com.tencent.polaris.api.pojo.ServiceEventKey.EventType; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.ServiceResourceProvider; +import com.tencent.polaris.api.pojo.ServiceRule; +import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.client.flow.DefaultServiceResourceProvider; import com.tencent.polaris.client.util.NamedThreadFactory; +import com.tencent.polaris.logging.LoggerFactory; import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.Level; +import org.slf4j.Logger; + import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -44,6 +59,8 @@ public class PolarisCircuitBreaker extends Destroyable implements CircuitBreaker { + private static final Logger LOG = LoggerFactory.getLogger(PolarisCircuitBreaker.class); + private final Map> countersCache = new HashMap<>(); private final Map healthCheckCache = new HashMap<>(); diff --git a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/CircuitBreakCacheHandler.java b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/CircuitBreakCacheHandler.java index 277ed819a..d2fa5904d 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/CircuitBreakCacheHandler.java +++ b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/CircuitBreakCacheHandler.java @@ -23,6 +23,7 @@ import com.tencent.polaris.client.pojo.ServiceRuleByProto; import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto.CircuitBreaker; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; public class CircuitBreakCacheHandler extends AbstractCacheHandler { @@ -48,6 +49,7 @@ public RegistryCacheValue messageToCacheValue(RegistryCacheValue oldValue, Objec if (null != circuitBreaker) { revision = circuitBreaker.getRevision().getValue(); } - return new ServiceRuleByProto(circuitBreaker, revision, isCacheLoaded, getTargetEventType()); + Service aliasFor = discoverResponse.getAliasFor(); + return new ServiceRuleByProto(circuitBreaker, aliasFor, revision, isCacheLoaded, getTargetEventType()); } } diff --git a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/FaultDetectCacheHandler.java b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/FaultDetectCacheHandler.java index f38b83e6e..1a38869a6 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/FaultDetectCacheHandler.java +++ b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/FaultDetectCacheHandler.java @@ -23,6 +23,7 @@ import com.tencent.polaris.client.pojo.ServiceRuleByProto; import com.tencent.polaris.specification.api.v1.fault.tolerance.FaultDetectorProto.FaultDetector; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; public class FaultDetectCacheHandler extends AbstractCacheHandler { @@ -48,6 +49,7 @@ public RegistryCacheValue messageToCacheValue(RegistryCacheValue oldValue, Objec if (null != faultDetector) { revision = faultDetector.getRevision(); } - return new ServiceRuleByProto(faultDetector, revision, isCacheLoaded, getTargetEventType()); + Service aliasFor = discoverResponse.getAliasFor(); + return new ServiceRuleByProto(faultDetector, aliasFor, revision, isCacheLoaded, getTargetEventType()); } } diff --git a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/RoutingCacheHandler.java b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/RoutingCacheHandler.java index 04cf5683f..57f1cd160 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/RoutingCacheHandler.java +++ b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/RoutingCacheHandler.java @@ -22,6 +22,7 @@ import com.tencent.polaris.api.pojo.ServiceEventKey.EventType; import com.tencent.polaris.client.pojo.ServiceRuleByProto; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto.Routing; public class RoutingCacheHandler extends AbstractCacheHandler { @@ -39,7 +40,8 @@ public RegistryCacheValue messageToCacheValue(RegistryCacheValue oldValue, Objec if (null != routing) { revision = routing.getRevision().getValue(); } - return new ServiceRuleByProto(routing, revision, isCacheLoaded, getTargetEventType()); + Service aliasFor = discoverResponse.getAliasFor(); + return new ServiceRuleByProto(routing, aliasFor, revision, isCacheLoaded, getTargetEventType()); } @Override diff --git a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServiceInstancesCacheHandler.java b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServiceInstancesCacheHandler.java index 239958333..0095d60c3 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServiceInstancesCacheHandler.java +++ b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServiceInstancesCacheHandler.java @@ -22,6 +22,7 @@ import com.tencent.polaris.api.pojo.ServiceEventKey.EventType; import com.tencent.polaris.client.pojo.ServiceInstancesByProto; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; public class ServiceInstancesCacheHandler extends AbstractCacheHandler { diff --git a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServicesCacheHandler.java b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServicesCacheHandler.java index e5cbe9a45..9ffdb4731 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServicesCacheHandler.java +++ b/polaris-plugins/polaris-plugins-connector/connector-polaris-grpc/src/main/java/com/tencent/polaris/plugins/connector/grpc/codec/ServicesCacheHandler.java @@ -23,6 +23,8 @@ import com.tencent.polaris.client.pojo.ServicesByProto; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import java.util.Objects; + public class ServicesCacheHandler extends AbstractCacheHandler { @@ -33,7 +35,10 @@ public EventType getTargetEventType() { @Override protected String getRevision(DiscoverResponse discoverResponse) { - return ""; + if (Objects.isNull(discoverResponse.getService())) { + return ""; + } + return discoverResponse.getService().getRevision().getValue(); } @Override diff --git a/polaris-plugins/polaris-plugins-router/router-rule/src/main/java/com/tencent/polaris/plugins/router/rule/RuleBasedRouter.java b/polaris-plugins/polaris-plugins-router/router-rule/src/main/java/com/tencent/polaris/plugins/router/rule/RuleBasedRouter.java index 96fd6e7cd..d175d478e 100644 --- a/polaris-plugins/polaris-plugins-router/router-rule/src/main/java/com/tencent/polaris/plugins/router/rule/RuleBasedRouter.java +++ b/polaris-plugins/polaris-plugins-router/router-rule/src/main/java/com/tencent/polaris/plugins/router/rule/RuleBasedRouter.java @@ -30,11 +30,15 @@ import com.tencent.polaris.api.plugin.route.RouteInfo; import com.tencent.polaris.api.plugin.route.RouteResult; import com.tencent.polaris.api.plugin.route.ServiceRouter; +import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.Service; +import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.pojo.ServiceInstances; +import com.tencent.polaris.api.pojo.ServiceInstancesWrap; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.ServiceMetadata; +import com.tencent.polaris.api.pojo.SourceService; import com.tencent.polaris.api.rpc.RuleBasedRouterFailoverType; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.MapUtils; @@ -51,7 +55,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.Random; + +import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto.Source; import org.slf4j.Logger; /** @@ -352,47 +360,70 @@ public RouteResult router(RouteInfo routeInfo, ServiceInstances instances) { List destFilteredInstances = null; List sourceFilteredInstances = null; MatchStatus matchStatus = new MatchStatus(); - if (routeInfo.getDestRouteRule() != null) { - destFilteredInstances = getRuleFilteredInstances(routeInfo, instances, - RuleMatchType.destRouteRuleMatch, matchStatus); - if (!destFilteredInstances.isEmpty()) { - ruleStatus = RuleStatus.destRuleSucc; + + ServiceMetadata oldDestService = routeInfo.getDestService(); + // 替换为真正的服务名称数据信息 + routeInfo = replaceServiceInfo(routeInfo); + try { + if (routeInfo.getDestRouteRule() != null) { + // 调整 ServiceInstances 的服务名称 + destFilteredInstances = getRuleFilteredInstances(routeInfo, instances, + RuleMatchType.destRouteRuleMatch, matchStatus); + if (!destFilteredInstances.isEmpty()) { + ruleStatus = RuleStatus.destRuleSucc; + } + if (destFilteredInstances.isEmpty() && matchStatus.matched) { + ruleStatus = RuleStatus.destRuleFail; + } } - if (destFilteredInstances.isEmpty() && matchStatus.matched) { - ruleStatus = RuleStatus.destRuleFail; + if (ruleStatus == RuleStatus.noRule && routeInfo.getSourceRouteRule() != null) { + // 然后匹配outbound规则 + sourceFilteredInstances = getRuleFilteredInstances(routeInfo, instances, + RuleMatchType.sourceRouteRuleMatch, matchStatus); + if (sourceFilteredInstances.isEmpty()) { + ruleStatus = RuleStatus.sourceRuleFail; + } else { + ruleStatus = RuleStatus.sourceRuleSucc; + } } - } - if (ruleStatus == RuleStatus.noRule && routeInfo.getSourceRouteRule() != null) { - // 然后匹配outbound规则 - sourceFilteredInstances = getRuleFilteredInstances(routeInfo, instances, - RuleMatchType.sourceRouteRuleMatch, matchStatus); - if (sourceFilteredInstances.isEmpty()) { - ruleStatus = RuleStatus.sourceRuleFail; - } else { - ruleStatus = RuleStatus.sourceRuleSucc; + switch (ruleStatus) { + case sourceRuleSucc: + return new RouteResult(sourceFilteredInstances, RouteResult.State.Next); + case destRuleSucc: + return new RouteResult(destFilteredInstances, RouteResult.State.Next); + default: + LOG.warn("route rule not match, rule status: {}, not matched source {}", ruleStatus, + routeInfo.getSourceService()); + + //请求里的配置优先级高于配置文件 + RuleBasedRouterFailoverType failoverType = routeInfo.getRuleBasedRouterFailoverType(); + if (failoverType == null) { + failoverType = routerConfig.getFailoverType(); + } + + if (failoverType == RuleBasedRouterFailoverType.none) { + return new RouteResult(Collections.emptyList(), RouteResult.State.Next); + } + + return new RouteResult(instances.getInstances(), RouteResult.State.Next); } + } finally { + // 恢复入参的原始信息数据 + routeInfo.setDestService(oldDestService); } - switch (ruleStatus) { - case sourceRuleSucc: - return new RouteResult(sourceFilteredInstances, RouteResult.State.Next); - case destRuleSucc: - return new RouteResult(destFilteredInstances, RouteResult.State.Next); - default: - LOG.warn("route rule not match, rule status: {}, not matched source {}", ruleStatus, - routeInfo.getSourceService()); - - //请求里的配置优先级高于配置文件 - RuleBasedRouterFailoverType failoverType = routeInfo.getRuleBasedRouterFailoverType(); - if (failoverType == null) { - failoverType = routerConfig.getFailoverType(); - } - - if (failoverType == RuleBasedRouterFailoverType.none) { - return new RouteResult(Collections.emptyList(), RouteResult.State.Next); - } + } - return new RouteResult(instances.getInstances(), RouteResult.State.Next); + private RouteInfo replaceServiceInfo(RouteInfo routeInfo) { + ServiceMetadata oldDestService = routeInfo.getDestService(); + if (Objects.nonNull(routeInfo.getDestRouteRule())) { + Service key = Optional.ofNullable((Service) routeInfo.getDestRouteRule().getAliasFor()).orElse(oldDestService); + ServiceInfo info = new ServiceInfo(); + info.setMetadata(oldDestService.getMetadata()); + info.setService(key.getService()); + info.setNamespace(key.getNamespace()); + routeInfo.setDestService(info); } + return routeInfo; } private static class MatchStatus { diff --git a/polaris-ratelimit/polaris-ratelimit-client/src/main/java/com/tencent/polaris/ratelimit/client/codec/RateLimitingCacheHandler.java b/polaris-ratelimit/polaris-ratelimit-client/src/main/java/com/tencent/polaris/ratelimit/client/codec/RateLimitingCacheHandler.java index 1ecedd009..80394666d 100644 --- a/polaris-ratelimit/polaris-ratelimit-client/src/main/java/com/tencent/polaris/ratelimit/client/codec/RateLimitingCacheHandler.java +++ b/polaris-ratelimit/polaris-ratelimit-client/src/main/java/com/tencent/polaris/ratelimit/client/codec/RateLimitingCacheHandler.java @@ -28,6 +28,7 @@ import com.tencent.polaris.ratelimit.api.rpc.RateLimitConsts; import com.tencent.polaris.specification.api.v1.model.ModelProto.MatchString; import com.tencent.polaris.specification.api.v1.service.manage.ResponseProto.DiscoverResponse; +import com.tencent.polaris.specification.api.v1.service.manage.ServiceProto.Service; import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto.MatchArgument; import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto.MatchArgument.Type; import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto.RateLimit; @@ -64,7 +65,8 @@ public RegistryCacheValue messageToCacheValue(RegistryCacheValue oldValue, Objec Collections.reverse(sortedRules); RateLimit newRateLimit = RateLimit.newBuilder().addAllRules(sortedRules) .setRevision(StringValue.newBuilder().setValue(revision).build()).build(); - return new ServiceRuleByProto(newRateLimit, revision, isCacheLoaded, getTargetEventType()); + Service aliasFor = discoverResponse.getAliasFor(); + return new ServiceRuleByProto(newRateLimit, aliasFor, revision, isCacheLoaded, getTargetEventType()); } private static final int RULE_SERVICE_LEVEL = 1; diff --git a/pom.xml b/pom.xml index 43f56e3f7..ba13bf377 100644 --- a/pom.xml +++ b/pom.xml @@ -75,7 +75,7 @@ 1.8 1.8 2.14.2 - 1.1.0 + 1.2.0-SNAPSHOT 1.4.5 2.1.1 1.3.2 @@ -332,7 +332,6 @@ ossrh https://oss.sonatype.org/content/repositories/snapshots/ - ossrh