mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
优化dubbo filter
This commit is contained in:
@@ -18,5 +18,6 @@ public final class SopConstants {
|
||||
public static final String OPEN_CONTEXT = "sop.open-context";
|
||||
public static final String WEB_CONTEXT = "sop.web-context";
|
||||
public static final String DEFAULT_VERSION = "1.0";
|
||||
public static final String SPRING_APPLICATION_NAME = "spring.application.name";
|
||||
|
||||
}
|
||||
|
@@ -57,4 +57,8 @@ public class DefaultOpenContext extends OpenContext implements Serializable {
|
||||
public void initContext() {
|
||||
this.setContext(this);
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
this.clear();
|
||||
}
|
||||
}
|
||||
|
@@ -64,4 +64,8 @@ public class DefaultWebContext extends WebContext implements Serializable {
|
||||
public void initContext() {
|
||||
this.setContext(this);
|
||||
}
|
||||
|
||||
public void remove() {
|
||||
this.clear();
|
||||
}
|
||||
}
|
||||
|
@@ -63,4 +63,9 @@ public abstract class OpenContext {
|
||||
public static OpenContext current() {
|
||||
return THREAD_LOCAL.get();
|
||||
}
|
||||
|
||||
protected void clear() {
|
||||
THREAD_LOCAL.remove();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -75,4 +75,8 @@ public abstract class WebContext {
|
||||
public static WebContext current() {
|
||||
return THREAD_LOCAL.get();
|
||||
}
|
||||
|
||||
protected void clear() {
|
||||
THREAD_LOCAL.remove();
|
||||
}
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@ import com.alibaba.fastjson2.JSON;
|
||||
import com.gitee.sop.support.constant.SopConstants;
|
||||
import com.gitee.sop.support.context.DefaultOpenContext;
|
||||
import com.gitee.sop.support.context.DefaultWebContext;
|
||||
import com.gitee.sop.support.context.WebContext;
|
||||
import com.gitee.sop.support.util.NetUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.extension.Activate;
|
||||
@@ -16,6 +16,9 @@ import org.apache.dubbo.rpc.RpcContext;
|
||||
import org.apache.dubbo.rpc.RpcContextAttachment;
|
||||
import org.apache.dubbo.rpc.RpcException;
|
||||
import org.apache.dubbo.rpc.RpcServiceContext;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
import java.net.SocketException;
|
||||
|
||||
/**
|
||||
* @author 六如
|
||||
@@ -24,42 +27,24 @@ import org.apache.dubbo.rpc.RpcServiceContext;
|
||||
@Activate(group = {CommonConstants.PROVIDER})
|
||||
public class DubboProviderTraceFilter implements Filter {
|
||||
|
||||
private Environment environment;
|
||||
|
||||
private String ip;
|
||||
|
||||
public void setEnvironment(Environment environment) {
|
||||
this.environment = environment;
|
||||
try {
|
||||
this.ip = NetUtil.getIntranetIp();
|
||||
} catch (SocketException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
|
||||
initOpenContext();
|
||||
initWebContext();
|
||||
long startTime = System.currentTimeMillis();
|
||||
long endTime = 0;
|
||||
try {
|
||||
Result result = invoker.invoke(invocation);
|
||||
endTime = System.currentTimeMillis();
|
||||
return result;
|
||||
} finally {
|
||||
trace(invocation, startTime, endTime);
|
||||
}
|
||||
}
|
||||
DefaultOpenContext openContext = initOpenContext();
|
||||
DefaultWebContext webContext = initWebContext();
|
||||
|
||||
private void initOpenContext() {
|
||||
// 从 ServerAttachment 中读取的参数是从 Client 中传递过来的
|
||||
RpcContextAttachment serverAttachment = RpcContext.getServerAttachment();
|
||||
Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.OPEN_CONTEXT);
|
||||
if (objectAttachment instanceof DefaultOpenContext) {
|
||||
DefaultOpenContext openContext = (DefaultOpenContext) objectAttachment;
|
||||
openContext.initContext();
|
||||
}
|
||||
}
|
||||
|
||||
private void initWebContext() {
|
||||
RpcContextAttachment serverAttachment = RpcContext.getServerAttachment();
|
||||
Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.WEB_CONTEXT);
|
||||
if (objectAttachment instanceof DefaultWebContext) {
|
||||
DefaultWebContext webContext = (DefaultWebContext) objectAttachment;
|
||||
webContext.initContext();
|
||||
}
|
||||
}
|
||||
|
||||
private void trace(Invocation invocation, long startTime, long endTime) {
|
||||
// 如果是服务提供端
|
||||
RpcServiceContext serviceContext = RpcContext.getServiceContext();
|
||||
// 获取客户端IP
|
||||
String fromIP = serviceContext.getRemoteHost();
|
||||
@@ -71,11 +56,54 @@ public class DubboProviderTraceFilter implements Filter {
|
||||
String methodName = serviceContext.getMethodName();
|
||||
// 调用参数值
|
||||
String param = JSON.toJSONString(serviceContext.getArguments());
|
||||
// 超过500毫秒告警
|
||||
long spend = (endTime == 0 ? System.currentTimeMillis() : endTime) - startTime;
|
||||
if (log.isWarnEnabled() && spend > 500) {
|
||||
log.warn("[sop_trace][dubbo_server][time_warn] Dubbo 耗时告警({}ms), from={}({}), methodName={}.{}, param={}",
|
||||
spend, fromApp, fromIP, interfaceName, methodName, param);
|
||||
String currentApp = environment.getProperty(SopConstants.SPRING_APPLICATION_NAME);
|
||||
String currentIp = this.ip;
|
||||
String traceId = openContext == null ? "" : openContext.getTraceId();
|
||||
if (log.isInfoEnabled()) {
|
||||
log.info("[dhf_trace][dubbo_server][{}] 收到请求, from={}({}) -> current={}({}), methodName={}.{}, param={}",
|
||||
traceId, fromApp, fromIP, currentApp, currentIp, interfaceName, methodName, param);
|
||||
}
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
try {
|
||||
return invoker.invoke(invocation);
|
||||
} finally {
|
||||
if (openContext != null) {
|
||||
openContext.remove();
|
||||
}
|
||||
if (webContext != null) {
|
||||
webContext.remove();
|
||||
}
|
||||
// 超过500毫秒告警
|
||||
long spend = System.currentTimeMillis() - startTime;
|
||||
if (log.isWarnEnabled() && spend > 500) {
|
||||
log.warn("[dhf_trace][dubbo_server][time_warn][{}] Dubbo 耗时告警({}ms), from={}({}) -> current={}({}) , methodName={}.{}, param={}",
|
||||
traceId, spend, fromApp, fromIP, currentApp, currentIp, interfaceName, methodName, param);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private DefaultOpenContext initOpenContext() {
|
||||
// 从 ServerAttachment 中读取的参数是从 Client 中传递过来的
|
||||
RpcContextAttachment serverAttachment = RpcContext.getServerAttachment();
|
||||
Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.OPEN_CONTEXT);
|
||||
if (objectAttachment instanceof DefaultOpenContext) {
|
||||
DefaultOpenContext openContext = (DefaultOpenContext) objectAttachment;
|
||||
openContext.initContext();
|
||||
return openContext;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private DefaultWebContext initWebContext() {
|
||||
RpcContextAttachment serverAttachment = RpcContext.getServerAttachment();
|
||||
Object objectAttachment = serverAttachment.getObjectAttachment(SopConstants.WEB_CONTEXT);
|
||||
if (objectAttachment instanceof DefaultWebContext) {
|
||||
DefaultWebContext webContext = (DefaultWebContext) objectAttachment;
|
||||
webContext.initContext();
|
||||
return webContext;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,50 @@
|
||||
package com.gitee.sop.support.util;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.SocketException;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
* @author 六如
|
||||
*/
|
||||
public class NetUtil {
|
||||
|
||||
/**
|
||||
* 获取本机的内网ip地址
|
||||
*
|
||||
* @return 返回内网ip
|
||||
* @throws SocketException 异常
|
||||
*/
|
||||
public static String getIntranetIp() throws SocketException {
|
||||
String localip = null;// 本地IP,如果没有配置外网IP则返回它
|
||||
String netip = null;// 外网IP
|
||||
Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
|
||||
InetAddress ip = null;
|
||||
boolean finded = false;// 是否找到外网IP
|
||||
while (netInterfaces.hasMoreElements() && !finded) {
|
||||
NetworkInterface ni = netInterfaces.nextElement();
|
||||
Enumeration<InetAddress> address = ni.getInetAddresses();
|
||||
while (address.hasMoreElements()) {
|
||||
ip = address.nextElement();
|
||||
if (!ip.isSiteLocalAddress()
|
||||
&& !ip.isLoopbackAddress()
|
||||
&& !ip.getHostAddress().contains(":")) {// 外网IP
|
||||
netip = ip.getHostAddress();
|
||||
finded = true;
|
||||
break;
|
||||
} else if (ip.isSiteLocalAddress()
|
||||
&& !ip.isLoopbackAddress()
|
||||
&& !ip.getHostAddress().contains(":")) {// 内网IP
|
||||
localip = ip.getHostAddress();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (netip != null && !"".equals(netip)) {
|
||||
return netip;
|
||||
} else {
|
||||
return localip;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user