Commit e74d61b1 by Nepxion

增加TraceId传递功能

parent 390cf46b
...@@ -51,4 +51,5 @@ public class DiscoveryConstant { ...@@ -51,4 +51,5 @@ public class DiscoveryConstant {
public static final String NO = "NO"; public static final String NO = "NO";
public static final String UNKNOWN = "UNKNOWN"; public static final String UNKNOWN = "UNKNOWN";
public static final String EXT = "ext"; public static final String EXT = "ext";
public static final String TRACE_ID = "traceId";
} }
\ No newline at end of file
...@@ -16,18 +16,24 @@ import java.util.Enumeration; ...@@ -16,18 +16,24 @@ import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder; import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder;
import com.nepxion.discovery.plugin.strategy.service.trace.TraceIdGenerator;
public class FeignStrategyInterceptor implements RequestInterceptor { public class FeignStrategyInterceptor implements RequestInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(FeignStrategyInterceptor.class); private static final Logger LOG = LoggerFactory.getLogger(FeignStrategyInterceptor.class);
private String requestHeaders; private String requestHeaders;
@Autowired(required = false)
private TraceIdGenerator traceIdGenerator;
@Autowired @Autowired
private ServiceStrategyContextHolder serviceStrategyContextHolder; private ServiceStrategyContextHolder serviceStrategyContextHolder;
...@@ -52,6 +58,18 @@ public class FeignStrategyInterceptor implements RequestInterceptor { ...@@ -52,6 +58,18 @@ public class FeignStrategyInterceptor implements RequestInterceptor {
return; return;
} }
String traceId = previousRequest.getHeader(DiscoveryConstant.TRACE_ID);
if (StringUtils.isEmpty(traceId) && traceIdGenerator != null) {
try {
traceId = traceIdGenerator.generate();
} catch (Exception e) {
LOG.error("Generate trace id failed, ignore to set trace id", e);
}
}
if (StringUtils.isNotEmpty(traceId)) {
requestTemplate.header(DiscoveryConstant.TRACE_ID, traceId);
}
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement(); String headerName = headerNames.nextElement();
String header = previousRequest.getHeader(headerName); String header = previousRequest.getHeader(headerName);
......
...@@ -14,6 +14,7 @@ import java.util.Enumeration; ...@@ -14,6 +14,7 @@ import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -24,13 +25,18 @@ import org.springframework.http.client.ClientHttpRequestInterceptor; ...@@ -24,13 +25,18 @@ import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder; import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder;
import com.nepxion.discovery.plugin.strategy.service.trace.TraceIdGenerator;
public class RestTemplateStrategyInterceptor implements ClientHttpRequestInterceptor { public class RestTemplateStrategyInterceptor implements ClientHttpRequestInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(RestTemplateStrategyInterceptor.class); private static final Logger LOG = LoggerFactory.getLogger(RestTemplateStrategyInterceptor.class);
private String requestHeaders; private String requestHeaders;
@Autowired(required = false)
private TraceIdGenerator traceIdGenerator;
@Autowired @Autowired
private ServiceStrategyContextHolder serviceStrategyContextHolder; private ServiceStrategyContextHolder serviceStrategyContextHolder;
...@@ -56,6 +62,19 @@ public class RestTemplateStrategyInterceptor implements ClientHttpRequestInterce ...@@ -56,6 +62,19 @@ public class RestTemplateStrategyInterceptor implements ClientHttpRequestInterce
} }
HttpHeaders headers = request.getHeaders(); HttpHeaders headers = request.getHeaders();
String traceId = previousRequest.getHeader(DiscoveryConstant.TRACE_ID);
if (StringUtils.isEmpty(traceId) && traceIdGenerator != null) {
try {
traceId = traceIdGenerator.generate();
} catch (Exception e) {
LOG.error("Generate trace id failed, ignore to set trace id", e);
}
}
if (StringUtils.isNotEmpty(traceId)) {
headers.add(DiscoveryConstant.TRACE_ID, traceId);
}
while (headerNames.hasMoreElements()) { while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement(); String headerName = headerNames.nextElement();
String header = previousRequest.getHeader(headerName); String header = previousRequest.getHeader(headerName);
......
package com.nepxion.discovery.plugin.strategy.service.trace;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
public interface TraceIdGenerator {
String generate();
}
\ No newline at end of file
...@@ -28,6 +28,7 @@ import com.nepxion.discovery.plugin.example.service.impl.MyRegisterListener; ...@@ -28,6 +28,7 @@ import com.nepxion.discovery.plugin.example.service.impl.MyRegisterListener;
import com.nepxion.discovery.plugin.example.service.impl.MySentinelExceptionHandler; import com.nepxion.discovery.plugin.example.service.impl.MySentinelExceptionHandler;
import com.nepxion.discovery.plugin.example.service.impl.MySentinelFlowRuleParser; import com.nepxion.discovery.plugin.example.service.impl.MySentinelFlowRuleParser;
import com.nepxion.discovery.plugin.example.service.impl.MySubscriber; import com.nepxion.discovery.plugin.example.service.impl.MySubscriber;
import com.nepxion.discovery.plugin.example.service.impl.MyTraceIdGenerator;
import com.nepxion.discovery.plugin.strategy.service.aop.RestTemplateStrategyInterceptor; import com.nepxion.discovery.plugin.strategy.service.aop.RestTemplateStrategyInterceptor;
@SpringBootApplication @SpringBootApplication
...@@ -85,4 +86,9 @@ public class DiscoveryApplicationA1 { ...@@ -85,4 +86,9 @@ public class DiscoveryApplicationA1 {
public MyDiscoveryEnabledStrategy myDiscoveryEnabledStrategy() { public MyDiscoveryEnabledStrategy myDiscoveryEnabledStrategy() {
return new MyDiscoveryEnabledStrategy(); return new MyDiscoveryEnabledStrategy();
} }
@Bean
public MyTraceIdGenerator myTraceIdGenerator() {
return new MyTraceIdGenerator();
}
} }
\ No newline at end of file
...@@ -11,13 +11,19 @@ package com.nepxion.discovery.plugin.example.service.feign; ...@@ -11,13 +11,19 @@ package com.nepxion.discovery.plugin.example.service.feign;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter; import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter;
import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder;
public class AbstractFeignImpl { public class AbstractFeignImpl {
@Autowired @Autowired
private PluginAdapter pluginAdapter; private PluginAdapter pluginAdapter;
@Autowired
private ServiceStrategyContextHolder serviceStrategyContextHolder;
public String doInvoke(String value) { public String doInvoke(String value) {
String serviceId = pluginAdapter.getServiceId(); String serviceId = pluginAdapter.getServiceId();
String host = pluginAdapter.getHost(); String host = pluginAdapter.getHost();
...@@ -25,6 +31,12 @@ public class AbstractFeignImpl { ...@@ -25,6 +31,12 @@ public class AbstractFeignImpl {
String version = pluginAdapter.getVersion(); String version = pluginAdapter.getVersion();
String region = pluginAdapter.getRegion(); String region = pluginAdapter.getRegion();
String traceId = null;
ServletRequestAttributes attributes = serviceStrategyContextHolder.getRestAttributes();
if (attributes != null) {
traceId = attributes.getRequest().getHeader(DiscoveryConstant.TRACE_ID);
}
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(value + " -> " + serviceId); stringBuilder.append(value + " -> " + serviceId);
stringBuilder.append("[" + host + ":" + port + "]"); stringBuilder.append("[" + host + ":" + port + "]");
...@@ -34,6 +46,9 @@ public class AbstractFeignImpl { ...@@ -34,6 +46,9 @@ public class AbstractFeignImpl {
if (StringUtils.isNotEmpty(region)) { if (StringUtils.isNotEmpty(region)) {
stringBuilder.append("[Region=" + region + "]"); stringBuilder.append("[Region=" + region + "]");
} }
if (StringUtils.isNotEmpty(traceId)) {
stringBuilder.append("[TraceId=" + traceId + "]");
}
return stringBuilder.toString(); return stringBuilder.toString();
} }
......
package com.nepxion.discovery.plugin.example.service.impl;
/**
* <p>Title: Nepxion Discovery</p>
* <p>Description: Nepxion Discovery</p>
* <p>Copyright: Copyright (c) 2017-2050</p>
* <p>Company: Nepxion</p>
* @author Haojun Ren
* @version 1.0
*/
import java.util.UUID;
import com.nepxion.discovery.plugin.strategy.service.trace.TraceIdGenerator;
public class MyTraceIdGenerator implements TraceIdGenerator {
@Override
public String generate() {
return UUID.randomUUID().toString();
}
}
\ No newline at end of file
...@@ -11,13 +11,19 @@ package com.nepxion.discovery.plugin.example.service.rest; ...@@ -11,13 +11,19 @@ package com.nepxion.discovery.plugin.example.service.rest;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.nepxion.discovery.common.constant.DiscoveryConstant;
import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter; import com.nepxion.discovery.plugin.framework.adapter.PluginAdapter;
import com.nepxion.discovery.plugin.strategy.service.context.ServiceStrategyContextHolder;
public class AbstractRestImpl { public class AbstractRestImpl {
@Autowired @Autowired
private PluginAdapter pluginAdapter; private PluginAdapter pluginAdapter;
@Autowired
private ServiceStrategyContextHolder serviceStrategyContextHolder;
public String doRest(String value) { public String doRest(String value) {
String serviceId = pluginAdapter.getServiceId(); String serviceId = pluginAdapter.getServiceId();
String host = pluginAdapter.getHost(); String host = pluginAdapter.getHost();
...@@ -25,6 +31,12 @@ public class AbstractRestImpl { ...@@ -25,6 +31,12 @@ public class AbstractRestImpl {
String version = pluginAdapter.getVersion(); String version = pluginAdapter.getVersion();
String region = pluginAdapter.getRegion(); String region = pluginAdapter.getRegion();
String traceId = null;
ServletRequestAttributes attributes = serviceStrategyContextHolder.getRestAttributes();
if (attributes != null) {
traceId = attributes.getRequest().getHeader(DiscoveryConstant.TRACE_ID);
}
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(value + " -> " + serviceId); stringBuilder.append(value + " -> " + serviceId);
stringBuilder.append("[" + host + ":" + port + "]"); stringBuilder.append("[" + host + ":" + port + "]");
...@@ -34,6 +46,9 @@ public class AbstractRestImpl { ...@@ -34,6 +46,9 @@ public class AbstractRestImpl {
if (StringUtils.isNotEmpty(region)) { if (StringUtils.isNotEmpty(region)) {
stringBuilder.append("[Region=" + region + "]"); stringBuilder.append("[Region=" + region + "]");
} }
if (StringUtils.isNotEmpty(traceId)) {
stringBuilder.append("[TraceId=" + traceId + "]");
}
return stringBuilder.toString(); return stringBuilder.toString();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment