Search in sources :

Example 11 with MetadataContext

use of com.tencent.cloud.common.metadata.MetadataContext in project spring-cloud-tencent by Tencent.

the class RouterLabelFeignInterceptorTest method testResolveRouterLabel.

@Test
public void testResolveRouterLabel() {
    RouterLabelFeignInterceptor routerLabelFeignInterceptor = new RouterLabelFeignInterceptor(Collections.singletonList(routerLabelResolver), metadataLocalProperties, routerRuleLabelResolver);
    // mock request template
    RequestTemplate requestTemplate = new RequestTemplate();
    String headerUidKey = "uid";
    String headerUidValue = "1000";
    requestTemplate.header(headerUidKey, headerUidValue);
    String peerService = "peerService";
    Target.EmptyTarget<Object> target = Target.EmptyTarget.create(Object.class, peerService);
    requestTemplate.feignTarget(target);
    // mock ApplicationContextAwareUtils#getProperties
    try (MockedStatic<ApplicationContextAwareUtils> mockedApplicationContextAwareUtils = Mockito.mockStatic(ApplicationContextAwareUtils.class)) {
        String testService = "callerService";
        mockedApplicationContextAwareUtils.when(() -> ApplicationContextAwareUtils.getProperties(anyString())).thenReturn(testService);
        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);
        // mock MetadataContextHolder#get
        try (MockedStatic<MetadataContextHolder> mockedMetadataContextHolder = Mockito.mockStatic(MetadataContextHolder.class)) {
            mockedMetadataContextHolder.when(MetadataContextHolder::get).thenReturn(metadataContext);
            // mock custom resolved labels from request
            Map<String, String> customResolvedLabels = new HashMap<>();
            customResolvedLabels.put("k2", "v2");
            customResolvedLabels.put("k3", "v3");
            when(routerLabelResolver.resolve(requestTemplate)).thenReturn(customResolvedLabels);
            // mock expression rule labels
            Set<String> expressionKeys = new HashSet<>();
            expressionKeys.add("${http.header.uid}");
            expressionKeys.add("${http.header.name}");
            when(routerRuleLabelResolver.getExpressionLabelKeys(MetadataContext.LOCAL_NAMESPACE, MetadataContext.LOCAL_SERVICE, peerService)).thenReturn(expressionKeys);
            // mock local metadata
            Map<String, String> localMetadata = new HashMap<>();
            localMetadata.put("k3", "v31");
            localMetadata.put("k4", "v4");
            when(metadataLocalProperties.getContent()).thenReturn(localMetadata);
            routerLabelFeignInterceptor.apply(requestTemplate);
            Collection<String> routerLabels = requestTemplate.headers().get(RouterConstants.ROUTER_LABEL_HEADER);
            Assert.assertNotNull(routerLabels);
            for (String value : routerLabels) {
                Map<String, String> labels = unescape(JacksonUtils.deserialize2Map(value));
                Assert.assertEquals("v1", labels.get("k1"));
                Assert.assertEquals("v22", labels.get("k2"));
                Assert.assertEquals("v3", labels.get("k3"));
                Assert.assertEquals("v4", labels.get("k4"));
                Assert.assertEquals(headerUidValue, labels.get("${http.header.uid}"));
                Assert.assertEquals("", labels.get("${http.header.name}"));
            }
        }
    }
}
Also used : HashMap(java.util.HashMap) ApplicationContextAwareUtils(com.tencent.cloud.common.util.ApplicationContextAwareUtils) ArgumentMatchers.anyString(org.mockito.ArgumentMatchers.anyString) Target(feign.Target) RequestTemplate(feign.RequestTemplate) MetadataContextHolder(com.tencent.cloud.common.metadata.MetadataContextHolder) MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 12 with MetadataContext

use of com.tencent.cloud.common.metadata.MetadataContext in project spring-cloud-tencent by Tencent.

the class MetadataFirstScgFilter method filter.

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    // get metadata of current thread
    MetadataContext metadataContext = exchange.getAttribute(MetadataConstant.HeaderName.METADATA_CONTEXT);
    if (metadataContext == null) {
        metadataContext = MetadataContextHolder.get();
    }
    exchange.getAttributes().put(MetadataConstant.HeaderName.METADATA_CONTEXT, metadataContext);
    return chain.filter(exchange);
}
Also used : MetadataContext(com.tencent.cloud.common.metadata.MetadataContext)

Example 13 with MetadataContext

use of com.tencent.cloud.common.metadata.MetadataContext in project spring-cloud-tencent by Tencent.

the class MetadataCallerController method feign.

/**
 * Get metadata info from remote service.
 * @return metadata map
 */
@GetMapping("/feign/info")
public Map<String, Map<String, String>> feign() {
    Map<String, Map<String, String>> ret = Maps.newHashMap();
    // Call remote service with feign client
    Map<String, String> calleeMetadata = metadataCalleeService.info();
    ret.put("callee-transitive-metadata", calleeMetadata);
    // Get Custom Metadata From Context
    MetadataContext context = MetadataContextHolder.get();
    Map<String, String> callerTransitiveMetadata = context.getFragmentContext(MetadataContext.FRAGMENT_TRANSITIVE);
    ret.put("caller-transitive-metadata", callerTransitiveMetadata);
    ret.put("caller-metadata-contents", metadataLocalProperties.getContent());
    return ret;
}
Also used : MetadataContext(com.tencent.cloud.common.metadata.MetadataContext) Map(java.util.Map) GetMapping(org.springframework.web.bind.annotation.GetMapping)

Aggregations

MetadataContext (com.tencent.cloud.common.metadata.MetadataContext)13 MetadataContextHolder (com.tencent.cloud.common.metadata.MetadataContextHolder)5 ApplicationContextAwareUtils (com.tencent.cloud.common.util.ApplicationContextAwareUtils)5 HashMap (java.util.HashMap)5 Test (org.junit.Test)5 UnsupportedEncodingException (java.io.UnsupportedEncodingException)4 PolarisRouterContext (com.tencent.cloud.polaris.router.PolarisRouterContext)3 HashSet (java.util.HashSet)3 ArgumentMatchers.anyString (org.mockito.ArgumentMatchers.anyString)3 GetMapping (org.springframework.web.bind.annotation.GetMapping)3 DefaultClientConfigImpl (com.netflix.client.config.DefaultClientConfigImpl)2 ILoadBalancer (com.netflix.loadbalancer.ILoadBalancer)2 SimpleLoadBalancer (com.tencent.cloud.polaris.router.SimpleLoadBalancer)2 Collection (java.util.Collection)2 Map (java.util.Map)2 Mockito.anyString (org.mockito.Mockito.anyString)2 DefaultServerIntrospector (org.springframework.cloud.netflix.ribbon.DefaultServerIntrospector)2 ServerIntrospector (org.springframework.cloud.netflix.ribbon.ServerIntrospector)2 HttpRequest (org.springframework.http.HttpRequest)2 RequestContext (com.netflix.zuul.context.RequestContext)1