Search in sources :

Example 1 with DefaultServiceEventKeysProvider

use of com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider in project polaris-java by polarismesh.

the class BaseFlow method commonGetOneInstance.

/**
 * 通用获取单个服务实例的方法,用于SDK内部调用
 *
 * @param extensions 插件上下文
 * @param serviceKey 服务信息
 * @param coreRouterNames 核心路由插件链
 * @param lbPolicy 负载均衡策略
 * @param protocol 协议信息
 * @param hashKey 一致性hash的key
 * @return 过滤后的实例
 */
public static Instance commonGetOneInstance(Extensions extensions, ServiceKey serviceKey, List<String> coreRouterNames, String lbPolicy, String protocol, String hashKey) {
    ServiceEventKey svcEventKey = new ServiceEventKey(serviceKey, EventType.INSTANCE);
    LOG.info("[ConnectionManager]start to discover service {}", svcEventKey);
    DefaultServiceEventKeysProvider provider = new DefaultServiceEventKeysProvider();
    provider.setSvcEventKey(svcEventKey);
    // 为性能考虑,优先使用本地缓存
    provider.setUseCache(true);
    FlowControlParam flowControlParam = new DefaultFlowControlParam();
    APIConfig apiConfig = extensions.getConfiguration().getGlobal().getAPI();
    flowControlParam.setTimeoutMs(apiConfig.getTimeout());
    flowControlParam.setMaxRetry(apiConfig.getMaxRetryTimes());
    flowControlParam.setRetryIntervalMs(apiConfig.getRetryInterval());
    // 执行服务路由
    ServiceInfo dstSvcInfo = new ServiceInfo();
    Map<String, String> metadata = new HashMap<>();
    metadata.put("protocol", protocol);
    dstSvcInfo.setMetadata(metadata);
    RouteInfo routeInfo = new RouteInfo(null, null, dstSvcInfo, null, "");
    ResourcesResponse resourcesResponse = BaseFlow.syncGetResources(extensions, false, provider, flowControlParam);
    LOG.info("[ConnectionManager]success to discover service {}", svcEventKey);
    ServiceInstances serviceInstances = resourcesResponse.getServiceInstances(svcEventKey);
    RouterChainGroup sysRouterChainGroup = extensions.getSysRouterChainGroup();
    List<ServiceRouter> coreRouters = Extensions.loadServiceRouters(coreRouterNames, extensions.getPlugins(), false);
    RouterChainGroup routerChainGroup = new DefaultRouterChainGroup(sysRouterChainGroup.getBeforeRouters(), coreRouters, sysRouterChainGroup.getAfterRouters());
    ServiceInstances instancesAfterRoute = BaseFlow.processServiceRouters(routeInfo, serviceInstances, routerChainGroup);
    // 执行负载均衡
    LoadBalancer loadBalancer = (LoadBalancer) extensions.getPlugins().getPlugin(PluginTypes.LOAD_BALANCER.getBaseType(), lbPolicy);
    Criteria criteria = new Criteria();
    criteria.setHashKey(hashKey);
    return BaseFlow.processLoadBalance(loadBalancer, criteria, instancesAfterRoute);
}
Also used : ServiceRouter(com.tencent.polaris.api.plugin.route.ServiceRouter) DefaultServiceEventKeysProvider(com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider) HashMap(java.util.HashMap) LoadBalancer(com.tencent.polaris.api.plugin.loadbalance.LoadBalancer) Criteria(com.tencent.polaris.api.rpc.Criteria) ServiceInfo(com.tencent.polaris.api.pojo.ServiceInfo) ServiceInstances(com.tencent.polaris.api.pojo.ServiceInstances) APIConfig(com.tencent.polaris.api.config.global.APIConfig) DefaultRouterChainGroup(com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup) RouterChainGroup(com.tencent.polaris.api.plugin.compose.RouterChainGroup) ServiceEventKey(com.tencent.polaris.api.pojo.ServiceEventKey) RouteInfo(com.tencent.polaris.api.plugin.route.RouteInfo) DefaultRouterChainGroup(com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup)

Example 2 with DefaultServiceEventKeysProvider

use of com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider in project polaris-java by polarismesh.

the class CircuitBreakUtils method getRuleDestinationSet.

/**
 * 通过配置获取远程规则
 *
 * @param ruleIdentifier 规则标识
 * @param extensions 插件集合
 * @param controlParam 控制参数
 * @return 过滤信息
 */
