Search in sources :

Example 1 with PolarisRouterContext

use of com.tencent.cloud.polaris.router.PolarisRouterContext in project spring-cloud-tencent by Tencent.

the class PolarisLoadBalancerInterceptor method intercept.

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    final URI originalUri = request.getURI();
    String peerServiceName = originalUri.getHost();
    Assert.state(peerServiceName != null, "Request URI does not contain a valid hostname: " + originalUri);
    if (isRibbonLoadBalanceClient) {
        PolarisRouterContext routerContext = genRouterContext(request, body, peerServiceName);
        return ((RibbonLoadBalancerClient) loadBalancer).execute(peerServiceName, this.requestFactory.createRequest(request, body, execution), routerContext);
    }
    return this.loadBalancer.execute(peerServiceName, this.requestFactory.createRequest(request, body, execution));
}
Also used : PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) RibbonLoadBalancerClient(org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient) URI(java.net.URI)

Example 2 with PolarisRouterContext

use of com.tencent.cloud.polaris.router.PolarisRouterContext in project spring-cloud-tencent by Tencent.

the class PolarisLoadBalancerInterceptor method genRouterContext.

PolarisRouterContext genRouterContext(HttpRequest request, byte[] body, String peerServiceName) {
    // local service labels
    Map<String, String> labels = new HashMap<>(metadataLocalProperties.getContent());
    // labels from rule expression
    Map<String, String> ruleExpressionLabels = getExpressionLabels(request, peerServiceName);
    if (!CollectionUtils.isEmpty(ruleExpressionLabels)) {
        labels.putAll(ruleExpressionLabels);
    }
    // labels from request
    if (!CollectionUtils.isEmpty(routerLabelResolvers)) {
        routerLabelResolvers.forEach(resolver -> {
            try {
                Map<String, String> customResolvedLabels = resolver.resolve(request, body);
                if (!CollectionUtils.isEmpty(customResolvedLabels)) {
                    labels.putAll(customResolvedLabels);
                }
            } catch (Throwable t) {
                LOGGER.error("[SCT][Router] revoke RouterLabelResolver occur some exception. ", t);
            }
        });
    }
    // labels from downstream
    Map<String, String> transitiveLabels = MetadataContextHolder.get().getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
    labels.putAll(transitiveLabels);
    PolarisRouterContext routerContext = new PolarisRouterContext();
    routerContext.setLabels(PolarisRouterContext.RULE_ROUTER_LABELS, labels);
    routerContext.setLabels(PolarisRouterContext.TRANSITIVE_LABELS, transitiveLabels);
    return routerContext;
}
Also used : HashMap(java.util.HashMap) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext)

Example 3 with PolarisRouterContext

use of com.tencent.cloud.polaris.router.PolarisRouterContext in project spring-cloud-tencent by Tencent.

the class PolarisLoadBalancerInterceptorTest method testRouterContext.

@Test
public void testRouterContext() throws Exception {
    String callerService = "callerService";
    String calleeService = "calleeService";
    HttpRequest request = new MockedHttpRequest("http://" + calleeService + "/user/get");
    // mock local metadata
    Map<String, String> localMetadata = new HashMap<>();
    localMetadata.put("k1", "v1");
    localMetadata.put("k2", "v2");
    when(metadataLocalProperties.getContent()).thenReturn(localMetadata);
    // mock custom resolved from request
    Map<String, String> customResolvedLabels = new HashMap<>();
    customResolvedLabels.put("k2", "v22");
    customResolvedLabels.put("k4", "v4");
    when(routerLabelResolver.resolve(request, null)).thenReturn(customResolvedLabels);
    // mock expression rule labels
    Set<String> expressionKeys = new HashSet<>();
    expressionKeys.add("${http.method}");
    expressionKeys.add("${http.uri}");
    when(routerRuleLabelResolver.getExpressionLabelKeys(callerService, callerService, calleeService)).thenReturn(expressionKeys);
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn(callerService);
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock transitive metadata
        Map<String, String> transitiveLabels = new HashMap<>();
        transitiveLabels.put("k1", "v1");
        transitiveLabels.put("k2", "v22");
        when(metadataContext.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE)).thenReturn(transitiveLabels);
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisLoadBalancerInterceptor polarisLoadBalancerInterceptor = new PolarisLoadBalancerInterceptor(loadBalancerClient, loadBalancerRequestFactory, Collections.singletonList(routerLabelResolver), metadataLocalProperties, routerRuleLabelResolver);
            PolarisRouterContext routerContext = polarisLoadBalancerInterceptor.genRouterContext(request, null, calleeService);
            verify(metadataLocalProperties).getContent();
            verify(routerRuleLabelResolver).getExpressionLabelKeys(callerService, callerService, calleeService);
            verify(routerLabelResolver).resolve(request, null);
            Assert.assertEquals("v1", routerContext.getLabels(PolarisRouterContext.TRANSITIVE_LABELS).get("k1"));
            Assert.assertEquals("v22", routerContext.getLabels(PolarisRouterContext.TRANSITIVE_LABELS).get("k2"));
            Assert.assertEquals("v1", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k1"));
            Assert.assertEquals("v22", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k2"));
            Assert.assertEquals("v4", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("k4"));
            Assert.assertEquals("GET", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("${http.method}"));
            Assert.assertEquals("/user/get", routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS).get("${http.uri}"));
        }
    }
}
Also used : HttpRequest(org.springframework.http.HttpRequest) HashMap(java.util.HashMap) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 4 with PolarisRouterContext

