Skip to content

Commit

Permalink
*remove HttpServletRequest import
Browse files Browse the repository at this point in the history
Signed-off-by: provenceee <[email protected]>
  • Loading branch information
provenceee committed Nov 13, 2024
1 parent afbc366 commit 40caf06
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 222 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,15 @@

import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.utils.LogUtils;
import com.huaweicloud.sermant.core.utils.ReflectUtils;

import java.io.PrintWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* DispatcherServlet 的 API接口增强 埋点定义sentinel资源
*
Expand All @@ -49,18 +48,18 @@ public class DispatcherServletInterceptor extends InterceptorSupporter {
* @param request 请求
* @return HttpRequestEntity
*/
private Optional<HttpRequestEntity> convertToHttpEntity(HttpServletRequest request) {
private Optional<HttpRequestEntity> convertToHttpEntity(Object request) {
if (request == null) {
return Optional.empty();
}
String uri = request.getRequestURI();
String uri = getRequestUri(request);
return Optional.of(new HttpRequestEntity.Builder()
.setRequestType(RequestType.SERVER)
.setPathInfo(request.getPathInfo())
.setPathInfo(getPathInfo(request))
.setServletPath(uri)
.setHeaders(getHeaders(request))
.setMethod(request.getMethod())
.setServiceName(request.getHeader(ConfigConst.FLOW_REMOTE_SERVICE_NAME_HEADER_KEY))
.setMethod(getMethod(request))
.setServiceName(getHeader(request, ConfigConst.FLOW_REMOTE_SERVICE_NAME_HEADER_KEY))
.build());
}

Expand All @@ -70,12 +69,12 @@ private Optional<HttpRequestEntity> convertToHttpEntity(HttpServletRequest reque
* @param request 请求信息
* @return headers
*/
private Map<String, String> getHeaders(HttpServletRequest request) {
final Enumeration<String> headerNames = request.getHeaderNames();
private Map<String, String> getHeaders(Object request) {
final Enumeration<String> headerNames = getHeaderNames(request);
final Map<String, String> headers = new HashMap<>();
while (headerNames.hasMoreElements()) {
final String headerName = headerNames.nextElement();
headers.put(headerName, request.getHeader(headerName));
headers.put(headerName, getHeader(request, headerName));
}
return Collections.unmodifiableMap(headers);
}
Expand All @@ -84,19 +83,19 @@ private Map<String, String> getHeaders(HttpServletRequest request) {
protected final ExecuteContext doBefore(ExecuteContext context) throws Exception {
LogUtils.printHttpRequestBeforePoint(context);
final Object[] allArguments = context.getArguments();
final HttpServletRequest argument = (HttpServletRequest) allArguments[0];
final Object request = allArguments[0];
final FlowControlResult result = new FlowControlResult();
final Optional<HttpRequestEntity> httpRequestEntity = convertToHttpEntity(argument);
final Optional<HttpRequestEntity> httpRequestEntity = convertToHttpEntity(request);
if (!httpRequestEntity.isPresent()) {
return context;
}
chooseHttpService().onBefore(className, httpRequestEntity.get(), result);
if (result.isSkip()) {
context.skip(null);
final HttpServletResponse response = (HttpServletResponse) allArguments[1];
final Object response = allArguments[1];
if (response != null) {
response.setStatus(result.getResponse().getCode());
response.getWriter().print(result.buildResponseMsg());
setStatus(response, result.getResponse().getCode());
getWriter(response).print(result.buildResponseMsg());
}
}
return context;
Expand All @@ -115,4 +114,39 @@ protected final ExecuteContext doThrow(ExecuteContext context) {
LogUtils.printHttpRequestOnThrowPoint(context);
return context;
}

private String getRequestUri(Object httpServletRequest) {
return getString(httpServletRequest, "getRequestURI");
}

private String getPathInfo(Object httpServletRequest) {
return getString(httpServletRequest, "getPathInfo");
}

private String getMethod(Object httpServletRequest) {
return getString(httpServletRequest, "getMethod");
}

private Enumeration<String> getHeaderNames(Object httpServletRequest) {
return (Enumeration<String>) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getHeaderNames")
.orElse(null);
}

private String getHeader(Object httpServletRequest, String key) {
return (String) ReflectUtils.invokeMethod(httpServletRequest, "getHeader", new Class[]{String.class},
new Object[]{key}).orElse(null);
}

private PrintWriter getWriter(Object httpServletRequest) {
return (PrintWriter) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getWriter")
.orElse(null);
}

private void setStatus(Object httpServletResponse, int code) {
ReflectUtils.invokeMethod(httpServletResponse, "setStatus", new Class[]{int.class}, new Object[]{code});
}

private String getString(Object object, String method) {
return (String) ReflectUtils.invokeMethodWithNoneParameter(object, method).orElse(null);
}
}
6 changes: 0 additions & 6 deletions sermant-plugins/sermant-monitor/monitor-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,6 @@
<version>${apache.dubbo.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.plugin.agent.interceptor.AbstractInterceptor;
import com.huaweicloud.sermant.core.utils.LogUtils;

import javax.servlet.http.HttpServletRequest;
import com.huaweicloud.sermant.core.utils.ReflectUtils;

/**
* HTTP拦截定义
Expand All @@ -51,7 +50,7 @@ public ExecuteContext after(ExecuteContext context) {
LogUtils.printHttpRequestAfterPoint(context);
return context;
}
String uri = ((HttpServletRequest) context.getArguments()[0]).getRequestURI();
String uri = getRequestUri(context.getArguments()[0]);
MetricCalEntity metricCalEntity = MonitorCacheUtil.getMetricCalEntity(uri);
metricCalEntity.getReqNum().incrementAndGet();
long startTime = (Long) context.getExtMemberFieldValue(START_TIME);
Expand All @@ -71,11 +70,15 @@ public ExecuteContext onThrow(ExecuteContext context) {
LogUtils.printHttpRequestOnThrowPoint(context);
return context;
}
String uri = ((HttpServletRequest) context.getArguments()[0]).getRequestURI();
String uri = getRequestUri(context.getArguments()[0]);
MetricCalEntity metricCalEntity = MonitorCacheUtil.getMetricCalEntity(uri);
metricCalEntity.getReqNum().incrementAndGet();
metricCalEntity.getFailedReqNum().incrementAndGet();
LogUtils.printHttpRequestOnThrowPoint(context);
return context;
}

private String getRequestUri(Object httpServletRequest) {
return (String) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getRequestURI").orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package com.huawei.registry.grace.declarers;

import com.huawei.registry.grace.interceptors.SpringWebHandlerInterceptor;
import com.huawei.registry.grace.interceptors.DispatcherServletInterceptor;

import com.huaweicloud.sermant.core.plugin.agent.declarer.AbstractPluginDeclarer;
import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer;
Expand All @@ -30,16 +30,16 @@
* @author zhouss
* @since 2022-05-23
*/
public class SpringWebHandlerDeclarer extends AbstractPluginDeclarer {
public class DispatcherServletDeclarer extends AbstractPluginDeclarer {
/**
* 增强类的全限定名
*/
private static final String ENHANCE_CLASS = "org.springframework.web.servlet.HandlerExecutionChain";
private static final String ENHANCE_CLASS = "org.springframework.web.servlet.DispatcherServlet";

/**
* 拦截类的全限定名
*/
private static final String INTERCEPT_CLASS = SpringWebHandlerInterceptor.class.getCanonicalName();
private static final String INTERCEPT_CLASS = DispatcherServletInterceptor.class.getCanonicalName();

@Override
public ClassMatcher getClassMatcher() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
* from the Apache Dubbo project.
*/

package com.huawei.registry.inject.grace;
package com.huawei.registry.grace.interceptors;

import com.huawei.registry.config.GraceConfig;
import com.huawei.registry.config.grace.GraceConstants;
Expand All @@ -30,79 +30,98 @@
import com.huawei.registry.context.RegisterContext.ClientInfo;
import com.huawei.registry.services.GraceService;

import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext;
import com.huaweicloud.sermant.core.plugin.config.PluginConfigManager;
import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager;
import com.huaweicloud.sermant.core.utils.ReflectUtils;
import com.huaweicloud.sermant.core.utils.StringUtils;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Spring Web请求前置拦截器, 由拦截器动态加入, 每次请求都会添加, {@link com.huawei.registry.grace.interceptors.SpringWebHandlerInterceptor}
* Spring Web请求拦截器
*
* @author zhouss
* @since 2022-05-23
*/
public class SpringRequestInterceptor implements HandlerInterceptor {
public class DispatcherServletInterceptor extends GraceSwitchInterceptor {
private final GraceService graceService;

private final GraceConfig graceConfig;

/**
* 构造方法
*/
public SpringRequestInterceptor() {
public DispatcherServletInterceptor() {
graceService = PluginServiceManager.getPluginService(GraceService.class);
graceConfig = PluginConfigManager.getPluginConfig(GraceConfig.class);
}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
public ExecuteContext doBefore(ExecuteContext context) {
if (GraceContext.INSTANCE.getStartWarmUpTime() == 0) {
GraceContext.INSTANCE.setStartWarmUpTime(System.currentTimeMillis());
}
Object[] arguments = context.getArguments();
Object request = arguments[0];
Object response = arguments[1];

addGraceAddress(request);
final GraceShutDownManager graceShutDownManager = GraceContext.INSTANCE.getGraceShutDownManager();
graceShutDownManager.increaseRequestCount();
if (graceShutDownManager.isShutDown() && graceConfig.isEnableGraceShutdown()) {
// 已被标记为关闭状态, 开始统计进入的请求数
final ClientInfo clientInfo = RegisterContext.INSTANCE.getClientInfo();
response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT,
addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT,
buildEndpoint(clientInfo.getIp(), clientInfo.getPort()));
response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT,
addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_ENDPOINT,
buildEndpoint(clientInfo.getHost(), clientInfo.getPort()));
response.addHeader(GraceConstants.MARK_SHUTDOWN_SERVICE_NAME, clientInfo.getServiceName());
addHeader(response, GraceConstants.MARK_SHUTDOWN_SERVICE_NAME, clientInfo.getServiceName());
}
return true;
return context;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
public ExecuteContext doAfter(ExecuteContext context) {
GraceContext.INSTANCE.getGraceShutDownManager().decreaseRequestCount();
return context;
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
public ExecuteContext doThrow(ExecuteContext context) {
GraceContext.INSTANCE.getGraceShutDownManager().decreaseRequestCount();
return context;
}

private String buildEndpoint(String host, int port) {
return host + ":" + port;
}

private void addGraceAddress(HttpServletRequest request) {
private void addGraceAddress(Object request) {
if (graceConfig.isEnableSpring() && graceConfig.isEnableGraceShutdown() && graceConfig.isEnableOfflineNotify()
&& GraceConstants.GRACE_OFFLINE_SOURCE_VALUE
.equals(request.getHeader(GraceConstants.GRACE_OFFLINE_SOURCE_KEY))) {
String address = request.getHeader(GraceConstants.SERMANT_GRACE_ADDRESS);
.equals(getHeader(request, GraceConstants.GRACE_OFFLINE_SOURCE_KEY))) {
String address = getHeader(request, GraceConstants.SERMANT_GRACE_ADDRESS);
if (StringUtils.isBlank(address)) {
address = request.getRemoteAddr() + ":" + request.getServerPort();
address = getRemoteAddr(request) + ":" + getServerPort(request);
}
graceService.addAddress(address);
}
}

private void addHeader(Object httpServletRequest, String key, String value) {
ReflectUtils.invokeMethod(httpServletRequest, "addHeader", new Class[]{String.class, String.class},
new Object[]{key, value});
}

private int getServerPort(Object httpServletRequest) {
return (int) ReflectUtils.invokeMethodWithNoneParameter(httpServletRequest, "getServerPort").orElse(0);
}

private String getRemoteAddr(Object httpServletRequest) {
return getString(httpServletRequest, "getRemoteAddr");
}

private String getHeader(Object httpServletRequest, String key) {
return (String) ReflectUtils.invokeMethod(httpServletRequest, "getHeader", new Class[]{String.class},
new Object[]{key}).orElse(null);
}

private String getString(Object object, String method) {
return (String) ReflectUtils.invokeMethodWithNoneParameter(object, method).orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ protected boolean isEnabled() {
* @return endpoint
*/
protected String buildEndpoint(String host, int port) {
return String.format(Locale.ENGLISH, "%s:%s", host, port);
return host + ":" + port;
}

/**
Expand Down
Loading

0 comments on commit 40caf06

Please sign in to comment.