public static RuleDestinationResult getRuleDestinationSet(RuleIdentifier ruleIdentifier, Extensions extensions, FlowControlParam controlParam) {
    Set<ServiceEventKey> svcEventKeys = new HashSet<>();
    ServiceEventKey dstSvcEventKey = new ServiceEventKey(new ServiceKey(ruleIdentifier.getNamespace(), ruleIdentifier.getService()), EventType.CIRCUIT_BREAKING);
    svcEventKeys.add(dstSvcEventKey);
    ServiceEventKey srcSvcEventKey = null;
    Service callerService = ruleIdentifier.getCallerService();
    if (null != callerService && StringUtils.isNotBlank(callerService.getNamespace()) && StringUtils.isNotBlank(callerService.getService())) {
        srcSvcEventKey = new ServiceEventKey(new ServiceKey(callerService.getNamespace(), callerService.getService()), EventType.CIRCUIT_BREAKING);
        svcEventKeys.add(srcSvcEventKey);
    }
    DefaultServiceEventKeysProvider serviceEventKeysProvider = new DefaultServiceEventKeysProvider();
    serviceEventKeysProvider.setSvcEventKeys(svcEventKeys);
    serviceEventKeysProvider.setUseCache(true);
    ResourcesResponse resourcesResponse = BaseFlow.syncGetResources(extensions, false, serviceEventKeysProvider, controlParam);
    CircuitBreakerProto.CircuitBreaker dstRule = getCircuitBreakerRule(resourcesResponse.getServiceRule(dstSvcEventKey));
    CircuitBreakerProto.CircuitBreaker srcRule = null;
    if (null != srcSvcEventKey) {
        srcRule = getCircuitBreakerRule(resourcesResponse.getServiceRule(srcSvcEventKey));
    }
    List<CbRule> rules = getRules(dstRule, srcRule);
    if (CollectionUtils.isEmpty(rules)) {
        return new RuleDestinationResult(null, false, false);
    }
    for (CbRule rule : rules) {
        MatchSourceResult matchSourceResult = matchSource(rule, ruleIdentifier);
        if (!matchSourceResult.matched) {
            continue;
        }
        MatchDestResult matchDestResult = matchDestination(rule, ruleIdentifier, extensions.getFlowCache());
        if (null == matchDestResult.destinationSet) {
            continue;
        }
        return new RuleDestinationResult(matchDestResult.destinationSet, matchSourceResult.allSourcesMatched, matchDestResult.allMethod);
    }
    return new RuleDestinationResult(null, false, false);
}
Also used : DefaultServiceEventKeysProvider(com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider) ServiceKey(com.tencent.polaris.api.pojo.ServiceKey) Service(com.tencent.polaris.api.pojo.Service) ResourcesResponse(com.tencent.polaris.client.flow.ResourcesResponse) CircuitBreakerProto(com.tencent.polaris.client.pb.CircuitBreakerProto) ServiceEventKey(com.tencent.polaris.api.pojo.ServiceEventKey) CbRule(com.tencent.polaris.client.pb.CircuitBreakerProto.CbRule) HashSet(java.util.HashSet)

Example 3 with DefaultServiceEventKeysProvider

use of com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider in project spring-cloud-tencent by Tencent.

the class ServiceRuleManager method getServiceRouterRule.

public List<RoutingProto.Route> getServiceRouterRule(String namespace, String sourceService, String dstService) {
    Set<ServiceEventKey> routerKeys = new HashSet<>();
    ServiceEventKey dstSvcEventKey = new ServiceEventKey(new ServiceKey(namespace, dstService), ServiceEventKey.EventType.ROUTING);
    routerKeys.add(dstSvcEventKey);
    ServiceEventKey srcSvcEventKey = new ServiceEventKey(new ServiceKey(namespace, sourceService), ServiceEventKey.EventType.ROUTING);
    routerKeys.add(srcSvcEventKey);
    DefaultServiceEventKeysProvider svcKeysProvider = new DefaultServiceEventKeysProvider();
    svcKeysProvider.setSvcEventKeys(routerKeys);
    ResourcesResponse resourcesResponse = BaseFlow.syncGetResources(sdkContext.getExtensions(), true, svcKeysProvider, controlParam);
    List<RoutingProto.Route> rules = new ArrayList<>();
    // get source service outbound rules.
    ServiceRule sourceServiceRule = resourcesResponse.getServiceRule(srcSvcEventKey);
    if (sourceServiceRule != null) {
        Object rule = sourceServiceRule.getRule();
        if (rule instanceof RoutingProto.Routing) {
            rules.addAll(((RoutingProto.Routing) rule).getOutboundsList());
        }
    }
    // get peer service inbound rules.
    ServiceRule dstServiceRule = resourcesResponse.getServiceRule(dstSvcEventKey);
    if (dstServiceRule != null) {
        Object rule = dstServiceRule.getRule();
        if (rule instanceof RoutingProto.Routing) {
            rules.addAll(((RoutingProto.Routing) rule).getInboundsList());
        }
    }
    return rules;
}
Also used : DefaultServiceEventKeysProvider(com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider) ArrayList(java.util.ArrayList) ServiceKey(com.tencent.polaris.api.pojo.ServiceKey) ServiceRule(com.tencent.polaris.api.pojo.ServiceRule) ResourcesResponse(com.tencent.polaris.client.flow.ResourcesResponse) RoutingProto(com.tencent.polaris.client.pb.RoutingProto) ServiceEventKey(com.tencent.polaris.api.pojo.ServiceEventKey) HashSet(java.util.HashSet)