use of com.tencent.cloud.polaris.router.PolarisRouterContext in project spring-cloud-tencent by Tencent.

the class PolarisFeignLoadBalancerTest method testHasRouterContext.

@Test
public void testHasRouterContext() {
    DefaultClientConfigImpl config = new DefaultClientConfigImpl();
    config.loadDefaultValues();
    ILoadBalancer loadBalancer = new SimpleLoadBalancer();
    ServerIntrospector serverIntrospector = new DefaultServerIntrospector();
    PolarisFeignLoadBalancer polarisFeignLoadBalancer = new PolarisFeignLoadBalancer(loadBalancer, config, serverIntrospector);
    Map<String, String> labels = new HashMap<>();
    labels.put("k1", "v1");
    labels.put("k2", "v2");
    List<String> headerValues = new ArrayList<>();
    headerValues.add(JacksonUtils.serialize2Json(labels));
    Map<String, Collection<String>> headers = new HashMap<>();
    headers.put(RouterConstants.ROUTER_LABEL_HEADER, headerValues);
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn("unit-test");
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisRouterContext routerContext = polarisFeignLoadBalancer.buildRouterContext(headers);
            Assert.assertNotNull(routerContext);
            Map<String, String> routerLabels = routerContext.getLabels(PolarisRouterContext.RULE_ROUTER_LABELS);
            Assert.assertNotNull(routerLabels);
            Assert.assertEquals("v1", routerLabels.get("k1"));
            Assert.assertEquals("v2", routerLabels.get("k2"));
            Assert.assertNull(routerLabels.get("k3"));
        }
    }
}
Also used : SimpleLoadBalancer(com.tencent.cloud.polaris.router.SimpleLoadBalancer) HashMap(java.util.HashMap) ServerIntrospector(org.springframework.cloud.netflix.ribbon.ServerIntrospector) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) ArrayList(java.util.ArrayList) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) Mockito.anyString(org.mockito.Mockito.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) ILoadBalancer(com.netflix.loadbalancer.ILoadBalancer) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) Collection(java.util.Collection) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) DefaultClientConfigImpl(com.netflix.client.config.DefaultClientConfigImpl) Test(org.junit.Test)

Example 5 with PolarisRouterContext

use of com.tencent.cloud.polaris.router.PolarisRouterContext in project spring-cloud-tencent by Tencent.

the class PolarisFeignLoadBalancerTest method testHasNoneRouterContext.

@Test
public void testHasNoneRouterContext() {
    DefaultClientConfigImpl config = new DefaultClientConfigImpl();
    config.loadDefaultValues();
    ILoadBalancer loadBalancer = new SimpleLoadBalancer();
    ServerIntrospector serverIntrospector = new DefaultServerIntrospector();
    PolarisFeignLoadBalancer polarisFeignLoadBalancer = new PolarisFeignLoadBalancer(loadBalancer, config, serverIntrospector);
    Map<String, Collection<String>> headers = new HashMap<>();
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn("unit-test");
        MetadataContext metadataContext = Mockito.mock(MetadataContext.class);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            PolarisRouterContext routerContext = polarisFeignLoadBalancer.buildRouterContext(headers);
            Assert.assertNull(routerContext);
        }
    }
}
Also used : SimpleLoadBalancer(com.tencent.cloud.polaris.router.SimpleLoadBalancer) HashMap(java.util.HashMap) ServerIntrospector(org.springframework.cloud.netflix.ribbon.ServerIntrospector) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) DefaultServerIntrospector(org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector) Mockito.anyString(org.mockito.Mockito.anyString) PolarisRouterContext(com.tencent.cloud.polaris.router.PolarisRouterContext) ILoadBalancer(com.netflix.loadbalancer.ILoadBalancer) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) Collection(java.util.Collection) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) DefaultClientConfigImpl(com.netflix.client.config.DefaultClientConfigImpl) Test(org.junit.Test)

Aggregations

PolarisRouterContext (com.tencent.cloud.polaris.router.PolarisRouterContext)7 HashMap (java.util.HashMap)5 MetadataContext (com.tencent.cloud.common.metadata.MetadataContext)3 MetadataContextHolder (com.tencent.cloud.common.metadata.MetadataContextHolder)3 ApplicationContextAwareUtils (com.tencent.cloud.common.util.ApplicationContextAwareUtils)3 Collection (java.util.Collection)3 Test (org.junit.Test)3 DefaultClientConfigImpl (com.netflix.client.config.DefaultClientConfigImpl)2 ILoadBalancer (com.netflix.loadbalancer.ILoadBalancer)2 SimpleLoadBalancer (com.tencent.cloud.polaris.router.SimpleLoadBalancer)2 Mockito.anyString (org.mockito.Mockito.anyString)2 DefaultServerIntrospector (org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector)2 ServerIntrospector (org.springframework.cloud.netflix.ribbon.ServerIntrospector)2 URI (java.net.URI)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)1 RibbonLoadBalancerClient (org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient)1 HttpRequest (org.springframework.http.HttpRequest)1