Example 4 with DefaultServiceEventKeysProvider

use of com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider in project spring-cloud-tencent by Tencent.

the class ServiceRuleManager method getServiceRateLimitRule.

public RateLimitProto.RateLimit getServiceRateLimitRule(String namespace, String service) {
    ServiceEventKey serviceEventKey = new ServiceEventKey(new ServiceKey(namespace, service), ServiceEventKey.EventType.RATE_LIMITING);
    DefaultServiceEventKeysProvider svcKeysProvider = new DefaultServiceEventKeysProvider();
    svcKeysProvider.setSvcEventKey(serviceEventKey);
    ResourcesResponse resourcesResponse = BaseFlow.syncGetResources(sdkContext.getExtensions(), true, svcKeysProvider, controlParam);
    ServiceRule serviceRule = resourcesResponse.getServiceRule(serviceEventKey);
    if (serviceRule != null) {
        Object rule = serviceRule.getRule();
        if (rule instanceof RateLimitProto.RateLimit) {
            return (RateLimitProto.RateLimit) rule;
        }
    }
    return null;
}
Also used : DefaultServiceEventKeysProvider(com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider) ServiceKey(com.tencent.polaris.api.pojo.ServiceKey) ServiceRule(com.tencent.polaris.api.pojo.ServiceRule) ServiceEventKey(com.tencent.polaris.api.pojo.ServiceEventKey) ResourcesResponse(com.tencent.polaris.client.flow.ResourcesResponse)

Example 5 with DefaultServiceEventKeysProvider

use of com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider in project polaris-java by polarismesh.

the class DefaultRouterAPI method processRouters.

@Override
public ProcessRoutersResponse processRouters(ProcessRoutersRequest request) throws PolarisException {
    checkAvailable("RouterAPI");
    RouterValidator.validateProcessRouterRequest(request);
    RouterNamesGroup requestRouterGroup = request.getRouters();
    List<ServiceRouter> beforeRouters;
    if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getBeforeRouters())) {
        beforeRouters = Extensions.loadServiceRouters(requestRouterGroup.getBeforeRouters(), extensions.getPlugins(), true);
    } else {
        beforeRouters = extensions.getConfigRouterChainGroup().getBeforeRouters();
    }
    List<ServiceRouter> afterRouters;
    if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getAfterRouters())) {
        afterRouters = Extensions.loadServiceRouters(requestRouterGroup.getAfterRouters(), extensions.getPlugins(), true);
    } else {
        afterRouters = extensions.getConfigRouterChainGroup().getAfterRouters();
    }
    List<ServiceRouter> coreRouters;
    if (null != requestRouterGroup && CollectionUtils.isNotEmpty(requestRouterGroup.getCoreRouters())) {
        coreRouters = Extensions.loadServiceRouters(requestRouterGroup.getCoreRouters(), extensions.getPlugins(), true);
    } else {
        coreRouters = extensions.getConfigRouterChainGroup().getCoreRouters();
    }
    ServiceInstances dstInstances = request.getDstInstances();
    RouteInfo routeInfo = new RouteInfo(request.getSourceService(), dstInstances, request.getMethod());
    // 获取路由规则
    DefaultFlowControlParam engineFlowControlParam = new DefaultFlowControlParam();
    BaseFlow.buildFlowControlParam(request, config, engineFlowControlParam);
    Set<ServiceEventKey> routerKeys = new HashSet<>();
    ServiceEventKey dstSvcEventKey = new ServiceEventKey(new ServiceKey(dstInstances.getNamespace(), dstInstances.getService()), EventType.ROUTING);
    routerKeys.add(dstSvcEventKey);
    ServiceEventKey srcSvcEventKey = null;
    if (null != routeInfo.getSourceService() && StringUtils.isNotBlank(routeInfo.getSourceService().getNamespace()) && StringUtils.isNotBlank(routeInfo.getSourceService().getService())) {
        srcSvcEventKey = new ServiceEventKey(new ServiceKey(routeInfo.getSourceService().getNamespace(), routeInfo.getSourceService().getService()), EventType.ROUTING);
        routerKeys.add(srcSvcEventKey);
    }
    DefaultServiceEventKeysProvider svcKeysProvider = new DefaultServiceEventKeysProvider();
    svcKeysProvider.setSvcEventKeys(routerKeys);
    ResourcesResponse resourcesResponse = BaseFlow.syncGetResources(extensions, false, svcKeysProvider, engineFlowControlParam);
    routeInfo.setDestRouteRule(resourcesResponse.getServiceRule(dstSvcEventKey));
    if (null != srcSvcEventKey) {
        routeInfo.setSourceRouteRule(resourcesResponse.getServiceRule(srcSvcEventKey));
    }
    // 执行路由
    DefaultRouterChainGroup routerChainGroup = new DefaultRouterChainGroup(beforeRouters, coreRouters, afterRouters);
    ServiceInstances svcInstances = BaseFlow.processServiceRouters(routeInfo, dstInstances, routerChainGroup);
    return new ProcessRoutersResponse(svcInstances);
}
Also used : ServiceRouter(com.tencent.polaris.api.plugin.route.ServiceRouter) DefaultServiceEventKeysProvider(com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider) RouterNamesGroup(com.tencent.polaris.router.api.rpc.ProcessRoutersRequest.RouterNamesGroup) ServiceKey(com.tencent.polaris.api.pojo.ServiceKey) ResourcesResponse(com.tencent.polaris.client.flow.ResourcesResponse) ProcessRoutersResponse(com.tencent.polaris.router.api.rpc.ProcessRoutersResponse) DefaultFlowControlParam(com.tencent.polaris.client.flow.DefaultFlowControlParam) ServiceInstances(com.tencent.polaris.api.pojo.ServiceInstances) ServiceEventKey(com.tencent.polaris.api.pojo.ServiceEventKey) RouteInfo(com.tencent.polaris.api.plugin.route.RouteInfo) DefaultRouterChainGroup(com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup) HashSet(java.util.HashSet)

Aggregations

DefaultServiceEventKeysProvider (com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider)5 ServiceEventKey (com.tencent.polaris.api.pojo.ServiceEventKey)5 ServiceKey (com.tencent.polaris.api.pojo.ServiceKey)4 ResourcesResponse (com.tencent.polaris.client.flow.ResourcesResponse)4 HashSet (java.util.HashSet)3 DefaultRouterChainGroup (com.tencent.polaris.api.plugin.compose.DefaultRouterChainGroup)2 RouteInfo (com.tencent.polaris.api.plugin.route.RouteInfo)2 ServiceRouter (com.tencent.polaris.api.plugin.route.ServiceRouter)2 ServiceInstances (com.tencent.polaris.api.pojo.ServiceInstances)2 ServiceRule (com.tencent.polaris.api.pojo.ServiceRule)2 APIConfig (com.tencent.polaris.api.config.global.APIConfig)1 RouterChainGroup (com.tencent.polaris.api.plugin.compose.RouterChainGroup)1 LoadBalancer (com.tencent.polaris.api.plugin.loadbalance.LoadBalancer)1 Service (com.tencent.polaris.api.pojo.Service)1 ServiceInfo (com.tencent.polaris.api.pojo.ServiceInfo)1 Criteria (com.tencent.polaris.api.rpc.Criteria)1 DefaultFlowControlParam (com.tencent.polaris.client.flow.DefaultFlowControlParam)1 CircuitBreakerProto (com.tencent.polaris.client.pb.CircuitBreakerProto)1 CbRule (com.tencent.polaris.client.pb.CircuitBreakerProto.CbRule)1 RoutingProto (com.tencent.polaris.client.pb.RoutingProto)1